

# 为 Aurora MySQL 设置二进制日志复制
<a name="AuroraMySQL.Replication.MySQL.SettingUp"></a>

设置使用 Aurora MySQL 进行 MySQL 复制包括以下步骤（下面将详细讨论）：

**Contents**
+ [1. 在复制源上开启二进制日志记录](#AuroraMySQL.Replication.MySQL.EnableBinlog)
+ [2. 在复制源上保留二进制日志，直到不再需要](#AuroraMySQL.Replication.MySQL.RetainBinlogs)
+ [3. 创建复制源的副本或转储](#AuroraMySQL.Replication.MySQL.CreateSnapshot)
+ [4. 将转储加载到副本目标（如果需要）](#AuroraMySQL.Replication.MySQL.LoadSnapshot)
+ [5. 在您的复制源上创建复制用户](#AuroraMySQL.Replication.MySQL.CreateReplUser)
+ [6. 在副本目标上开启复制](#AuroraMySQL.Replication.MySQL.EnableReplication)
  + [设置停止复制到只读副本的位置](#AuroraMySQL.Replication.StartReplicationUntil)
+ [7. 监控副本](#AuroraMySQL.Replication.MySQL.Monitor)
+ [在复制源和目标之间同步密码](#AuroraMySQL.Replication.passwords)

## 1. 在复制源上开启二进制日志记录
<a name="AuroraMySQL.Replication.MySQL.EnableBinlog"></a>

 在下面查找有关如何在数据库引擎的复制源上开启二进制日志记录的说明。


|  数据库引擎  |  说明  | 
| --- | --- | 
|   Aurora MySQL   |   **在 Aurora MySQL 数据库集群上开启二进制日志记录**  将 `binlog_format` 数据库集群参数设置为 `ROW`、`STATEMENT` 或 `MIXED`。建议设置为 `MIXED`，除非您需要采用特定的二进制日志格式。（默认值为 `OFF`。） 要更改 `binlog_format` 参数，请创建自定义数据库集群参数组，并将该自定义参数组与您的数据库集群关联。您无法更改默认数据库集群参数组中的参数。 如果要将 `binlog_format` 参数从 `OFF` 更改为其他值，请重启 Aurora 数据库集群以使更改生效。  有关更多信息，请参阅[Amazon Aurora 数据库集群和数据库实例参数](USER_WorkingWithDBClusterParamGroups.md#Aurora.Managing.ParameterGroups)和[Amazon Aurora 的参数组](USER_WorkingWithParamGroups.md)。  | 
|   RDS for MySQL   |   **在 Amazon RDS 数据库实例上开启二进制日志记录**   您不能直接为 Amazon RDS 数据库实例开启二进制日志记录，但可以通过执行以下操作之一来开启它： [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/AmazonRDS/latest/AuroraUserGuide/AuroraMySQL.Replication.MySQL.SettingUp.html)  | 
|   MySQL (外部)  |  **设置加密复制** 要使用 Aurora MySQL 版本 2 安全地复制数据，您可以使用加密复制。   如果您不需要使用加密复制，可以跳过以下步骤。   以下是使用加密复制的先决条件： [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/AmazonRDS/latest/AuroraUserGuide/AuroraMySQL.Replication.MySQL.SettingUp.html)  在加密复制期间，Aurora MySQL 数据库集群充当 MySQL 数据库服务器的客户端。Aurora MySQL 客户端的证书和密钥必须是 .pem 格式的文件。 [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/AmazonRDS/latest/AuroraUserGuide/AuroraMySQL.Replication.MySQL.SettingUp.html)  **在外部 MySQL 数据库上开启二进制日志记录**  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/AmazonRDS/latest/AuroraUserGuide/AuroraMySQL.Replication.MySQL.SettingUp.html)  | 

## 2. 在复制源上保留二进制日志，直到不再需要
<a name="AuroraMySQL.Replication.MySQL.RetainBinlogs"></a>

使用 MySQL 二进制日志复制时，Amazon RDS 不会对复制过程进行管理。因此，您需要确保复制源上的二进制日志文件保留到更改应用于副本之后。保留这些文件有助于在发生故障时可还原您的源数据库。

使用以下说明为数据库引擎保留二进制日志。


|  数据库引擎  |  说明  | 
| --- | --- | 
|   Aurora MySQL  |  **在 Aurora MySQL 数据库集群上保留二进制日志** 您无法访问 Aurora MySQL 数据库集群的二进制日志文件。因此，您必须为复制源上的二进制日志文件选择足够长的保留时间，从而确保在 Amazon RDS 删除二进制日志文件之前将更改应用于副本。Aurora MySQL 数据库集群上的二进制日志文件最多可以保留 90 天。 如果所设置的复制以 MySQL 数据库或 RDS for MySQL 数据库实例作为副本，并且要创建副本的数据库非常大，请为二进制日志文件选择较长的保留时间范围，直到数据库到副本的初始复制完成，并且副本滞后达到 0。 要设置二进制日志保留时间范围，请使用 [mysql.rds\$1set\$1configuration](mysql-stored-proc-configuring.md#mysql_rds_set_configuration) 过程，并指定 `'binlog retention hours'` 配置参数以及在数据库集群上保留二进制日志文件的小时数。Aurora MySQL 版本 2.11.0 及更高版本和版本 3 的最大值为 2160（90天）。 以下示例将二进制日志文件的保留期设置为 6 天： <pre>CALL mysql.rds_set_configuration('binlog retention hours', 144);</pre> 复制开始之后，可以通过对副本运行 `SHOW SLAVE STATUS`（Aurora MySQL 版本 2）或 `SHOW REPLICA STATUS`（Aurora MySQL 版本 3）命令并检查 `Seconds behind master` 字段来验证更改是否已经应用于副本。如果 `Seconds behind master` 字段为 0，则表示不存在副本滞后。不存在副本滞后时，请通过将 `binlog retention hours` 配置参数设置为更短的时间范围缩短保留二进制日志文件的时间。 如果未指定此设置，则 Aurora MySQL 的默认值为 24 小时（1 天）。 如果您为 `'binlog retention hours'` 指定的值大于最大值，则 Aurora MySQL 使用最大值。  | 
|   RDS for MySQL   |   **在 Amazon RDS 数据库实例上保留二进制日志**   您也可以通过设置二进制日志保留小时数在 Amazon RDS 数据库实例上保留二进制日志文件，就如同 Aurora MySQL 数据库集群一样（如上一行所述）。 还可以通过为数据库实例创建只读副本，在 Amazon RDS 数据库实例上保留二进制日志文件。此只读副本是临时副本，仅用于保留二进制日志文件的目的。在创建只读副本后，在只读副本上调用 [mysql.rds\$1stop\$1replication](mysql-stored-proc-replicating.md#mysql_rds_stop_replication) 过程。复制停止时，Amazon RDS 不会删除复制源上的任何二进制日志文件。设置与永久副本间的复制之后，可以在复制源与永久副本之间的副本滞后（`Seconds behind master` 字段）达到 0 时删除只读副本。  | 
|   MySQL (外部)   |  **在外部 MySQL 数据库上保留二进制日志** 外部 MySQL 数据库上的二进制日志文件不由 Amazon RDS 进行管理，因此，它们会一直保留，直到由您删除。 复制开始之后，可以通过对副本运行 `SHOW SLAVE STATUS`（Aurora MySQL 版本 2）或 `SHOW REPLICA STATUS`（Aurora MySQL 版本 3）命令并检查 `Seconds behind master` 字段来验证更改是否已经应用于副本。如果 `Seconds behind master` 字段为 0，则表示不存在副本滞后。不存在副本滞后时，可以删除旧的二进制日志文件。  | 

## 3. 创建复制源的副本或转储
<a name="AuroraMySQL.Replication.MySQL.CreateSnapshot"></a>

使用复制源的快照、克隆或转储将数据的基准副本加载到您的副本。然后从该点开始复制。

使用以下说明创建数据库引擎的复制源的副本或转储。


| 数据库引擎 | 说明 | 
| --- | --- | 
|   Aurora MySQL   |  **创建 Aurora MySQL 数据库集群的副本** 使用以下方法之一： [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/AmazonRDS/latest/AuroraUserGuide/AuroraMySQL.Replication.MySQL.SettingUp.html) **确定二进制日志文件名和位置** 使用以下方法之一： [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/AmazonRDS/latest/AuroraUserGuide/AuroraMySQL.Replication.MySQL.SettingUp.html) **创建 Aurora MySQL 数据库集群的转储** 如果副本目标是外部 MySQL 数据库或 RDS for MySQL 数据库实例，则必须从 Aurora 数据库集群创建转储文件。 请务必针对您创建的源数据库集群的副本运行 `mysqldump` 命令。这是为了避免在进行转储时考虑锁定问题。如果转储是直接在源数据库集群上进行的，则需要锁定源表，用于防止在转储过程中对这些表进行并发写入。 [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/AmazonRDS/latest/AuroraUserGuide/AuroraMySQL.Replication.MySQL.SettingUp.html)  | 
|  RDS for MySQL  |  **创建 Amazon RDS 数据库实例的快照** 创建 Amazon RDS 数据库实例的只读副本。有关更多信息，请参阅 *Amazon Relational Database Service 用户指南* 中的[创建只读副本](https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/USER_ReadRepl.html#USER_ReadRepl.Create)。 [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/AmazonRDS/latest/AuroraUserGuide/AuroraMySQL.Replication.MySQL.SettingUp.html)  | 
|  MySQL (外部)  |  **创建外部 MySQL 数据库的转储** [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/AmazonRDS/latest/AuroraUserGuide/AuroraMySQL.Replication.MySQL.SettingUp.html)  | 

## 4. 将转储加载到副本目标（如果需要）
<a name="AuroraMySQL.Replication.MySQL.LoadSnapshot"></a>

如果您打算从 Amazon RDS 外部的 MySQL 数据库转储加载数据，则可能要创建用于将转储文件复制到其中的 EC2 实例。然后，可以从该 EC2 实例将数据加载到数据库集群或数据库实例中。使用此方法时，您可以在将转储文件复制到 EC2 实例之前压缩它们，以便降低与向 Amazon RDS 复制数据关联的网络成本。在网络中进行传输时，还可以加密转储文件以保护数据。

**注意**  
如果您创建一个新的 Aurora MySQL 数据库集群作为副本目标，则不需要加载转储文件：  
可以从数据库集群快照进行还原来创建新的数据库集群。有关更多信息，请参阅 [从数据库集群快照还原](aurora-restore-snapshot.md)。
可以克隆源数据库集群来创建新的数据库集群。有关更多信息，请参阅 [克隆 Amazon Aurora 数据库集群卷](Aurora.Managing.Clone.md)。
可以将数据从数据库实例快照迁移到新的数据库集群中。有关更多信息，请参阅 [将数据迁移到 Amazon Aurora MySQL 数据库集群](AuroraMySQL.Migrating.md)。

使用以下说明将复制源的转储加载到数据库引擎的副本目标中。


| 数据库引擎 | 说明 | 
| --- | --- | 
|  Aurora MySQL   |   **将转储加载到 Aurora MySQL 数据库集群**  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/AmazonRDS/latest/AuroraUserGuide/AuroraMySQL.Replication.MySQL.SettingUp.html)  | 
|   RDS for MySQL   |  **将转储加载到 Amazon RDS 数据库实例** [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/AmazonRDS/latest/AuroraUserGuide/AuroraMySQL.Replication.MySQL.SettingUp.html)  | 
|  MySQL (外部)  |  **将转储加载到外部 MySQL 数据库** 您无法将数据库快照或数据库集群快照加载到外部 MySQL 数据库中。您必须使用 `mysqldump` 命令的输出。 [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/AmazonRDS/latest/AuroraUserGuide/AuroraMySQL.Replication.MySQL.SettingUp.html)  | 

## 5. 在您的复制源上创建复制用户
<a name="AuroraMySQL.Replication.MySQL.CreateReplUser"></a>

在源上创建一个专用于复制的用户 ID。以下示例适用于 RDS for MySQL 或外部 MySQL 源数据库。

```
mysql> CREATE USER 'repl_user'@'domain_name' IDENTIFIED BY 'password';
```

对于 Aurora MySQL 源数据库，`skip_name_resolve` 数据库集群参数设置为 `1`（`ON`）且无法修改，因此您必须使用主机的 IP 地址而不是域名。有关更多信息，请参阅 MySQL 文档中的 [skip\$1name\$1resolve](https://dev.mysql.com/doc/refman/8.0/en/server-system-variables.html#sysvar_skip_name_resolve)。

```
mysql> CREATE USER 'repl_user'@'IP_address' IDENTIFIED BY 'password';
```

该用户需要 `REPLICATION CLIENT` 和 `REPLICATION SLAVE` 权限。向该用户授予这些权限。

如果您需要使用加密复制，则需为复制用户要求 SSL 连接。例如，您可以使用下面的语句之一来要求对用户账户 `repl_user` 使用 SSL 连接。

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

```
GRANT USAGE ON *.* TO 'repl_user'@'IP_address' REQUIRE SSL;
```

**注意**  
如果不包括 `REQUIRE SSL`，则复制连接可能会无提示地返回到未加密连接。

## 6. 在副本目标上开启复制
<a name="AuroraMySQL.Replication.MySQL.EnableReplication"></a>

开启复制之前，建议您手动创建 Aurora MySQL 数据库集群或 RDS for MySQL 数据库实例副本目标的快照。如果出现问题，而您需要重新建立与数据库集群或数据库实例副本目标间的复制，则您可以从此快照还原数据库集群或数据库实例，而不必再次将数据导入您的副本目标之中。

使用以下说明对数据库引擎开启复制。


|  数据库引擎  |  说明  | 
| --- | --- | 
|   Aurora MySQL   |  **从 Aurora MySQL 数据库集群中开启复制**  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/AmazonRDS/latest/AuroraUserGuide/AuroraMySQL.Replication.MySQL.SettingUp.html) 要使用 SSL 加密，请将最终值设置为 `1` 而不是 `0`。  | 
|   RDS for MySQL   |   **从 Amazon RDS 数据库实例中开启复制**  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/AmazonRDS/latest/AuroraUserGuide/AuroraMySQL.Replication.MySQL.SettingUp.html) 要使用 SSL 加密，请将最终值设置为 `1` 而不是 `0`。  | 
|   MySQL (外部)   |   **开启从外部 MySQL 数据库进行复制**  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/AmazonRDS/latest/AuroraUserGuide/AuroraMySQL.Replication.MySQL.SettingUp.html)  | 

如果复制失败，可能会导致副本上的意外输入/输出大量增加，从而降低性能。如果复制失败或不再需要复制，则可运行 [mysql.rds\$1reset\$1external\$1master（Aurora MySQL 版本 2）](mysql-stored-proc-replicating.md#mysql_rds_reset_external_master) 或 [mysql.rds\$1reset\$1external\$1source（Aurora MySQL 版本 3）](mysql-stored-proc-replicating.md#mysql_rds_reset_external_source) 存储过程来删除复制配置。

### 设置停止复制到只读副本的位置
<a name="AuroraMySQL.Replication.StartReplicationUntil"></a>

在 Aurora MySQL 版本 3.04 及更高版本中，您可以使用 [mysql.rds\$1start\$1replication\$1until（Aurora MySQL 版本 3）](mysql-stored-proc-replicating.md#mysql_rds_start_replication_until) 存储过程启动复制，然后在指定的二进制日志文件位置停止复制。

**开始复制到只读副本并在特定位置处停止复制**

1. 通过使用 MySQL 客户端，以主用户的身份连接到副本 Aurora MySQL 数据库集群。

1. 运行 [mysql.rds\$1start\$1replication\$1until（Aurora MySQL 版本 3）](mysql-stored-proc-replicating.md#mysql_rds_start_replication_until) 存储过程。

   以下示例将启动复制并复制更改，直到它到达 `120` 二进制日志文件中的 `mysql-bin-changelog.000777` 位置。在灾难恢复方案中，假定位置 `120` 刚好位于灾难之前。

   ```
   call mysql.rds_start_replication_until(
     'mysql-bin-changelog.000777',
     120);
   ```

当到达停止点时，复制将自动停止。将生成以下 RDS 事件：`Replication has been stopped since the replica reached the stop point specified by the rds_start_replication_until stored procedure`。

如果使用基于 GTID 的复制，请使用 [mysql.rds\$1start\$1replication\$1until\$1gtid（Aurora MySQL 版本 3）](mysql-stored-proc-gtid.md#mysql_rds_start_replication_until_gtid) 存储过程而不是 [mysql.rds\$1start\$1replication\$1until（Aurora MySQL 版本 3）](mysql-stored-proc-replicating.md#mysql_rds_start_replication_until) 存储过程。有关基于 GTID 的复制的更多信息，请参阅[使用基于 GTID 的复制](mysql-replication-gtid.md)。

## 7. 监控副本
<a name="AuroraMySQL.Replication.MySQL.Monitor"></a>

 在设置与 Aurora MySQL 数据库集群的 MySQL 复制时，您必须在 Aurora MySQL 数据库集群作为副本目标时监控它的失效转移事件。如果发生失效转移，则可能会在具有不同网络地址的新主机上重新创建作为副本目标的数据库集群。有关如何监控失效转移事件的信息，请参阅[使用 Amazon RDS 事件通知](USER_Events.md)。

 您还可以通过连接到副本目标并运行 `SHOW SLAVE STATUS`（Aurora MySQL 版本 2）或 `SHOW REPLICA STATUS`（Aurora MySQL 版本 3）命令，监控副本目标落后于复制源的程度。命令输出中的 `Seconds Behind Master` 字段可以揭示副本目标落后于源的程度。

**重要**  
如果您升级数据库集群并指定自定义参数组，请确保在升级完成后手动重启集群。这样可以让集群使用新的自定义参数设置，并重新启动二进制日志复制。

## 在复制源和目标之间同步密码
<a name="AuroraMySQL.Replication.passwords"></a>

 使用 SQL 语句更改复制源上的用户账户和密码时，这些更改将自动复制到复制目标。

 如果您使用 AWS 管理控制台、AWS CLI 或 RDS API 来更改复制源上的主密码，则这些更改不会自动复制到复制目标。如果要在源系统和目标系统之间同步主用户和主密码，则必须自己对复制目标进行相同的更改。