

# 配置与外部源实例之间的二进制日志文件位置复制
<a name="MySQL.Procedural.Importing.External.Repl"></a>

您可以使用二进制日志文件复制来设置 RDS for MySQL 或 MariaDB 数据库实例与 Amazon RDS 外部的 MySQL 或 MariaDB 实例之间的复制。

**Topics**
+ [开始前的准备工作](#MySQL.Procedural.Importing.External.Repl.BeforeYouBegin)
+ [配置与外部源实例之间的二进制日志文件位置复制](#MySQL.Procedural.Importing.External.Repl.Procedure)

## 开始前的准备工作
<a name="MySQL.Procedural.Importing.External.Repl.BeforeYouBegin"></a>

您可以使用复制的事务的二进制日志文件位置配置复制。

对 Amazon RDS 数据库实例启动复制功能所需的权限受到限制且对 Amazon RDS 主用户不可用。因此，请确保使用 Amazon RDS [mysql.rds\$1set\$1external\$1master（RDS for MariaDB 和 RDS for MySQL 主要版本 8.0 及更低版本）](mysql-stored-proc-replicating.md#mysql_rds_set_external_master) 或 [mysql.rds\$1set\$1external\$1source（RDS for MySQL 主要版本 8.4 及更高版本）](mysql-stored-proc-replicating.md#mysql_rds_set_external_source) 以及 [mysql.rds\$1start\$1replication](mysql-stored-proc-replicating.md#mysql_rds_start_replication) 命令来设置活动数据库和 Amazon RDS 数据库之间的复制。

要为 MySQL 或 MariaDB 数据库设置二进制日志记录格式，请更新 `binlog_format` 参数。如果您的数据库实例使用默认数据库实例参数组，请创建一个新的数据库参数组来修改 `binlog_format` 参数。在 MariaDB 和 MySQL 8.0 及更低版本中，`binlog_format` 默认设置为 `MIXED`。不过，如果您需要特定的二进制日志 (binlog) 格式，也可以将 `binlog_format` 设置为 `ROW` 或 `STATEMENT`。重启您的数据库实例以使更改生效。在 MySQL 8.4 及更高版本中，`binlog_format` 默认设置为 `ROW`。

有关设置 `binlog_format` 参数的信息，请参阅[为单可用区数据库配置 RDS for MySQL 二进制日志记录](USER_LogAccess.MySQL.BinaryFormat.md)。有关不同 MySQL 复制类型的含义的信息，请参阅 MySQL 文档中的[基于语句和基于行的复制的优点和缺点](https://dev.mysql.com/doc/refman/8.0/en/replication-sbr-rbr.html)。

## 配置与外部源实例之间的二进制日志文件位置复制
<a name="MySQL.Procedural.Importing.External.Repl.Procedure"></a>

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

**配置与外部源实例之间的二进制日志文件复制**

1. 将源 MySQL 或 MariaDB 实例设置为只读。

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

1. 对源 MySQL 或 MariaDB 实例运行 `SHOW MASTER STATUS` 命令以确定二进制日志位置。

   您将收到类似于以下示例的输出。

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

1. 使用 `mysqldump` 将数据库从外部实例复制到 Amazon RDS 数据库实例。对于非常大的数据库，您可能需要使用[将数据导入 Amazon RDS for MySQL 数据库实例并减少停机时间](mysql-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` 选项和输入的密码之间没有空格。

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

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

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

   有关生成备份以用于复制的更多信息，请参阅 [MySQL 文档](https://dev.mysql.com/doc/refman/8.0/en/replication-solutions-backups-read-only.html)。

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

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

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

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

   ```
   host db_instance_endpoint
   ```

   主机名是 Amazon RDS 数据库实例端点中的 DNS 名称。

1. 通过使用所选的客户端，连接到外部实例并创建要用于复制的用户。请仅将该账户用于复制，并将其限制为您的域以提高安全性。示例如下：

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

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

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

1. 将 Amazon RDS 数据库实例设置为副本。为此，请先以主用户身份连接到 Amazon RDS 数据库实例。然后使用 [mysql.rds\$1set\$1external\$1source（RDS for MySQL 主要版本 8.4 及更高版本）](mysql-stored-proc-replicating.md#mysql_rds_set_external_source) 或 [mysql.rds\$1set\$1external\$1master（RDS for MariaDB 和 RDS for MySQL 主要版本 8.0 及更低版本）](mysql-stored-proc-replicating.md#mysql_rds_set_external_master) 命令，将外部 MySQL 或 MariaDB 数据库标识为源实例。使用在步骤 2 中确定的主日志文件名和主日志位置。下面是一些命令示例。

   **MySQL 8.4**

   ```
   CALL mysql.rds_set_external_source ('mysourceserver.mydomain.com', 3306, 'repl_user', 'password', 'mysql-bin-changelog.000031', 107, 1);
   ```

   **MariaDB 以及 MySQL 8.0 和 5.7**

   ```
   CALL mysql.rds_set_external_master ('mymasterserver.mydomain.com', 3306, 'repl_user', 'password', 'mysql-bin-changelog.000031', 107, 1);
   ```
**注意**  
在 RDS for MySQL 上，可以选择通过运行 [mysql.rds\$1set\$1external\$1source\$1with\$1delay（RDS for MySQL 主要版本 8.4 及更高版本）](mysql-stored-proc-replicating.md#mysql_rds_set_external_source_with_delay) 或 [mysql.rds\$1set\$1external\$1master\$1with\$1delay（RDS for MariaDB 和 RDS for MySQL 主要版本 8.0 及更低版本）](mysql-stored-proc-replicating.md#mysql_rds_set_external_master_with_delay) 存储过程来使用延迟复制。在 RDS for MySQL 中，使用延迟复制的一个原因是，使用 [mysql.rds\$1start\$1replication\$1until](mysql-stored-proc-replicating.md#mysql_rds_start_replication_until) 存储过程打开灾难恢复。目前，RDS for MariaDB 支持延迟复制，但不支持 `mysql.rds_start_replication_until` 过程。

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

   ```
   CALL mysql.rds_start_replication;
   ```