如果对 PRIVILEGE_CHECKS_USER
帐户的权限检查失败,事务将不会执行,复制将停止在该通道上。错误的详细信息和最后应用的事务将记录在性能模式 replication_applier_status_by_worker
表中。按照以下步骤从错误中恢复:
-
标识导致错误的复制事件,并验证该事件是否来自可靠的来源。您可以使用 mysqlbinlog 检索和显示错误时记录的事件。有关如何执行此操作的说明,请参见 第 9.5 节,“点时间(增量)恢复”。
-
如果复制事件不是预期的或不是来自已知和可靠的来源,请调查原因。如果您可以确定事件的原因,并且没有安全考虑因素,请按照以下步骤修复错误。
-
如果
PRIVILEGE_CHECKS_USER
帐户应该被允许执行事务,但却被错误配置了,授予帐户缺少的权限,使用FLUSH PRIVILEGES
语句或执行 mysqladmin flush-privileges 或 mysqladmin reload 命令以重新加载授权表,然后重新启动复制通道。 -
如果事务需要执行,并且您已经验证了它来自可靠的来源,但
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 节,“跳过事务”。