MySQL主从复制(docker环境)

MySQL主从复制示例

1创建master容器3307:

docker run -d --name mysql-master  \
-p 3307:3306 \
--privileged=true \
-v /root/mysql-master/log:/var/log/mysql  \
-v /root/mysql-master/data:/var/lib/mysql  \
-v /root/mysql-master/conf:/etc/mysql/conf.d \
-e MYSQL_ROOT_PASSWORD=root \
mysql:5.7
  • master配置文件
cd /root/mysql-master/conf
vim my.cnf

[mysqld]
## 设置server_id,同一局域网中需要唯一
server_id=101
## 指定不需要同步的数据库名称
binlog-ignore-db=mysql
##开启二进制日志功能
log-bin=mall-mysql-bin
## 设置二进制日志使用内存大小(事务)
binlog_cache_size=1M
## 设置使用的二进制日志格式( mixed, statement,row)
# (mixed(混合模式,有系统函数自动采用row,普通数据采用statement),statement(只记录执行语句,数据量小,系统函数会导致数据不一致),row(记录每条数据,数据量大,导致并发日志))
binlog_format=mixed
## 二进制日志过期清理时间。默认值为0,表示不自动清理。
expire_logs_days=7
## 跳过主从复制中遇到的所有错误或指定类型的错误﹐避免slave端复制中断。
## 如∶1062错误是指一些主键重复,1032错误是因为主从数据库数据不一致
slave_skip_errors=1062
  • 重启master
// 重启
docker restart mysql-master
// 进入master容器
docker exec  -it mysql-master /bin/bash
// 连接MySQL
mysql -u root -p
// 创建slave账号密码  用于同步使用,%可以替换为固定ip
CREATE USER 'slave'@'%'IDENTIFIED BY '123456';
// 设置slave的权限
GRANT REPLICATION SLAVE,REPLICATION CLIENT ON *.* TO 'slave'@'%';
// 如果是MySQL8,需要在执行以下语句
ALTER USER 'slave'@'%' IDENTIFIED WITH mysql_native_password BY '123456';
// 刷新权限
flush privileges;

// 查看master主数据状态
mysql> show master status \G
*************************** 1. row ***************************
             File: mall-mysql-bin.000001
         Position: 154
     Binlog_Do_DB: 
 Binlog_Ignore_DB: mysql
Executed_Gtid_Set: 

2创建slave容器3308:

docker run -d --name mysql-slave \
-p 3308:3306 \
--privileged=true \
-v /root/mysql-slave/log:/var/log/mysql  \
-v /root/mysql-slave/data:/var/lib/mysql  \
-v /root/mysql-slave/conf:/etc/mysql/conf.d \
-e MYSQL_ROOT_PASSWORD=root \
mysql:5.7
  • slave配置文件
cd /root/mysql-slave/conf
vim my.cnf

[mysqld]
## 设置server_id,同一局域网中需要唯一
server_id=102
## 指定不需要同步的数据库名称
binlog-ignore-db=mysql
##开启二进制日志功能,开启二进制日志功能,以备Slave作为其它数据库实例的Master时使用
log-bin=mall-mysql-bin
## 设置二进制日志使用内存大小(事务)
binlog_cache_size=1M
## 设置使用的二进制日志格式( mixed, statement,row)
binlog_format=mixed
## 二进制日志过期清理时间。默认值为0,表示不自动清理。
expire_logs_days=7
## 跳过主从复制中遇到的所有错误或指定类型的错误﹐避免slave端复制中断。
## 如∶1062错误是指一些主键重复,1032错误是因为主从数据库数据不一致
slave_skip_errors=1062
## relay_log配置中继日志
relay_log=mall-mysql-relay-bin
## log_slave_updates表示slave将复制事件写进自己的二进制日志log_slave_updates=1
## slave设置为只读(具有super权限的用户除外)
read_only=1
  • 重启slave
// 重启
docker restart mysql-slave
// 进入slave容器
docker exec  -it mysql-slave /bin/bash
// 连接MySQL
mysql -u root -p
  • 运行配置slave同步主机
语法:
change master to master_host='宿主机ip', master_user='slave', master_password='123456', master_port=3307,master_log_file='mall-mysql-bin.000001', master_log_pos=154, master_connect_retry=30;
// 参数说明:
master_host:主数据库的IP地址;
master_port:主数据库的运行端口;
master_user:在主数据库创建的用于同步数据的用户账号;
master_password:在主数据库创建的用于同步数据的用户密码;
master_log_file:指定从数据库要复制数据的日志文件,[通过查看主数据的状态show master status \G,获取File参数;
master_log_pos:指定从数据库从哪个位置开始复制数据,通过查看主数据的状态show master status \G,获取Position参数;
master_connect_retry:连接失败重试的时间间隔,单位为秒。

// 执行slave连接master
mysql> change master to master_host='192.168.223.135', master_user='slave', master_password='123456', master_port=3307,master_log_file='mall-mysql-bin.000001', master_log_pos=154, master_connect_retry=30;
  • 在slave中查看主从同步状态
mysql> show slave status \G
*************************** 1. row ***************************
               Slave_IO_State: 
                  Master_Host: 192.168.223.135
                  Master_User: slave
                  Master_Port: 3307
                Connect_Retry: 30
              Master_Log_File: mall-mysql-bin.000001
          Read_Master_Log_Pos: 154
               Relay_Log_File: mall-mysql-relay-bin.000001
                Relay_Log_Pos: 4
        Relay_Master_Log_File: mall-mysql-bin.000001
             Slave_IO_Running: No 同步没有运行
            Slave_SQL_Running: No 同步没有运行
1 row in set (0.01 sec)
可以看到配置信息没问题,但还没有启动 因此需要开启同步
  • 在slave开启同步设置

start slave

  • slave停止主从同步

stop slave

  • 如果启动失败,则在slave执行以下操作,则删除之前的relay_log信息,然后重新执行change master to...操作

reset slave

  • 在slave中再次查看主从同步状态
mysql> show slave status \G
*************************** 1. row ***************************
               Slave_IO_State: Waiting for master to send event
                  Master_Host: 192.168.223.135
                  Master_User: slave
                  Master_Port: 3307
                Connect_Retry: 30
              Master_Log_File: mall-mysql-bin.000001
          Read_Master_Log_Pos: 154
               Relay_Log_File: mall-mysql-relay-bin.000002
                Relay_Log_Pos: 325
        Relay_Master_Log_File: mall-mysql-bin.000001
             Slave_IO_Running: Yes 同步有运行
            Slave_SQL_Running: Yes 同步有运行
  • 测试一波验证即可
posted @   zhuoxin  阅读(34)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?
点击右上角即可分享
微信分享提示