4.4处理复制故障

如果您已经按照说明进行了操作,但复制设置没有工作,那么首先要做的是检查错误日志中的消息.许多用户因为在遇到问题后没有及时执行此操作而浪费了时间。

如果您无法从错误日志中判断出问题是什么,请尝试以下技术:

  • 验证源是否启用了二进制日志记录显示主机状态声明。默认情况下启用二进制日志记录。如果启用了二进制日志记录,位置是零。如果没有启用二进制日志记录,请确认没有使用禁用二进制日志记录的任何设置运行源程序,例如——skip-log-bin选择。

  • 验证server_id在源和副本上启动时设置system变量,并且ID值在每个服务器上都是唯一的。

  • 验证副本是否正在运行。使用显示副本状态检查是否Replica_IO_Running而且Replica_SQL_Running值都是是的.如果不是,请验证在启动复制服务器时使用的选项。例如,——skip-slave-start命令行选项,或者从MySQL 8.0.24的skip_slave_start系统变量,防止复制线程启动,直到您发出开始复制声明。

  • 如果副本正在运行,请检查副本是否与源端建立连接。使用显示PROCESSLIST,查找I/O和SQL线程并检查它们状态列查看它们显示的内容。看到第5.3节“复制线程”.如果I/O线程状态为连接到主机,检查以下内容:

    • 验证源端复制用户的权限。

    • 检查源的主机名是否正确,以及使用正确的端口连接到源。用于复制的端口与用于客户端网络通信的端口相同(默认为3306).对于主机名,请确保名称解析为正确的IP地址。

    • 检查配置文件中是否存在skip_networking已在源或副本上启用系统变量以禁用网络。如果是,注释设置或删除它。

    • 如果源有防火墙或IP过滤配置,请确保MySQL所使用的网口没有被过滤。

    • 检查您是否可以通过使用traceroute/路径跟踪程序到达宿主。

  • 如果副本以前正在运行但已经停止,原因通常是在源上成功的某些语句在副本上失败了。如果您已经对源进行了适当的快照,并且从未在复制线程之外修改副本上的数据,就不会发生这种情况。如果复制意外停止,则是一个错误,或者您遇到了中描述的已知复制限制之一第4.1节“复制特性和问题”.如果是bug,请查看第4.5节“如何报告复制错误或问题”,以了解如何报告。

  • 如果在源上成功运行的语句拒绝在副本上运行,如果通过删除副本的数据库并从源上复制一个新快照来进行完整的数据库重新同步是不可行的,则尝试以下步骤:

    1. 确定副本上受影响的表是否与源表不同。试着理解这是怎么发生的。然后使副本的表与源的表相同并运行开始复制

    2. 如果前面的步骤不起作用或不适用,请尝试了解手动进行更新(如果需要)是否安全,然后忽略来自源的下一个语句。

    3. 如果你决定副本可以跳过来自源的下一个语句,发出以下语句:

      mysql> SET GLOBAL sql_slave_skip_counter =N;mysql>启动SLAVE;或者从MySQL 8.0.26: MySQL > SET GLOBAL sql_replica_skip_counter =N;mysql>启动副本;

      的价值N如果来自源的下一个语句不使用AUTO_INCREMENTLAST_INSERT_ID ().否则,该值应为2。在语句中使用2的原因是AUTO_INCREMENTLAST_INSERT_ID ()它们在源的二进制日志中取两个事件。

      另请参阅SET GLOBAL sql_slave_skip_counter语句

    4. 如果您确信复制从一开始就与源完全同步,并且没有人在复制线程之外更新所涉及的表,那么这种差异可能是错误造成的。如果您正在运行MySQL的最新版本,请报告该问题。如果您正在运行较旧的版本,请尝试升级到最新的生产版本,以确定问题是否仍然存在。