6.10. 复制故障诊断与排除

如果你遵从了上述说明,复制设置仍然不工作,首先检查下面各项:

·         检查错误日志的消息。许多用户遇到问题后没有及时地这样做而浪费了时间。

·         主服务器记录到了二进制日志?用SHOW MASTER STATUS检查。如果已经记录,Position应为非零。如果没有记录,确认正用log-binserver-id选项运行主服务器。

·         是否从服务器在运行?使用SHOWSHOW SLAVE STATUS检查是否slave_IO_Runningslave_SQL_Running的值均为Yes。如果不是,验证当启动从服务器时使用的选项。

·         如果从服务器正在运行,建立了与主服务器的连接吗?使用SHOW PROCESSLIST,找出I/OSQL线程并检查它们的State列看它们如何显示。参见6.3节,“复制实施细节”。如果I/O线程状态为Connecting to master,验证主服务器上复制用户的权限、主服务器主机名、DNS设置,是否主服务器真正在运行,以及是否可以从从属服务器访问。

·         如果从服务器以前在运行但是现在已经停止,原因通常是在主服务器上成功的部分语句在从服务器上失败了。如果你正确快照了主服务器,并且从来没有不通过服务器线程修改从服务器上的数据,这种现象不应发生。如果发生,应为一个bug或你遇到了一个6.7节,“复制特性和已知问题” 描述的已知的复制限制。如果是一个bug,参见6.11节,“通报复制缺陷”查阅如何通报的说明。

·         如果某个在主服务器上成功的语句拒绝在从服务器上运行,并且不能执行完全的数据库重新同步(即删除从服务器的数据库并从主服务器复制新的快照),尝试:

1.    确定是否从服务器的表与主服务器的不同。尽力了解发生的原因。然后让从服务器的表与主服务器的一样并运行START SLAVE

2.    如果前面的步骤不工作或不适合,尽力了解手动更新是否安全(如果需要),然后忽视来自主服务器的下一个语句。

3.    如果你确定可以跳过来自主服务器的下一个语句,执行下面的语句:

4.                  mysql> SET GLOBAL SQL_slave_SKIP_COUNTER = n
5.                  mysql> START SLAVE

如果来自主服务器的下一个语句不使用AUTO_INCREMENTLAST_INSERT_ID()n 值应为1。否则,值应为2。使用AUTO_INCREMENTLAST_INSERT_ID()的语句使用值2的原因是它们从主服务器的二进制日志中取两个事件。

6.    如果你确保从服务器启动时完好地与主服务器同步,并且没有更新从服务器线程之外的表,则大概诧异是由于bug。如果你正运行最近的版本,请通报该问题。如果你正运行旧版本MySQL,尽力升级到最新的产品版本。

关注编程学问公众号