Documentation Home
MySQL 8.4 Reference Manual
Related Documentation Download this Manual
PDF (US Ltr) - 39.8Mb
PDF (A4) - 39.9Mb
Man Pages (TGZ) - 257.9Kb
Man Pages (Zip) - 364.9Kb
Info (Gzip) - 4.0Mb
Info (Zip) - 4.0Mb


MySQL 8.4 Reference Manual  /  ...  /  Recovering From Failed Replication Privilege Checks

19.3.3.3. 复制权限检查失败恢复

如果对 PRIVILEGE_CHECKS_USER 账户的权限检查失败,事务将不执行,复制将在该通道上停止。错误的详细信息和最后一个应用的事务将被记录在性能chema replication_applier_status_by_worker 表中。按照以下步骤恢复错误:

  1. 确定导致错误的复制事件,并验证该事件是否预期和来自可靠的来源。您可以使用 mysqlbinlog 检索和显示在错误发生时的事件。有关如何执行此操作的说明,请参阅 第9.5节,“Point-in-Time (Incremental) Recovery”

  2. 如果复制事件不是预期的或不是来自可靠的来源,调查原因。如果可以确定事件的原因,并且没有安全考虑,可以按照以下步骤修复错误。

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

  4. 如果事务需要执行,您已经验证了它是可靠的,但 PRIVILEGE_CHECKS_USER 账户不应该拥有该权限,可以临时授予该账户所需的权限。事务应用后,撤销该账户的权限,并采取必要的措施来确保事件不再发生。

  5. 如果事务是一个只能在源服务器上执行的管理操作,但在复制服务器上执行了该操作,或者该操作只能在单个复制组成员上执行,跳过该事务在服务器或服务器上,然后使用 START REPLICA 命令重新启动复制通道。为了避免这种情况在将来发生,可以在执行管理语句前使用 SET sql_log_bin = 0,然后在执行语句后使用 SET sql_log_bin = 1,这样语句将不会在源服务器上记录。

  6. 如果事务是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”