如果对 PRIVILEGE_CHECKS_USER
帐户的权限检查失败,则不会执行该事务,并且该通道的复制将停止。错误的详细信息以及最后一个应用的事务记录在性能模式 replication_applier_status_by_worker
表中。请按照以下步骤从错误中恢复
确定导致错误的复制事件,并验证该事件是否预期且来自可信来源。您可以使用 mysqlbinlog 检索并显示在错误发生时间周围记录的事件。有关操作说明,请参见 第 9.5 节,“时间点(增量)恢复”。
如果复制事件不是预期事件或来自未知或不可信来源,请调查原因。如果您能够确定事件发生的原因,并且没有安全问题,请按照以下步骤修复错误。
如果
PRIVILEGE_CHECKS_USER
帐户应该被允许执行该事务,但配置错误,请向该帐户授予缺少的权限,使用FLUSH PRIVILEGES
语句,或执行 mysqladmin flush-privileges 或 mysqladmin reload 命令重新加载授权表,然后重新启动该通道的复制。如果需要执行该事务,并且您已验证该事务是可信的,但
PRIVILEGE_CHECKS_USER
帐户通常不应该拥有此权限,您可以暂时向PRIVILEGE_CHECKS_USER
帐户授予所需的权限。在复制事件应用后,从该帐户中删除权限,并采取必要的措施以确保如果可以避免该事件,则该事件不会再次发生。如果该事务是仅应在源而不是副本上执行的管理操作,或者仅应在单个复制组成员上执行,请在停止复制的服务器或服务器上跳过该事务,然后发出
START REPLICA
重新启动该通道的复制。为避免将来出现这种情况,您可以在此类管理语句之前发出SET sql_log_bin = 0
,并在之后发出SET sql_log_bin = 1
,这样它们就不会在源上记录。如果该事务是 DDL 或 DML 语句,不应该在源或副本上执行,请在停止复制的服务器或服务器上跳过该事务,在最初执行该事务的服务器上手动撤消该事务,然后发出
START REPLICA
重新启动复制。
要跳过事务,如果使用 GTID,请提交一个具有失败事务的 GTID 的空事务,例如
SET GTID_NEXT='aaa-bbb-ccc-ddd:N';
BEGIN;
COMMIT;
SET GTID_NEXT='AUTOMATIC';
如果未使用 GTID,请执行 SET GLOBAL sql_replica_skip_counter
语句跳过该事件。有关使用此替代方法的说明以及有关跳过事务的更多详细信息,请参见 第 19.1.7.3 节,“跳过事务”。