在 RDS for MySQL 中使用基于 GTID 的复制 - Amazon Relational Database Service
AWS 文档中描述的 AWS 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅中国的 AWS 服务入门

RDS for MySQL 中使用基于 GTID 的复制

接下来,您可以了解到如何的 RDS for MySQL 数据库实例中使用采用二进制日志 (binlog) 复制的全局事务标识符 (GTID)。

如果您使用的是二进制日志复制,不熟悉 MySQL 的基于 GTID 的复制,请参阅 MySQL 文档中的使用全局事务标识符进行复制,了解背景信息。

注意

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

注意

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

全局事务标识符 (GTID) 概述

全局事务标识符 (GTID) 是为提交的 MySQL 事务生成的唯一标识符。您可以使用 GTID 让二进制日志复制的故障排除更加简单便捷。

MySQL 使用两种不同类型的事务进行二进制日志复制:

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

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

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

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

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

基于 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 一致性,但在违反一致性时生成警告。

注意

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

对于基于 GTID 的复制,请为数据库实例或只读副本的参数组使用这些设置:

  • ONON_PERMISSIVE 仅适用于从 RDS 数据库实例或 Aurora MySQL 集群的传出复制。这两个值都可以让 RDS 数据库实例或 Aurora 数据库集群为复制到外部数据库的事务使用 GTID。ON 要求外部数据库也使用基于 GTID 的复制。ON_PERMISSIVE 让基于 GTID 的复制成为外部数据库上的可选项。

  • OFF_PERMISSIVE(如果设置)表明您的 RDS 数据库实例或 Aurora 数据库集群可以接受来自外部数据库的传入复制。不论外部数据库是否使用基于 GTID 的复制,它都可以接受。

  • OFF(如果设置)表明您的 RDS 数据库实例或 Aurora 数据库集群只接受来自不使用基于 GTID 的复制的外部数据库的传入复制。

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

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

在为 RDS for 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 的复制

对于具有不使用基于 GTID 的复制的只读副本的现有 MySQL 数据库实例,您可以在数据库实例和只读副本之间配置基于 GTID 的复制。

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

  1. 如果数据库实例或任何只读副本使用 RDS for MySQL 版本 5.7.22 或更低版本,请升级数据库实例或只读副本。升级到 RDS for 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);

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

您可以为 一个具有只读副本的 MySQL数据库实例。

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

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

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

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

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

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

  3. gtid_mode 重置为 OFF_PERMISSIVE

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

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

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

    等待在 Aurora 主实例上应用所有 GTID 事务。要检查是否应用了这些事务,请执行以下操作:

    1. 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. 确保与 MySQL 数据库实例和每个只读副本关联的参数组具有以下参数设置:

      • gtid_modeOFF

      • enforce_gtid_consistencyOFF

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