今天遇到 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
参考前还是建议先看错误日志,不建议直接照着帖子做。
欢迎来到这里!
我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。
注册 关于