Amazon Relational Database Service
用户指南 (API 版本 2014-10-31)
AWS 文档中描述的 AWS 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 Amazon AWS 入门

在 Amazon RDS MySQL 中使用基于 GTID 的复制

全局事务标识符 (GTID) 是为提交的 MySQL 事务生成的唯一标识符。MySQL 使用两种不同类型的事务进行复制:

  • GTID 事务 – 由 GTID 标识的事务。

  • 匿名事务 – 未分配 GTID 的事务。

在复制配置中,GTID 在所有数据库实例中是唯一的。GTID 简化了复制配置,因为在使用它们时,您不必引用日志文件位置。通过使用 GTID,还可以更轻松地跟踪复制的事务并确定主实例和副本是否一致。

您可以使用基于 GTID 的复制与 Amazon RDS MySQL 只读副本或外部 MySQL 数据库之间复制数据。对于 Amazon RDS MySQL 只读副本,您可以在创建新的只读副本时配置基于 GTID 的复制,也可以转换现有的只读副本以使用基于 GTID 的复制。

您还可以在与 Amazon RDS MySQL 之间的延迟复制配置中使用基于 GTID 的复制。有关更多信息,请参阅使用 MySQL 配置延迟复制

有关与 MySQL 之间的基于 GTID 的复制的更多信息,请参阅 MySQL 文档中的使用全局事务标识符进行复制

注意

Amazon RDS MySQL 5.7.23 和更高的 MySQL 5.7 版本支持基于 GTID 的复制。复制配置中的所有 Amazon RDS MySQL 数据库实例必须满足该要求。Amazon RDS MySQL 5.5、5.6 或 8.0 不支持基于 GTID 的复制。

注意

有关配置与外部数据库之间的基于 GTID 的复制的信息,请参阅利用 Amazon RDS 外部运行的 MySQL 或 MariaDB 实例进行复制

基于 GTID 的复制的参数

可以使用以下参数配置基于 GTID 的复制。

参数 有效值 说明

gtid_mode

OFFOFF_PERMISSIVEON_PERMISSIVEON

OFF 指定新事务是匿名事务(即,没有 GTID),并且事务必须是匿名事务才能复制。

OFF_PERMISSIVE 指定新事务是匿名事务,但可以复制所有事务。

ON_PERMISSIVE 指定新事务是 GTID 事务,但可以复制所有事务。

ON 指定新事务是 GTID 事务,并且事务必须是 GTID 事务才能复制。

enforce_gtid_consistency

OFFONWARN

OFF 允许事务违反 GTID 一致性。

ON 禁止事务违反 GTID 一致性。

WARN 允许事务违反 GTID 一致性,但在违反一致性时生成警告。

要在 Amazon RDS MySQL 数据库实例或只读副本中使用基于 GTID 的复制,请确保数据库实例或只读副本的参数组设置了这些参数以启用基于 GTID 的复制。有关参数组的更多信息,请参阅 使用数据库参数组

注意

在 AWS 管理控制台中,gtid_mode 参数显示为 gtid-mode

为新的只读副本配置基于 GTID 的复制

在为 Amazon RDS MySQL 数据库实例启用基于 GTID 的复制时,将自动为数据库实例的只读副本配置基于 GTID 的复制。

为新的只读副本启用基于 GTID 的复制

  1. 确保与数据库实例关联的参数组具有以下参数设置:

    • gtid_modeONON_PERMISSIVE

    • enforce_gtid_consistencyON

    有关参数组的更多信息,请参阅 使用数据库参数组

  2. 如果更改了数据库实例的参数组,请重新引导数据库实例。有关执行该操作的更多信息,请参阅重启中的数据库实例

  3. 创建数据库实例的一个或多个只读副本。有关执行该操作的更多信息,请参阅创建只读副本

Amazon RDS 尝试使用 MASTER_AUTO_POSITION 在 MySQL 数据库实例和只读副本之间配置基于 GTID 的复制。如果尝试失败,Amazon RDS 将使用日志文件位置与只读副本之间进行复制。有关 MASTER_AUTO_POSITION 的更多信息,请参阅 MySQL 文档中的 GTID 自动定位

为现有的只读副本配置基于 GTID 的复制

如果 Amazon RDS MySQL 数据库实例具有只读副本,并且未使用基于 GTID 的复制来复制数据,您可以在数据库实例和只读副本之间配置基于 GTID 的复制。

为现有的只读副本启用基于 GTID 的复制

  1. 如果数据库实例或任何只读副本使用 Amazon RDS MySQL 5.7.22 或更低版本,请将数据库实例或只读副本升级到 Amazon RDS MySQL 5.7.23 或更高的 MySQL 5.7 版本。

    有关更多信息,请参阅 将 MySQL 数据库引擎

  2. (可选)重置 GTID 参数并测试数据库实例和只读副本的行为:

    1. 确保与数据库实例和每个只读副本关联的参数组将 enforce_gtid_consistency 参数设置为 WARN

      有关参数组的更多信息,请参阅 使用数据库参数组

    2. 如果更改了数据库实例的参数组,请重新引导数据库实例。如果更改了只读副本的参数组,请重新引导只读副本。

      有关更多信息,请参阅 重启中的数据库实例

    3. 运行具有正常工作负载的数据库实例和只读副本并监控日志文件。

      如果看到有关与 GTID 不兼容的事务的警告,请调整您的应用程序,以使其仅使用与 GTID 兼容的功能。在继续执行下一步之前,请确保数据库实例未生成有关与 GTID 不兼容的事务的任何警告。

  3. 为允许匿名事务的基于 GTID 的复制重置 GTID 参数,直到只读副本已处理所有这些事务。

    1. 确保与数据库实例和每个只读副本关联的参数组具有以下参数设置:

      • gtid_modeON_PERMISSIVE

      • enforce_gtid_consistencyON

    2. 如果更改了数据库实例的参数组,请重新引导数据库实例。如果更改了只读副本的参数组,请重新引导只读副本。

  4. 等待复制所有匿名事务。要检查是否复制了这些事务,请执行以下操作:

    1. 在主数据库实例上运行以下语句。

      SHOW MASTER STATUS;

      记下 FilePosition 列中的值。

    2. 在每个只读副本上,使用上一步中的主实例上的文件和位置信息运行以下查询。

      SELECT MASTER_POS_WAIT(file, position);

      例如,如果文件名是 mysql-bin-changelog.000031 并且位置是 107,请运行以下语句。

      SELECT MASTER_POS_WAIT(mysql-bin-changelog.000031, 107);

      如果只读副本超过指定的位置,查询将立即返回。否则,该函数将等待一段时间。在查询返回所有只读副本的结果时,请继续执行下一步。

  5. 仅重置基于 GTID 的复制的 GTID 参数。

    1. 确保与数据库实例和每个只读副本关联的参数组具有以下参数设置:

      • gtid_modeON

      • enforce_gtid_consistencyON

    2. 重新引导数据库实例和每个只读副本。

  6. 在每个只读副本上,运行以下过程。

    CALL mysql.rds_set_master_auto_position(1);

为具有只读副本的 Amazon RDS MySQL 数据库实例禁用基于 GTID 的复制

您可以为具有只读副本的 Amazon RDS MySQL 数据库实例禁用基于 GTID 的复制。

为具有只读副本的 RDS MySQL 数据库实例禁用基于 GTID 的复制

  1. 在每个只读副本上,运行以下过程。

    CALL mysql.rds_set_master_auto_position(0);
  2. gtid_mode 重置为 ON_PERMISSIVE

    1. 确保与 Amazon RDS MySQL 数据库实例和每个只读副本关联的参数组将 gtid_mode 设置为 ON_PERMISSIVE

      有关参数组的更多信息,请参阅 使用数据库参数组

    2. 重新引导 Amazon RDS MySQL 数据库实例和每个只读副本。有关重新引导的更多信息,请参阅重启中的数据库实例

  3. gtid_mode 重置为 OFF_PERMISSIVE

    1. 确保与 Amazon RDS MySQL 数据库实例和每个只读副本关联的参数组将 gtid_mode 设置为 OFF_PERMISSIVE

    2. 重新引导 Amazon RDS MySQL 数据库实例和每个只读副本。

  4. 等待在所有只读副本上应用所有 GTID 事务。要检查是否应用了这些事务,请执行以下操作:

    1. 在 Amazon RDS MySQL 数据库实例上,运行 SHOW MASTER STATUS 命令。

      输出类似于以下内容。

      File Position ------------------------------------ mysql-bin-changelog.000031 107 ------------------------------------

      记下输出中的文件和位置。

    2. 在每个只读副本上,使用上一步中的主实例上的文件和位置信息运行以下查询。

      SELECT MASTER_POS_WAIT(file, position);

      例如,如果文件名是 mysql-bin-changelog.000031 并且位置是 107,请运行以下语句。

      SELECT MASTER_POS_WAIT(mysql-bin-changelog.000031, 107);

      如果只读副本超过指定的位置,查询将立即返回。否则,该函数将等待一段时间。在查询返回所有只读副本的结果时,请继续执行下一步。

  5. 重置 GTID 参数以禁用基于 GTID 的复制。

    1. 确保与 Amazon RDS MySQL 数据库实例和每个只读副本关联的参数组具有以下参数设置:

      • gtid_modeOFF

      • enforce_gtid_consistencyOFF

    2. 重新引导 Amazon RDS MySQL 数据库实例和每个只读副本。