Docker安装MySQL双主从复制
一、下载mysql镜像
略

二、主节点 my.cnf配置
[mysqld]
## 设置server_id,同一局域网中需要唯一
server_id=1
## 指定不需要同步的数据库名称
binlog-ignore-db=mysql
## 开启二进制日志功能
log-bin=mysql-bin
## 设置二进制日志使用内存大小(事务)
binlog_cache_size=1M
## 设置使用的二进制日志格式(mixed,statement,row)
binlog_format=mixed
## 二进制日志过期清理时间。默认值为0,表示不自动清理。
expire_logs_days=7
## 跳过主从复制中遇到的所有错误或指定类型的错误,避免slave端复制中断。
## 如:1062错误是指一些主键重复,1032错误是因为主从数据库数据不一致
slave_skip_errors=1062
gtid_mode=ON
enforce_gtid_consistency=ON
二、从节点my.cnf配置
[mysqld]
## 设置server_id,同一局域网中需要唯一
server_id=102
## 指定不需要同步的数据库名称
binlog-ignore-db=mysql
## 设置 需要同步的数据库名称,不设置代表同步所有的数据库
# binlog-do-db=sms_test,nacos_config,rcs_cloud
## 开启二进制日志功能,以备Slave作为其它数据库实例的Master时使用
log-bin=mysql-bin-slave1
## 设置二进制日志使用内存大小(事务)
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=mysql-relay-bin
## log_slave_updates表示slave将复制事件写进自己的二进制日志
log_slave_updates=1
## slave设置为只读(具有super权限的用户除外)
#read_only=1
gtid_mode=ON
enforce_gtid_consistency=ON
三、docker-compose.yml配置
version: '3.9'
services:
mysql-master:
image: mysql:8.0
container_name: mysql-master
environment:
MYSQL_ROOT_PASSWORD: 123456
MYSQL_USER: sync
MYSQL_PASSWORD: 123456
volumes:
- /container/mnt/mysql/master/conf:/etc/mysql/conf.d
- /container/mnt/mysql/master/data:/var/lib/mysql
ports:
- "6311:3306"
networks:
- mysql-network
restart: always
mysql-slave:
image: mysql:8.0
container_name: mysql-slave
environment:
MYSQL_ROOT_PASSWORD: 123456
MYSQL_USER: sync
MYSQL_PASSWORD: 123456
volumes:
- /container/mnt/mysql/slave/conf:/etc/mysql/conf.d
- /container/mnt/mysql/slave/data:/var/lib/mysql
ports:
- "6312:3306"
networks:
- mysql-network
restart: always
networks:
mysql-network:
driver: bridge
四、启动mysql-master,mysql-slave容器
docker compose up -d
五、为mysql-master主节点设置同步用户
create user 'slave'@'%' identified by '123456' ;
GRANT REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'slave'@'%';
更换登录验证方式,不然从节点连接会报错
alter user 'slave'@'%' IDENTIFIED with mysql_native_password by '123456' ;
六、查看主节点相关信息
show master status;

七、从节点设置主节点信息
change master to master_host='dbhost_IP', master_user='slave', master_password='123456', master_port=6311, master_log_file='mysql-bin.000003', master_log_pos=996, master_connect_retry=30;
开始同步
start slave;
show slave status \G;

八,在主节点更新数据,从节点是否也会同步

九、从节点反过来成为主节点
1.登录从节点添加用户
create user 'slave'@'%' identified by '123456' ;
GRANT REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'slave'@'%';
更换登录验证方式,不然从节点连接会报错
alter user 'slave'@'%' IDENTIFIED with mysql_native_password by '123456' ;
2.查看从节点主机master状态
show master status;

3.登录之前的主节点
设置主节点的binlog记录
change master to master_host='117.186.142.242', master_user='slave', master_password='123456', master_port=6312, master_log_file='mysql-bin-slave1.000004', master_log_pos=44491, master_connect_retry=30;
4.启动从节点同步
start slave;
5.查看从节点同步情况
show slave status \G;
注意:如果主节点无法同步从节点,可以重启mysql的主从容器
可能出现的问题:
IO_STARGING: NO
可能是由于从库没有正常启动、或者正常配置导致
IO_STARGING: Connecting
指定的主机网络不通、同步用户权限不足、同步用户验证方式错误等,都有可能导致无法连接主库
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 从HTTP原因短语缺失研究HTTP/2和HTTP/3的设计差异
· 三行代码完成国际化适配,妙~啊~