Docker 部署Mysql 主从复制
Mysql(9.2) 主从复制
1. 创建主数据库容器
docker run -p 3308:3306 --privileged=true -v D:\docker_data\mysql_master\mysql_files:/var/log/mysql_files -v D:\docker_data\mysql_master\log:/var/log/mysql -v D:\docker_data\mysql_master\data:/var/lib/mysql -v D:\docker_data\mysql_master\cnf:/etc/mysql/conf.d -e MYSQL_ROOT_PASSWORD=123456 --name mysql_master -d mysql
# 查看容器是否创建成功
docker ps
2. 配置主数据库my.cnf
在映射路径下创建my.cnf文件并编辑
[mysqld]
## 设置server_id,同一局域网中需要唯一
server_id=1
## 指定不需要同步的数据库名称
binlog-ignore-db=mysql
## 开启二进制日志功能
log-bin=mall-mysql-bin
## 设置二进制日志使用内存大小(事务)
binlog_cache_size=1M
## 设置使用的二进制日志格式(mixed,statement,row)
binlog_format=mixed
## 二进制日志过期清理时间。
## binlog_expire_logs_seconds=2592000
## 跳过主从复制中遇到的所有错误或指定类型的错误,避免slave端复制中断。
## 如:1062错误是指一些主键重复,1032错误是因为主从数据库数据不一致
slave_skip_errors=1062
3. 重启docker
docker restart mysql_master
4. 授权
进入主数据库容器中
docker exec -it mysql_master mysql -uroot -p123456
查看my.cnf文件是否生效
SHOW VARIABLES LIKE 'server_id';
-- 创建复制账户
CREATE USER 'slave'@'%' IDENTIFIED BY '123456';
GRANT REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'slave'@'%';
-- 查看状态 记录下 File 和 Position 值
SHOW BINARY LOG STATUS\G
5 创建从数据库容器
docker run -p 3309:3306 --privileged=true -v D:\docker_data\mysql_slave\mysql_files:/var/log/mysql_files -v D:\docker_data\mysql_slave\log:/var/log/mysql -v D:\docker_data\mysql_slave\data:/var/lib/mysql -v D:\docker_data\mysql_slave\cnf:/etc/mysql/conf.d -e MYSQL_ROOT_PASSWORD=123456 --name mysql_slave -d mysql
6. 配置从数据库my.cnf
在映射路径下创建my.cnf文件并编辑
[mysqld]
## 设置server_id,同一局域网中需要唯一
server_id=2
## 指定不需要同步的数据库名称
binlog-ignore-db=mysql
## 开启二进制日志功能,以备Slave作为其它数据库实例的Master时使用
log-bin=mall-mysql-slave1-bin
## 设置二进制日志使用内存大小(事务)
binlog_cache_size=1M
## 设置使用的二进制日志格式(mixed,statement,row)
binlog_format=mixed
## 二进制日志过期清理时间。
## binlog_expire_logs_seconds=2592000
## 跳过主从复制中遇到的所有错误或指定类型的错误,避免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
7. 重启docker
docker restart mysql_slave
8. 启动复制
进入从数据库容器中
docker exec -it mysql_slave mysql -uroot -p123456
查看my.cnf文件是否生效
SHOW VARIABLES LIKE 'server_id';
– 配置主库连接(使用 SOURCE 替代 MASTER)
CHANGE REPLICATION SOURCE TO
# 宿主机id
SOURCE_HOST='192.168.82.44',
SOURCE_PORT=3308,
SOURCE_USER='slave',
SOURCE_PASSWORD='123456',
SOURCE_LOG_FILE='mall-mysql-bin.000001',
SOURCE_LOG_POS=158,
# 拷贝主数据库的公钥(在/var/lib/mysql目录下)到从数据库
SOURCE_PUBLIC_KEY_PATH='/var/log/mysql_files/public_key.pem';
-- 启动复制(新命令)
START REPLICA;
-- 查看复制状态(新命令)
SHOW REPLICA STATUS\G
下面两个值都是Yes,说明主从已经配置成功
Replica_IO_Running Yes
Replica_SQL_Running Yes
9. 主库添加数据测试
注💡:
如果my.cnf配置不生效,可能是my.cnf的权限过高
修改my.cnf的权限, 然后重启容器
# 查看权限
ls -l /etc/mysql/conf.d/my.cnf
# 修改权限
chmod 644 /etc/mysql/conf.d/my.cnf