

# 为 RDS for MySQL 的现有只读副本启用基于 GTID 的复制
<a name="mysql-replication-gtid.configuring-existing-read-replicas"></a>

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

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

1. 如果数据库实例或任何只读副本使用了低于 8.0.26 的 RDS for MySQL 8.0.x 版本，请将数据库实例或只读副本升级为 8.0.26 或更高的 MySQL 8.0 版本。所有 RDS for MySQL 8.4 版本和 5.7 版本均支持基于 GTID 的复制。

   有关更多信息，请参阅 [升级 RDS for MySQL 数据库引擎](USER_UpgradeDBInstance.MySQL.md)。

1. （可选）重置 GTID 参数并测试数据库实例和只读副本的行为：

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

      有关使用参数组设置配置参数的更多信息，请参阅 [Amazon RDS 的参数组](USER_WorkingWithParamGroups.md)。

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

      有关更多信息，请参阅“[重启数据库实例](USER_RebootInstance.md)”。

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

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

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

   1. 确保与数据库实例和每个只读副本关联的参数组具有以下参数设置：
      + `gtid_mode` – `ON_PERMISSIVE`
      + `enforce_gtid_consistency` – `ON`

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

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

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

      **MySQL 8.4**

      ```
      SHOW BINARY LOG STATUS;
      ```

      **MySQL 5.7 和 8.0**

      ```
      SHOW MASTER STATUS;
      ```

      记下 `File` 和 `Position` 列中的值。

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

      ```
      SELECT MASTER_POS_WAIT('file', position);
      ```

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

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

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

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

   1. 确保与数据库实例和每个只读副本关联的参数组具有以下参数设置：
      + `gtid_mode` – `ON`
      + `enforce_gtid_consistency` – `ON`

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

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

   **MySQL 8.4 及更高的主要版本**

   ```
   CALL mysql.rds_set_source_auto_position(1);
   ```

   **MySQL 8.0 及更低的主要版本**

   ```
   CALL mysql.rds_set_master_auto_position(1);
   ```