使用Docker进行MySql8.0主从配置

MySQL单机配置

拉取&启动容器

docker run -d \
--name mysql \
--privileged=true \
-v /usr/local/mysql/data:/var/lib/mysql \
-v /usr/local/mysql/conf:/etc/mysql/ \
-v /usr/local/mysql/log:/var/log/mysql \
-v /usr/local/mysql/mysql-files:/var/lib/mysql-files/ \
-e MYSQL_ROOT_PASSWORD=123456 \
-p 3306:3306 \
mysql

默认拉取的最新版是mysql8

docker 镜像:https://hub.docker.com/_/mysql?tab=tags

配置mysql

在/usr/local/mysq/conf目录下添加文件:my.cnf

[client]
default-character-set=utf8mb4
[mysqld]
# 指定认证插件
authentication_policy=mysql_native_password
  1. mysql8服务端默认编码格式:utf8mb4,所以字符编码可以不设置。
  2. 身份认证插件:在mysql5.7中插件为"mysql_navtive_password",而在mysql8使用的插件是" caching_sha2_password",为了避免客户端连接时出现问题,所以需要设置一下。

重新启动Mysql

docker restart mysql

进入容器

docker exec -it mysql bin/bash

进入容器内的MySQL

mysql -uroot -p123456

MySQL主从配置

MySQL Master

Docker设置

指定宿主机端口为:13306

docker run -d \
--name mysql-master-13306 \
--privileged=true \
-v /usr/local/mysql-master/data:/var/lib/mysql \
-v /usr/local/mysql-master/conf:/etc/mysql/ \
-v /usr/local/mysql-master/log:/var/log/mysql \
-v /usr/local/mysql-master/mysql-files:/var/lib/mysql-files/ \
-e MYSQL_ROOT_PASSWORD=123456 \
-p 13306:3306 \
 mysql

配置文件

在/usr/local/mysql-master/conf中添加配置文件:my.cnf

[client]
default-character-set=utf8mb4

[mysqld]
## serverId,局域网内唯一
server_id=01

## 开启二进制日志功能
log-bin=ms-mysql-bin

## 指定不需要同步的数据库名称, 可指定多个
binlog-ignore-db=mysql
binlog-ignore-db=sys
binlog-ignore-db=information_schema
binlog-ignore-db=performance_schema


## 指定同步的数据库,可指定多个
binlog-do-db=db01
binlog-do-db=db02

## 二进制日志使用内存大小(事务)
binlog_cache_size=1M

## 二进制日志格式(mixed, statement,row)
# statement: 将写操作语句添加到binlog,然后在slave机运行。缺点:语句中有now()时,会造成数据不一致
# row: 记录每一行的改变,然后在slave机更新。缺点:批量更新时,会在slave机执行大量update
# mixed: 有类似now()这种会造成数据不一致的函数时,使用row模式,否则还是使用statement模式。
binlog_format=mixed

## 二进制日志过期清理时间,默认2592000秒(30天),604800秒(7天)
binlog_expire_logs_seconds=604800

## 跳过主从复制中遇到的所有错误或指定类型的错误,避免slave复制中断
replica_skip_errors=1062

# 指定认证插件
authentication_policy=mysql_native_password

重启Master

docker restart mysql-master-13306

添加备份用户

进入MySQL

CREATE USER 'slave'@'%' identified by 'backup';
GRANT REPLICATION SLAVE ON *.* TO 'slave'@'%';
FLUSH PRIVILEGES;

在mysql5.7中,可使用一条语句来创建用户和赋:GRANT REPLICATION SLAVE ON . TO ‘slave’@’%’ IDENTIFIED BY ‘backup’;

在mysql8中貌似会报错,将创建用户和赋权语句分开就可以。

查看&记录Master状态

mysql> show master status \G;
*************************** 1. row ***************************
             File: ms-mysql-bin.000003
         Position: 1535
     Binlog_Do_DB: 
 Binlog_Ignore_DB: mysql
Executed_Gtid_Set: 
1 row in set (0.01 sec)

重点:

  1. File: ms-mysql-bin.000003
  2. Position: 1535

MySQL Slave

Docker设置

指定宿主机端口为:13307

docker run -d \
--name mysql-slave-13307 \
--privileged=true \
-v /usr/local/mysql-slave/data:/var/lib/mysql \
-v /usr/local/mysql-slave/conf:/etc/mysql/ \
-v /usr/local/mysql-slave/log:/var/log/mysql \
-v /usr/local/mysql-slave/mysql-files:/var/lib/mysql-files/ \
-e MYSQL_ROOT_PASSWORD=123456 \
-p 13307:3306 \
 mysql

配置文件

在/usr/local/mysql-slave/conf中添加配置文件:my.cnf

[client]
default-character-set=utf8mb4

[mysqld]
## serverId,局域网内唯一
server_id=11

## 指定不需要同步的数据库名称
binlog-ignore-db=mysql

## 开启二进制日志功能
log-bin=ms-mysql-slave11-bin

## 二进制日志使用内存大小(事务)
binlog_cache_size=1M

## 二进制日志格式(mixed, statement,row)
binlog_format=mixed

## 二进制日志过期清理时间,默认2592000秒(30天),604800秒(7天)
binlog_expire_logs_seconds=604800

## 跳过主从复制中遇到的所有错误或指定类型的错误,避免slave复制中断
replica_skip_errors=1062

## relay_log配置slave的中继日志
relay_log=ms-mysql-relay-bin

## 将复制事件写进自己的二进制日志
log_slave_updates=1

## 设置为只读(super权限用户除外)
read_only=1

# 指定认证插件
authentication_policy=mysql_native_password

重启slave容器

docker restart mysql-slave-13307

查看slave状态

进入slave

show slave status;

此时,通常是啥信息也没有。

将slave连接到master

# 停止slave
stop slave;

# 如果原来做过主从复制,可能还需要执行以下命令
## reset master;

# 连接到master
# master_log_file和 master_log_pos的值参考master机状态查询的结果:
change master to master_host='192.168.10.121', master_user='slave', master_password='backup', master_port=13306,master_log_file='ms-mysql-bin.000003',master_log_pos=1535,master_connect_retry=30;

# 启动slave
start slave;

参数说明:

  1. master_host: master机IP,也就是宿主机IP
  2. master_port: master端口,docker配置时,master对外端口
  3. master_user: 用于同步的账号
  4. master_password: 用于同步的密码
  5. master_log_file:指定slave要复制的master数据日志文件
  6. master_log_pos:指定从哪个位置开始复制
  7. master_connect_retry: 连接失败时,重试时间间隔,单位:秒

查看slave状态

show slave status \G;
*************************** 1. row ***************************
               Slave_IO_State: Waiting for source to send event
                  Master_Host: 192.168.10.121
                  Master_User: slave
                  Master_Port: 13306
                Connect_Retry: 30
              Master_Log_File: ms-mysql-bin.000003
          Read_Master_Log_Pos: 828
               Relay_Log_File: ms-mysql-relay-bin.000002
                Relay_Log_Pos: 327
        Relay_Master_Log_File: ms-mysql-bin.000003
             Slave_IO_Running: Yes
            Slave_SQL_Running: Yes
              Replicate_Do_DB: 
            ..........

重点:

  1. Slave_IO_Running: Yes
  2. Slave_SQL_Running: Yes

当两个值都为“Yes”时,说明连接成功,可在Master机上进行数据操作,而后在slave机看到数据同步效果。

其他

如果查询slave 状态时,Slave_IO_Running的值一直是Connecting,有可能是账号密码问题或者权限问题,一般在下面可看到提示,例如:

Last_IO_Error: error connecting to master 'slave@192.168.10.121:13306' - retry-time: 30 retries: 1 message: Authentication plugin 'caching_sha2_password' reported error: Authentication requires secure connection.

根据提示调整即可。

  • 2
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值