docker安装MySQL8主从

目录

1.使用官方安装脚本自动安装docker(主从服务器都运行)

2.安装MySQL(主从服务器都运行)

1.拉取 MySQL 镜像

2.查看本地镜像

3.运行容器

4.通过 docker ps 命令查看是否安装成功:

5.开端口

6.进入docker的MySQL容器

7.登录mysql

3.开启主从设置

1.主服务器:

1.修改主的日志文件:

2.创建用于数据同步的用户

1.从服务器:

1.修改从的日志文件

2.执行

3.查看主从同步状态

1.NO,NO

2.使用start slave;开启主从复制过程

3.Connecting,Yes

4.Yes,Yes

4.错误整理

1.'caching_sha2_password' reported error: authentication

2.从服务器启动新同步线程时报错,怎么关闭之前的线程:

4.Access denied for user 'lzy'@ 192.168.231.130(using password:YES)

5.Can't connect to MySQL server on '192.168.231.138:3306' (110)


1.使用官方安装脚本自动安装docker(主从服务器都运行)

curl -fsSL https://get.docker.com | bash -s docker --mirror aliyun

启动 Docker。

sudo systemctl start docker

2.安装MySQL(主从服务器都运行)

1.拉取 MySQL 镜像

latest是最新版,可以根据自己需要去选择(链接) 

docker pull mysql:latest

2.查看本地镜像

使用以下命令来查看是否已安装了 mysql:

docker images

3.运行容器

以下命令来运行 mysql 容器|启动MySQL服务

docker run -itd --restart=always --name mysql -p 3306:3306 -e MYSQL_ROOT_PASSWORD=123456 mysql
  • -p 3306:3306 :映射容器服务的 3306 端口到宿主机的 3306 端口,外部主机可以直接通过 宿主机ip:3306 访问到 MySQL 的服务。
  • MYSQL_ROOT_PASSWORD=123456:设置 MySQL 服务 root 用户的密码。
  • --restart=always:关机重启。重启docker容器后,MySQL会自动启动。

拓展一点点:

docker run --name mysql --privileged=true -v /home/mysql/master-data:/var/lib/mysql -p 3306:3306 -e MYSQL_ROOT_PASSWORD=123456 -d mysql-slaver
在执行上述命令之后,docker首先会检测本地有没有目标镜像,即mysql-slaver,如果没有,则会下载该镜像,然后根据配置的参数运行该镜像。上述命令中各个参数的含义如下:

--name指定运行之后的容器的名称为mysql;
--privileged指定了当前容器是否真正的具有root权限,所谓的root权限是指具有宿主机的root权限,而不仅仅只是在容器内部有root权限;
-v指定了容器中指定目录挂载到宿主机上的某个目录,这样做的目的在于防止容器中配置的数据丢失,因为docker容器在重启之后是不会保留前一次在其内部运行的相关数据的;
-p表示宿主机上的某个端口映射到docker容器内的某个端口,这里也就是将宿主机的3306端口映射到容器内部的3306端口;
-e表示指定当前容器运行的环境变量,该变量一般在容器内部程序的配置文件中使用,而在外部运行容器指定该参数。这里的MYSQL_ROOT_PASSWORD表示容器内部的MySQL的启动密码;
-d参数指定了当前容器是在后台运行。

4.通过 docker ps 命令查看是否安装成功:

在master容器启动完成之后,我们通过docker ps命令即可看到这个运行的容器:

5.开端口

firewall-cmd --zone=public --add-port=3306/tcp --permanent
firewall-cmd --reload

6.进入docker的MySQL容器

docker exec -it mysql bash

其他方式:

# 通过容器id方式,这里的id就是上面docker ps中展示的id
docker exec -it fa4afaeb24c4 /bin/bash
# 通过容器名称方式,这里的名称就是创建容器时指定的名称,也就是mysql-master
docker exec -it mysql-master /bin/bash

7.登录mysql

mysql -u root -p

本地连接MySQL:

mysql -h 服务器IP -u root -p
mysql -h 192.168.231.138 -u root -p

3.开启主从设置

1.主服务器:

1.修改主的日志文件:

# 进入docker的MySQL容器中
docker exec -it mysql bash
# 修改配置文件
vi /etc/mysql/my.cnf

在 [mysqld] 节点最后加上:

server_id = 1
log-bin = mysql-bin(MySQL8默认开启,可以不写)

log-bin=mysql-bin 使用binary logging,mysql-bin是log文件名的前缀

server-id=1 唯一服务器ID,非0整数,不能和其他服务器的server-id重复

重启mysql服务

docker ps -a
docker stop CONTAINER ID   (选择mysql的 CONTAINER ID)
docker start CONTAINER ID   (选择mysql的 CONTAINER ID)

2.创建用于数据同步的用户

# CREATE USER '用户名'@'%' IDENTIFIED BY '密码';
CREATE USER 'lzy'@'%' IDENTIFIED BY '123456';
# GRANT REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO '用户名'@'%';
GRANT REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'lzy'@'%';

进入Master库mysql客户端:输入show master status;查看Master状态:

1.从服务器:

1.修改从的日志文件

# 进入docker的MySQL容器中
docker exec -it mysql bash
# 修改配置文件
vi /etc/mysql/my.cnf

在[mysqld]下添加内容

server_id=2
log-bin = mysql-bin(MySQL8默认开启,可以不写)

重启

docker ps -a
docker stop CONTAINER ID   (选择mysql的 CONTAINER ID)
docker start CONTAINER ID   (选择mysql的 CONTAINER ID)

2.执行

change master to master_host='192.168.231.138', master_user='lzy', master_password='123456', master_port=3306, master_log_file='binlog.000002', master_log_pos=708, master_connect_retry=30;

master_port:Master的端口号,指的是容器的端口号
master_user:用于数据同步的用户
master_password:用于同步的用户的密码
master_log_file:指定 Slave 从哪个日志文件开始复制数据,即上文中提到的 File 字段的值
master_log_pos:从哪个 Position 开始读,即上文中提到的 Position 字段的值
master_connect_retry:如果连接失败,重试的时间间隔,单位是秒,默认是60秒

3.查看主从同步状态

在从服务器中的mysql终端执行show slave status \G,查看主从同步状态。

1.NO,NO

Slave_IO_Running 和 Slave_SQL_Running是查看主从是否运行的关键字段,默认为NO,表示没有进行主从复制。

2.使用start slave;开启主从复制过程


然后再次查询主从同步状态show slave status \G;

3.Connecting,Yes

使用start slave开启主从复制过程后,如果SlaveIORunning一直是Connecting,则说明主从复制一直处于连接状态,这种情况一般是下面几种原因造成的(详情见第四步,错误整理),我们可以根据 Last_IO_Error提示予以排除。

 4.Yes,Yes

表示主从复制成功,可以进行测试,例如在navicat中主服务器上创建test数据库后,从服务器刷新后,也会出现该服务器。

4.错误整理

1.'caching_sha2_password' reported error: authentication

error connecting to master 'lzy@192.168.231.138:3306' - retry-time: 30 retries: 1 message: Authentication plugin 'caching_sha2_password' reported error: Authentication requires
验证插件“caching_sha2_password”报告错误:验证需要

修改一下master中lzy用户的plugin,从caching_sha2_password改为mysql_native_password即可

主:
查询
select user,host,plugin from mysql.user;
修改
update mysql.user set plugin ="mysql_native_password" where user = 'lzy' and host = '%';
刷新
flush privileges;

2.从服务器启动新同步线程时报错,怎么关闭之前的线程:

关闭
stop slave io_thread;
启动
change master to master_host='192.168.231.138', master_user='lzy', master_password='123456', master_port=3306, master_log_file='binlog.000006', master_log_pos=156, master_connect_retry=30;
启动slave同步进程:
start slave;

 或者:
stop slave;
启动
change master to master_host='192.168.231.138', master_user='lzy', master_password='123456', master_port=3306, master_log_file='binlog.000006', master_log_pos=156, master_connect_retry=30;
启动slave同步进程:
start slave;

重启231.140对应从服务器docker

# 停止docker
systemctl stop docker.socket
# 启动docker
systemctl start docker
不需要再启动MySQL了。因为MySQL配置了自动重启

4.Access denied for user 'lzy'@ 192.168.231.130(using password:YES)

重新认证主服务器的lzy用户的密码

5.Can't connect to MySQL server on '192.168.231.138:3306' (110)

没有开该服务器(这是我的MySQL主服务器)的端口,上面有步骤。或者用navicat连接数据库,我的是主报第三个错,重启docker解决的。

评论 18
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值