如果针对 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 节,“跳过事务”。