如果语句在源和副本上产生相同的错误(相同的错误代码),则会记录错误,但复制会继续。
如果语句在源和副本上产生不同的错误,复制 SQL 线程终止,副本将一条消息写入其错误日志并等待数据库管理员决定如何处理错误。这包括语句在源或副本上产生错误的情况,但不会在两者上产生错误。要解决该问题,请手动连接到副本并确定问题的原因。
SHOW
REPLICA STATUS
(或在 MySQL 8.0.22 之前
SHOW SLAVE
STATUS
)对此很有用。然后修复问题并运行START
REPLICA
(或MySQL 8.0.22之前,
START
SLAVE
)。例如,您可能需要先创建一个不存在的表,然后才能再次启动副本。
如果副本的错误日志中记录了临时错误,则您不必采取引用的错误消息中建议的任何操作。临时错误应该由客户端重试交易来处理。例如,如果复制 SQL 线程记录了与死锁相关的临时错误,则不需要在副本上手动重新启动事务,除非复制 SQL 线程随后终止并出现非临时错误消息。
--slave-skip-errors
如果不需要此错误代码验证行为,则可以使用该选项
屏蔽(忽略)部分或所有错误
。
对于诸如 之类的非事务性存储引擎
MyISAM
,可能有一条语句仅部分更新表并返回错误代码。例如,这可能发生在有一行违反键约束的多行插入上,或者如果在更新某些行后终止了长更新语句。如果这种情况发生在源上,则副本预计语句的执行会导致相同的错误代码。如果没有,复制 SQL 线程将停止,如前所述。
如果您在源和副本上使用不同存储引擎的表之间进行复制,请记住,当针对一个版本的表而不是另一个版本运行时,相同的语句可能会产生不同的错误,或者可能会导致一个错误表的版本,而不是另一个。例如,由于MyISAM
忽略了外键约束,访问源上的表的INSERT
or
UPDATE
语句
InnoDB
可能会导致外键违规,但在
MyISAM
副本上对同一表的某个版本执行的相同语句不会产生此类错误,从而导致复制停止。
从 MySQL 8.0.31 开始,首先应用复制过滤规则,然后再进行任何权限或行格式检查,从而可以过滤掉任何未通过验证的事务;不执行任何检查,因此不会为已过滤掉的交易引发错误。这意味着副本只能接受给定用户已被授予访问权限的那部分数据库(只要对这部分数据库的任何更新都使用基于行的复制格式)。这在执行升级或迁移到使用入站复制用户无权访问的管理表的系统或应用程序时可能会有所帮助。也可以看看第 17.2.5 节,“服务器如何评估复制过滤规则”。