19.5.1.29 复制过程中的错误
如果语句在源和副本上都产生相同的错误(相同的错误代码),错误将被记录,但复制继续。
如果语句在源和副本上产生不同的错误,复制 SQL 线程终止,副本写入错误日志,并等待数据库管理员决定如何处理错误。这包括语句在源或副本上产生错误,但不是都产生错误的情况。要解决问题,手动连接到副本,确定问题的原因。 SHOW REPLICA STATUS
对于解决问题非常有用。然后,修复问题并运行 START REPLICA
。例如,您可能需要在重新启动副本之前创建一个不存在的表。
如果副本的错误日志中记录了临时错误,您不一定需要按照错误信息中的建议采取任何行动。临时错误应该由客户端重试事务。例如,如果复制 SQL 线程记录了与死锁相关的临时错误,您不需要在副本上手动重新启动事务,除非复制 SQL 线程随后终止并显示非临时错误信息。
如果这个错误代码验证行为不是可接受的,可以使用 --replica-skip-errors
选项来忽略某些错误。
对于非事务存储引擎,如 MyISAM
,可能会出现语句只部分更新表并返回错误代码的情况。这可以在多行插入语句中有一行违反键约束的情况下发生,也可以在长更新语句被杀死后更新了一些行的情况下发生。如果在源上发生这种情况,副本期望执行语句结果相同。如果不是,复制 SQL 线程将停止,如前所述。
如果您在源和副本之间复制使用不同的存储引擎,注意同一语句在不同的存储引擎版本上可能产生不同的错误。例如,自 MyISAM
忽略外键约束,插入或更新语句访问 InnoDB
表的源可能会导致外键违反错误,但在副本上执行相同语句可能不会产生错误,导致复制停止。
复制过滤规则首先被应用,之前对任何权限或行格式检查之前,使得可以过滤掉任何无效的事务;对于已经被过滤掉的事务,不会执行任何检查因此也不会出现错误。这意味着复制服务器可以接受该用户被授予访问的数据库部分(只要该部分的更新使用行基于的复制格式)。这可能在进行升级或迁移到使用管理表的系统或应用程序时非常有帮助,该系统或应用程序的 inbound 复制用户没有访问权限。请参见第19.2.5节,“服务器评估复制过滤规则”。