如果你遵从了上述说明,复制设置仍然不工作,首先检查下面各项:
· 检查错误日志的消息。许多用户遇到问题后没有及时地这样做而浪费了时间。
· 主服务器记录到了二进制日志?用SHOW MASTER STATUS检查。如果已经记录,Position应为非零。如果没有记录,确认正用log-bin和server-id选项运行主服务器。
· 是否从服务器在运行?使用SHOWSHOW SLAVE STATUS检查是否slave_IO_Running和slave_SQL_Running的值均为Yes。如果不是,验证当启动从服务器时使用的选项。
· 如果从服务器正在运行,建立了与主服务器的连接吗?使用SHOW PROCESSLIST,找出I/O和SQL线程并检查它们的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_INCREMENT或LAST_INSERT_ID(),n 值应为1。否则,值应为2。使用AUTO_INCREMENT或LAST_INSERT_ID()的语句使用值2的原因是它们从主服务器的二进制日志中取两个事件。
6. 如果你确保从服务器启动时完好地与主服务器同步,并且没有更新从服务器线程之外的表,则大概诧异是由于bug。如果你正运行最近的版本,请通报该问题。如果你正运行旧版本MySQL,尽力升级到最新的产品版本。