我有 5 个从服务器和 1 个主服务器的主/从复制。主服务器是 mysql 5.1.37,从服务器是 5.5.8。
两天前,其中一个从服务器停止工作。在“显示从服务器状态”中,我看到 IO 线程和 SQL 线程都在运行。IO 线程正在生成中继日志文件,但 SQL 线程未应用更改...“落后主服务器的秒数”显示为“0”,尽管我知道它落后很多(使用 mysqlbinlog 检查 binlog)。
其余所有从属设备均工作正常。
不知道要寻找什么(mysql 日志文件中没有错误,系统日志中也没有错误...)
有什么建议吗?请参见下面的从属状态输出
mysql> show slave status\G
*************************** 1. row ***************************
Slave_IO_State: Waiting for master to send event
Master_Host: master-db
Master_User: replication
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: mysql-bin.020839
Read_Master_Log_Pos: 56173153
Relay_Log_File: research-relay-bin.000002
Relay_Log_Pos: 252
Relay_Master_Log_File: mysql-bin.020828
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
Replicate_Do_DB: db1,db2,db3,db4
Replicate_Ignore_DB: db5,db6
Replicate_Do_Table:
Replicate_Ignore_Table:
Replicate_Wild_Do_Table:
Replicate_Wild_Ignore_Table:
Last_Errno: 0
Last_Error:
Skip_Counter: 0
Exec_Master_Log_Pos: 975734937
Relay_Log_Space: 10714389571
Until_Condition: None
Until_Log_File:
Until_Log_Pos: 0
Master_SSL_Allowed: No
Master_SSL_CA_File:
Master_SSL_CA_Path:
Master_SSL_Cert:
Master_SSL_Cipher:
Master_SSL_Key:
Seconds_Behind_Master: 0
Master_SSL_Verify_Server_Cert: No
Last_IO_Errno: 0
Last_IO_Error:
Last_SQL_Errno: 0
Last_SQL_Error:
Replicate_Ignore_Server_Ids:
Master_Server_Id: 300
答案1
MySQL 复制中有一些需要注意的地方
1)同时使用 replicate-do-db 和 replicate-ignore-db
页面上有流程图显示处理顺序。就我个人而言,我不会同时使用 replicate-do-db 和 replicate-ignore-db。我只会使用其中一个。如果其他从属服务器没有同样的问题,则排除此可能性。
2)执行 LOAD DATA INFILE
MySQL 复制处理它的方式令人震惊。每当在主服务器上执行 LOAD DATA INFILE 时,整个输入文件都会存放在主服务器的二进制日志中。从服务器在其中继日志中收集输入文件。从服务器在 /tmp 文件夹中重新实现数据文件,然后在从服务器上执行 LOAD DATA INFILE。在此过程中,这不算作复制滞后。作为 MySQL DBA,我知道这可行,但这太俗气了!!!
3)从站 IO 线程通信中断
有时,由于防火墙更改、网络路由或其他网络异常,从属 IO 线程可能会停止获取条目来填充其中继日志。您可能还想检查从属 IO 线程是否在主服务器的进程列表中可见。要确保您的从属 IO 线程处于活动状态,只需在所有从属服务器上执行以下操作:
SHOW SLAVE STATUS\G
注意 Relay_Log_Space。它应该在增长。如果它停止增长,MySQL 可能会因为另一个疯狂的原因而冻结而不出现错误,这导致了建议 #4。
4)从服务器磁盘空间不足
我写了一篇关于 MySQL 在执行 MyISAM 操作时如何冻结的文章MySQL 使用 MyISAM 表作为临时表。检查您的默认临时表目录(MySQL 中的 tmpdir 变量)
我希望这些建议有帮助!