今天遇到 mysql 主主同步复制失败的问题,记录下解决办法
mysql 主主复制基础可以参考这篇:https://www.cnblogs.com/kristain/articles/4142970.html
注意下文中 mysql 版本比较老,现在新版版本支持了很多新的特性。笔者用的 mysql 版本是 5.7。
问题描述:
DB1 和 DB2 设置了主主复制,在 DB1 上新建数据库后,在 DB2 上没有同步。查看 DB2 的 slave 状态 show slave status\G;
mysql> show slave status\G; *************************** 1. row *************************** Slave_IO_State: Waiting for master to send event Master_Host: 172.16.82.40 Master_User: root Master_Port: 3300 Connect_Retry: 60 Master_Log_File: mysql-bin.000002 //同步文件 Read_Master_Log_Pos: 48527 //同步位置 Relay_Log_File: WRD02-relay-bin.000003 Relay_Log_Pos: 58655 Relay_Master_Log_File: mysql-bin.000003 Slave_IO_Running: NO //io状态 Slave_SQL_Running: NO //sql状态 Replicate_Do_DB: smp,sdp,crm,webrtcgw,rtc
与 DB1 的 master 状态对比,show master status;
mysql> show master status; +------------------+----------+--------------------------+------------------+-------------------+ | File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set | +------------------+----------+--------------------------+------------------+-------------------+ | mysql-bin.000003 | 162880 | smp,sdp,crm,webrtcgw,rtc | | | +------------------+----------+--------------------------+------------------+-------------------+ 1 row in set (0.01 sec)
可以看到 DB1 上的 bin-log 已经记录到了 mysql-bin.000003 的 162880 位置,但是 DB2 上只是同步到了 mysql-bin.000002 的 48527 位置,并且 Slave_IO_Running 和 Slave_SQL_Running 都为 NO,说明 DB2 的同步功能不正常。
同样的方法查看 DB1,发现 DB1 的同步状态为:
mysql> show slave status\G; *************************** 1. row *************************** Slave_IO_State: Waiting for master to send event Master_Host: 172.16.82.41 Master_User: root Master_Port: 3300 Connect_Retry: 60 Master_Log_File: mysql-bin.000004 Read_Master_Log_Pos: 85486 Relay_Log_File: WRD01-relay-bin.000010 Relay_Log_Pos: 27380 Relay_Master_Log_File: mysql-bin.000004 Slave_IO_Running: Yes Slave_SQL_Running: Yes Replicate_Do_DB: smp,sdp,crm,webrtcgw,rtc
同步状态正常且与 DB2 的 master 状台一致:
mysql> show master status; +------------------+----------+--------------------------+------------------+-------------------+ | File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set | +------------------+----------+--------------------------+------------------+-------------------+ | mysql-bin.000004 | 85486 | smp,sdp,crm,webrtcgw,rtc | | | +------------------+----------+--------------------------+------------------+-------------------+ 1 row in set (0.01 sec)
所以问题只出现在 DB2 上,先关闭 slave 再重启试试:
stop slave;
start slave;
查看 show slave status\G;发现正在连接
Slave_IO_Running: CONNECTING Slave_SQL_Running: Yes
过会再查看还是两个 NO,这时候需要关闭 slave 手动同步,执行:
stop slave; CHANGE MASTER TO MASTER_HOST='172.16.82.40', MASTER_USER='root', MASTER_PASSWORD='cinCC1234', MASTER_LOG_FILE='mysql-bin.000003', MASTER_LOG_POS=162880; start slave
查看 show slave status\G;发现状态正常。
mysql> show slave status\G; *************************** 1. row *************************** Slave_IO_State: Waiting for master to send event Master_Host: 172.16.82.40 Master_User: root Master_Port: 3300 Connect_Retry: 60 Master_Log_File: mysql-bin.000003 Read_Master_Log_Pos: 162880 Relay_Log_File: WRD02-relay-bin.000003 Relay_Log_Pos: 58655 Relay_Master_Log_File: mysql-bin.000003 Slave_IO_Running: Yes Slave_SQL_Running: Yes Replicate_Do_DB: smp,sdp,crm,webrtcgw,rtc
在 DB1 上修改数据库,DB2 同步正常。
PS:
记一下修改 my.cnf 时候启动报错 The server quit without updating PID file
,解决办法:
查看 my.cnf 中 log_error=/home/mysql/data/log_error,查看 log_error.err 中的具体报错信息,发现是 my.cnf 配置的一个变量名写错了,改了就行。
更多解决办法参考:https://www.jb51.net/article/48625.htm
参考前还是建议先看错误日志,不建议直接照着帖子做。
欢迎来到这里!
我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。
注册 关于