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 同步有运行
- 测试一波验证即可