

# 配置与外部源实例之间的基于 GTID 的复制
<a name="MariaDB.Procedural.Replication.GTID"></a>

您可以将基于全局事务标识符 (GTID) 的复制从版本 10.0.24 或更高版本的外部 MariaDB 实例设置到 RDS for MariaDB 数据库实例中。对 Amazon RDS 设置外部源实例和副本时，请遵循以下准则：
+ 监控作为副本的 RDS for MariaDB 数据库实例的故障转移事件。如果发生失效转移，则可能会在具有不同的网络地址的新主机上重新创建作为副本的数据库实例。有关如何监控故障转移事件的信息，请参阅[使用 Amazon RDS 事件通知](USER_Events.md)。
+ 在源实例上保留二进制日志 (binlog)，直到您确认将其应用于副本。这种维护将确保您可以在发生故障时还原源实例。
+ 在 Amazon RDS 上对 MariaDB 数据库实例启用自动备份。通过启用自动备份，可以确保在需要重新同步源实例和副本时能够将副本还原到特定时间点。有关备份和时间点还原的信息，请参阅[备份、还原和导出数据](CHAP_CommonTasks.BackupRestore.md)。

**注意**  
对 MariaDB 数据库实例启动复制功能所需的权限受到限制，且对 Amazon RDS 主用户不可用。因此，您必须使用 Amazon RDS [mysql.rds\$1set\$1external\$1master\$1gtid](mysql_rds_set_external_master_gtid.md) 和 [mysql.rds\$1start\$1replication](mysql-stored-proc-replicating.md#mysql_rds_start_replication) 命令来设置活动数据库和 RDS for MariaDB 数据库之间的复制。

要启动外部源实例和 Amazon RDS 上的 MariaDB 数据库实例之间的复制，请使用以下步骤。<a name="MariaDB.Procedural.Importing.External.Repl.Procedure"></a>

**启动复制**

1. 将源 MariaDB 实例设为只读：

   ```
   mysql> FLUSH TABLES WITH READ LOCK;
   mysql> SET GLOBAL read_only = ON;
   ```

1. 获取外部 MariaDB 实例的当前 GTID。您可以通过使用 `mysql` 或您选择的查询编辑器运行 `SELECT @@gtid_current_pos;` 来执行该操作。

   GTID 采用 `<domain-id>-<server-id>-<sequence-id>` 格式。典型的 GTID 将类似于 **0-1234510749-1728**。有关 GTID 及其组成部分的更多信息，请参阅 MariaDB 文档中的[全局事务 ID](http://mariadb.com/kb/en/mariadb/global-transaction-id/)。

1. 使用 `mysqldump` 将数据库从外部 MariaDB 实例复制到 MariaDB 数据库实例。对于非常大的数据库，您可能需要使用[将数据导入到 Amazon RDS for MariaDB 数据库实例并减少停机时间](mariadb-importing-data-reduced-downtime.md)中的过程。

   对于 Linux、macOS 或 Unix：

   ```
   mysqldump \
       --databases database_name \
       --single-transaction \
       --compress \
       --order-by-primary \
       -u local_user \
       -plocal_password | mysql \
           --host=hostname \
           --port=3306 \
           -u RDS_user_name \
           -pRDS_password
   ```

   对于：Windows

   ```
   mysqldump ^
       --databases database_name ^
       --single-transaction ^
       --compress ^
       --order-by-primary \
       -u local_user \
       -plocal_password | mysql ^
           --host=hostname ^
           --port=3306 ^
           -u RDS_user_name ^
           -pRDS_password
   ```
**注意**  
确保 `-p` 选项和输入的密码之间没有空格。  
作为安全最佳实践，请指定除此处所示提示以外的密码。

   在 `--host` 命令中使用 `--user (-u)`、`--port`、`-p` 和 `mysql` 选项可指定用于连接到 MariaDB 数据库实例的主机名、用户名、端口和密码。主机名是 MariaDB 数据库实例终端节点中的 DNS 名称，例如，`myinstance.123456789012.us-east-1.rds.amazonaws.com`。您可以在 Amazon RDS 管理控制台上的实例详细信息中找到终端节点值。

1. 再次将源 MariaDB 实例设为可写。

   ```
   mysql> SET GLOBAL read_only = OFF;
   mysql> UNLOCK TABLES;
   ```

1. 在 Amazon RDS 管理控制台中，将承载外部 MariaDB 数据库的服务器的 IP 地址添加到 MariaDB 数据库实例的 VPC 安全组。有关修改 VPC 安全组的更多信息，请转到 *Amazon Virtual Private Cloud 用户指南* 中的[您的 VPC 的安全组](https://docs.aws.amazon.com/vpc/latest/userguide/VPC_SecurityGroups.html)。

   在满足以下条件时，IP 地址可能会发生更改：
   + 您正在使用公有 IP 地址在外部源实例和数据库实例之间进行通信。
   + 外部源实例已停止并重新启动。

   如果满足这些条件，请在添加 IP 地址之前先对其进行验证。

   您可能还需要配置本地网络，允许来自 MariaDB 数据库实例 IP 地址的连接，使它能与外部 MariaDB 实例进行通信。要查找 MariaDB 数据库实例的 IP 地址，请使用 `host` 命令。

   ```
   host db_instance_endpoint
   ```

   主机名是 MariaDB 数据库实例终端节点中的 DNS 名称。

1. 通过使用所选的客户端，连接到外部 MariaDB 实例并创建将用于复制的 MariaDB 用户。此账户仅用于复制，并且必须仅供您的域使用以增强安全性。示例如下：

   ```
   CREATE USER 'repl_user'@'mydomain.com' IDENTIFIED BY 'password';
   ```
**注意**  
作为安全最佳实践，请指定除此处所示提示以外的密码。

1. 对于外部 MariaDB 实例，向复制用户授予 `REPLICATION CLIENT` 和 `REPLICATION SLAVE` 权限。例如，要为您的域的“`REPLICATION CLIENT`”用户授予对所有数据库的 `REPLICATION SLAVE` 和 `repl_user` 权限，请发出以下命令。

   ```
   GRANT REPLICATION CLIENT, REPLICATION SLAVE ON *.* TO 'repl_user'@'mydomain.com';
   ```

1. 将 MariaDB 数据库实例设置为副本。通过使用 [mysql.rds\$1set\$1external\$1master\$1gtid](mysql_rds_set_external_master_gtid.md) 命令，以主用户身份连接到 MariaDB 数据库实例，并将外部 MariaDB 数据库标识为复制源实例。使用您在步骤 2 中确定的 GTID。示例如下：

   ```
   CALL mysql.rds_set_external_master_gtid ('mymasterserver.mydomain.com', 3306, 'repl_user', 'password', 'GTID', 1);
   ```
**注意**  
作为安全最佳实践，请指定除此处所示提示以外的密码。

1. 在 MariaDB 数据库实例上，发出 [mysql.rds\$1start\$1replication](mysql-stored-proc-replicating.md#mysql_rds_start_replication) 命令以启动复制：

   ```
   CALL mysql.rds_start_replication; 
   ```