MySQL 8.0 参考手册  / 第十七章复制  / 17.3 复制安全  / 17.3.3 复制权限检查  /  17.3.3.3 从失败的复制权限检查中恢复

17.3.3.3 从失败的复制权限检查中恢复

如果针对该 PRIVILEGE_CHECKS_USER帐户的权限检查失败,则不会执行该事务并且该通道的复制将停止。错误的详细信息和最后应用的事务记录在 Performance Schema replication_applier_status_by_worker 表中。请按照以下过程从错误中恢复:

  1. 确定导致错误的复制事件并验证该事件是否在预期范围内并且来自可信源。您可以使用mysqlbinlog 来检索和显示错误发生前后记录的事件。有关执行此操作的说明,请参阅 第 7.5 节,“时间点(增量)恢复”

  2. 如果复制的事件不是预期的或不是来自已知且受信任的来源,请调查原因。如果您可以确定事件发生的原因并且没有安全考虑,请继续按如下所述修复错误。

  3. 如果该PRIVILEGE_CHECKS_USER帐户本应被允许执行事务,但配置错误,则将缺少的权限授予该帐户,使用FLUSH PRIVILEGES语句或执行 mysqladmin flush-privilegesmysqladmin reload命令重新加载授权表,然后重新启动复制渠道。

  4. 如果交易需要执行,并且您已经验证了它是可信任的,但是该 账户通常不应该有这个权限,您可以 临时PRIVILEGE_CHECKS_USER授予该账户所需的权限。PRIVILEGE_CHECKS_USER应用复制的事件后,从帐户中删除权限,并采取任何必要的步骤以确保事件不会再次发生(如果可以避免的话)。

  5. 如果事务是只应在源而不是副本上发生的管理操作,或者只应在单个复制组成员上发生,则跳过停止复制的服务器或服务器上的事务,然后发出 START REPLICA重新启动通道上的复制。为避免将来出现这种情况,您可以SET sql_log_bin = 0在它们之前和SET sql_log_bin = 1之后发出此类管理语句,这样它们就不会登录到源上。

  6. 如果事务是不应在源或副本上发生的 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_counterorSET GLOBAL sql_slave_skip_counter语句以跳过该事件。有关使用此替代方法的说明以及有关跳过事务的更多详细信息,请参阅 第 17.1.7.3 节,“跳过事务”