如果您已经按照说明操作了,但是复制设置没有工作,那么首先要做的是检查错误日志中的消息.许多用户在遇到问题后没有尽快这样做,从而浪费了时间。
如果您无法从错误日志中判断出问题是什么,请尝试以下技术:
命令来验证源是否启用了二进制日志记录
显示主机状态
声明。默认情况下启用二进制日志记录。如果启用了二进制日志记录,位置
是零。如果没有启用二进制日志记录,请验证您没有使用任何禁用二进制日志记录的设置运行源代码,例如——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(应用程序)线程并检查它们状态
列以查看它们显示的内容。看到17.2.3节,“复制线程”.如果接收线程状态为连接到主机
,检查以下内容:验证源上复制用户的权限。
检查源的主机名是否正确,并且使用了正确的端口连接到源。用于复制的端口与用于客户端网络通信的端口相同(默认为
3306
).对于主机名,请确保主机名解析为正确的IP地址。检查配置文件
skip_networking
源或副本上已启用系统变量以禁用组网。如果是,评论设置或删除它。如果源有防火墙或IP过滤配置,请确保用于MySQL的网口没有被过滤。
检查您是否可以通过使用到达源
平
或traceroute
/路径跟踪程序
到达宿主。
如果副本之前正在运行但已经停止,原因通常是某些在源上成功的语句在副本上失败了。如果您已经对源进行了适当的快照,并且从未在复制线程之外修改副本上的数据,那么这种情况就不会发生。如果副本意外停止,则是错误或您遇到了中描述的已知复制限制之一17.5.1节“复制特性和问题”.如果是bug,请看第17.5.5节,“如何报告复制错误或问题”,以了解如何举报。
如果在源上成功的语句拒绝在副本上运行,如果通过删除副本的数据库并从源上复制一个新快照来进行完全的数据库重新同步是不可行的,那么尝试以下步骤:
确定副本上受影响的表是否与源表不同。试着理解这是怎么发生的。然后使副本的表与源的表相同并运行
开始复制
.如果前面的步骤不起作用或不适用,请尝试了解手动进行更新(如果需要)是否安全,然后忽略来自源的下一条语句。
如果你决定副本可以跳过源的下一个语句,发出以下语句:
mysql> SET GLOBAL sql_slave_skip_counter =N;mysql> START SLAVE;或者从MySQL 8.0.26: MySQL > SET GLOBAL sql_replica_skip_counter =N;mysql>启动副本
的价值
N
如果源的下一个语句不使用,应该是1吗AUTO_INCREMENT
或LAST_INSERT_ID ()
.否则,该值应为2。对于使用。的语句使用值2的原因AUTO_INCREMENT
或LAST_INSERT_ID ()
就是在源的二进制日志中记录两个事件。如果您确信副本开始时与源完全同步,并且没有人在复制线程之外更新所涉及的表,那么这种差异可能是错误的结果。如果您正在运行MySQL的最新版本,请报告该问题。如果您正在运行旧版本,请尝试升级到最新的生产版本,以确定问题是否仍然存在。