19.3.3.3. 复制权限检查失败恢复
如果对 PRIVILEGE_CHECKS_USER
账户的权限检查失败,事务将不执行,复制将在该通道上停止。错误的详细信息和最后一个应用的事务将被记录在性能chema replication_applier_status_by_worker
表中。按照以下步骤恢复错误:
-
确定导致错误的复制事件,并验证该事件是否预期和来自可靠的来源。您可以使用 mysqlbinlog 检索和显示在错误发生时的事件。有关如何执行此操作的说明,请参阅 第9.5节,“Point-in-Time (Incremental) Recovery”。
-
如果复制事件不是预期的或不是来自可靠的来源,调查原因。如果可以确定事件的原因,并且没有安全考虑,可以按照以下步骤修复错误。
-
如果
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语句,在源服务器或副本服务器上都不能执行,skip该事务在停止复制的服务器或服务器上,然后在事务原始执行的服务器上手动回滚事务,最后使用
START REPLICA
重新启动复制。
要skip事务,如果使用GTID,可以提交一个空事务,该事务的GTID与失败事务相同,例如:
SET GTID_NEXT='aaa-bbb-ccc-ddd:N';
BEGIN;
COMMIT;
SET GTID_NEXT='AUTOMATIC';
如果不使用GTID,使用SET GLOBAL sql_replica_skip_counter
语句来skip事件。关于使用该备用方法和更多关于事务skip的信息,请见第19.1.7.3节,“事务skip”。