

# 使用 Amazon Aurora MySQL 进行复制
<a name="AuroraMySQL.Replication"></a><a name="replication"></a>

 Aurora MySQL 复制特征是提高集群可用性与性能的关键所在。Aurora 可以帮助您轻松创建集群并调整大小（最多可创建 15 个 Aurora 副本）。

 所有副本采用相同的基础数据。如果某些数据库实例离线，其他处于可用状态的数据库实例将继续处理查询，或者在需要时作为写入器接管这些实例。Aurora 会自动将您的只读连接分配到多个数据库实例中，从而帮助 Aurora 集群更好地支持查询密集型工作负载。

在以下主题中，您可以了解 Aurora MySQL 复制的工作方式以及如何微调复制设置以获得最佳的可用性和性能。

**Topics**
+ [使用 Aurora 副本](#AuroraMySQL.Replication.Replicas)
+ [Amazon Aurora MySQL 的复制选项](#AuroraMySQL.Replication.Options)
+ [Amazon Aurora MySQL 复制的性能注意事项](#AuroraMySQL.Replication.Performance)
+ [Amazon Aurora MySQL 的零停机重启 (ZDR)](AuroraMySQL.Replication.Availability.md)
+ [使用 Aurora MySQL 配置复制筛选条件](AuroraMySQL.Replication.Filters.md)
+ [监控 Amazon Aurora MySQL 复制](#AuroraMySQL.Replication.Monitoring)
+ [跨 AWS 区域复制 Amazon Aurora MySQL 数据库集群](AuroraMySQL.Replication.CrossRegion.md)
+ [Aurora 与 MySQL 之间或 Aurora 与其他 Aurora 数据库集群之间的复制（二进制日志复制）](AuroraMySQL.Replication.MySQL.md)
+ [使用基于 GTID 的复制](mysql-replication-gtid.md)

## 使用 Aurora 副本
<a name="AuroraMySQL.Replication.Replicas"></a>

 Aurora 副本是 Aurora 数据库集群中的独立终端节点，最适合用于扩展读取操作以及提高可用性。对于数据库集群在 AWS 区域中所跨的多个可用区，最多可以分配 15 个 Aurora 副本。虽然数据库集群卷由数据库集群的多个数据副本组成，但集群卷中的数据表示为数据库集群中的主实例和 Aurora 副本的单个逻辑卷。有关 Aurora 副本的更多信息，请参阅 [Aurora 副本](Aurora.Replication.md#Aurora.Replication.Replicas)。

 Aurora 副本十分适用于读取扩展，因为它们完全专用于集群卷上的读取操作。写入操作由主实例进行管理。由于集群卷是在 Aurora MySQL 数据库集群中的所有实例之间共享的，因此，无需执行额外的操作以复制每个 Aurora 副本的数据副本。相比之下，MySQL 只读副本必须在单一线程上，重放从源数据库实例向其本地数据存储的所有写入操作。此限制会影响到 MySQL 只读副本支持海量读取流量的能力。

 对于 Aurora MySQL，在删除 Aurora 副本时，将立即删除其实例终端节点，并将 Aurora 副本从读取器终端节点中删除。如果在正待删除的 Aurora 副本上运行语句，则有 3 分钟宽限期。现有语句可在此宽限期内正常完成。当此宽限期结束后，将关闭并删除 Aurora 副本。

**重要**  
 对于在 InnoDB 表上执行的操作，Aurora MySQL 的 Aurora 副本始终使用 `REPEATABLE READ` 默认事务隔离级别。仅对于 Aurora MySQL 数据库集群的主实例，您可以使用 `SET TRANSACTION ISOLATION LEVEL` 命令更改事务级别。该限制避免在 Aurora 副本上出现用户级锁定，并允许 Aurora 副本扩展以支持数千个活动用户连接，同时仍保持最小的副本滞后时间。

**注意**  
 在主实例上运行的 DDL 语句可能会中断关联的 Aurora 副本上的数据库连接。如果 Aurora 副本连接主动使用数据库对象（如表），并且使用 DDL 语句在主实例上修改该对象，则会中断 Aurora 副本连接。

**注意**  
 中国 (宁夏) 区域不支持跨区域只读副本。

## Amazon Aurora MySQL 的复制选项
<a name="AuroraMySQL.Replication.Options"></a>

您可以在以下任意选项之间设置复制：
+ 不同 AWS 区域中的两个 Aurora MySQL 数据库集群（通过创建 Aurora MySQL 数据库集群的跨区域只读副本）。

  有关更多信息，请参阅 [跨 AWS 区域复制 Amazon Aurora MySQL 数据库集群](AuroraMySQL.Replication.CrossRegion.md)。
+ 同一 AWS 区域中的两个 Aurora MySQL 数据库集群 [通过使用 MySQL 二进制日志（binlog）复制]。

  有关更多信息，请参阅 [Aurora 与 MySQL 之间或 Aurora 与其他 Aurora 数据库集群之间的复制（二进制日志复制）](AuroraMySQL.Replication.MySQL.md)。
+ 一个 RDS for MySQL 数据库实例（作为源）和一个 Aurora MySQL 数据库集群（通过创建 RDS for MySQL 数据库实例的 Aurora 只读副本）。

  您可以使用此方法在迁移到 Aurora 期间将现有和持续的数据更改纳入 Aurora MySQL 中。有关更多信息，请参阅 [使用 Aurora 只读副本将数据从 RDS for MySQL 数据库实例迁移到 Amazon Aurora MySQL 数据库集群](AuroraMySQL.Migrating.RDSMySQL.Replica.md)。

  您还可以使用此方法提高数据读取查询的可扩展性。您可以通过使用只读 Aurora MySQL 集群中的一个或多个数据库实例查询数据来执行此操作。有关更多信息，请参阅 [使用 Amazon Aurora 扩展 MySQL 数据库的读取](AuroraMySQL.Replication.ReadScaling.md)。
+ 一个 AWS 区域中的一个 Aurora MySQL 数据库集群和不同区域中最多五个 Aurora 只读 Aurora MySQL 数据库集群（通过创建 Aurora 全局数据库）。

  您可以使用 Aurora 全部数据库来支持覆盖全球范围的应用程序。主 Aurora MySQL 数据库集群有一个写入器实例和最多 15 个 Aurora 副本。每一个只读辅助 Aurora MySQL 数据库集群最多可以由 16 个 Aurora 副本组成。有关更多信息，请参阅“[使用 Amazon Aurora Global Database](aurora-global-database.md)”。

**注意**  
重新引导 Amazon Aurora 数据库集群的主实例还会自动重新引导该数据库集群的 Aurora 副本，以便重新建立入口点来确保数据库集群中的读/写一致性。

## Amazon Aurora MySQL 复制的性能注意事项
<a name="AuroraMySQL.Replication.Performance"></a>

以下特征可以帮助您微调 Aurora MySQL 复制性能。

副本日志压缩特征自动降低复制消息的网络带宽。由于每条消息将传输到所有 Aurora 副本，因此，较大的集群的好处更大。该特征在写入方节点上产生一些 CPU 开销以执行压缩。在 Aurora MySQL 版本 2 和版本 3 中，始终启用它。

二进制日志筛选特征自动降低复制消息的网络带宽。由于 Aurora 副本不使用复制消息中包含的二进制日志信息，因此，将从发送到这些节点的消息中省略该数据。

在 Aurora MySQL 版本 2 中，您可以通过更改 `aurora_enable_repl_bin_log_filtering` 参数来控制此特征。默认情况下，该参数为 on。由于该优化应该是透明的，因此，您只能在诊断或故障排除期间禁用该设置以解决与复制相关的问题。例如，与无法使用该特征的旧 Aurora MySQL 集群的行为相符。

在 Aurora MySQL 版本 3 中，二进制日志筛选始终处于启用状态。

# Amazon Aurora MySQL 的零停机重启 (ZDR)
<a name="AuroraMySQL.Replication.Availability"></a><a name="zdr"></a>

零停机重启 (ZDR) 特征可以在某些类型的重启期间保留与数据库实例的部分或全部活动连接。ZDR 适用于 Aurora 自动执行以解决错误条件的重启，例如，当副本开始远远落后于源时。

**重要**  
ZDR 机制运作以尽力而为作为原则。Aurora MySQL 版本、实例类、错误条件、兼容的 SQL 操作以及确定 ZDR 应用位置的其他因素随时可能会发生变化。

Aurora MySQL 2.x 的 ZDR 需要版本 2.10 及更高版本。ZDR 在 Aurora MySQL 3.x 的所有次要版本中都可用。在 Aurora MySQL 版本 2 和 3 中，ZDR 机制默认处于开启状态，且 Aurora 不使用 `aurora_enable_zdr` 参数。

Aurora 会在 **Event（事件)** 页面中报告与零停机时间重新启动相关的活动。Aurora 在尝试使用 ZDR 机制重新启动时会记录一个事件。此事件说明了 Aurora 重启的原因。然后，在重启完成后，Aurora 会记录另一个事件。这最后一个事件报告了进程所用时长，以及在重启期间保留或丢弃的连接数。您可以查看数据库错误日志，了解有关重启期间所发生情况的更多详细信息。

尽管成功执行 ZDR 操作后连接保持不变，但一些变量和特征会重新初始化。通过零停机重启进行重启后，以下类型的信息将不会保留：
+ 全局变量。Aurora 将恢复会话变量，但重启后不会恢复全局变量。
+ 状态变量。特别是，引擎状态报告的正常运行时间值将重置。
+ `LAST_INSERT_ID`. 
+ 表的内存中 `auto_increment` 状态。重新初始化内存中的自动增量状态。有关自动增量值的更多信息，请参阅 [MySQL 参考手册](https://dev.mysql.com/doc/refman/8.0/en/innodb-auto-increment-handling.html#innodb-auto-increment-initialization)。
+ 来自 `INFORMATION_SCHEMA` 和 `PERFORMANCE_SCHEMA` 表的诊断信息。这些诊断信息也会显示在 `SHOW PROFILE` 和 `SHOW PROFILES` 等命令的输出中。

下表显示了版本、实例角色以及确定在重启集群中的数据库实例时 Aurora 是否可以使用 ZDR 机制的其他情况。


| Aurora MySQL version | ZDR 适用于写入器吗？ | ZDR 适用于读取器吗？ | ZDR 始终处于启用状态？ | 注意 | 
| --- | --- | --- | --- | --- | 
|  2.x，低于 2.10.0  |  否  |  否  |  不适用  |  ZDR 不适用于这些版本。  | 
|  2.10.0–2.11.0  |  是  |  是  |  是  |  Aurora 回滚活动连接上正在执行的所有事务。您的应用程序必须重试事务。 Aurora 取消任何使用 TLS/SSL、临时表、表锁定或用户锁定的连接。  | 
|  2.11.1 及更高版本  |  是  |  是  |  是  |  Aurora 回滚活动连接上正在执行的所有事务。您的应用程序必须重试事务。 Aurora 取消任何使用临时表、表锁定或用户锁定的连接。  | 
|  3.01–3.03  |  是  |  是  |  是  |  Aurora 回滚活动连接上正在执行的所有事务。您的应用程序必须重试事务。 Aurora 取消任何使用 TLS/SSL、临时表、表锁定或用户锁定的连接。  | 
|  3.04 及更高版本  |  是  |  是  |  是  |  Aurora 回滚活动连接上正在执行的所有事务。您的应用程序必须重试事务。 Aurora 取消任何使用临时表、表锁定或用户锁定的连接。  | 

# 使用 Aurora MySQL 配置复制筛选条件
<a name="AuroraMySQL.Replication.Filters"></a>

您可以使用复制筛选条件来指定使用只读副本的数据库和表。复制筛选条件可以将数据库和表包含在复制之中或排除在复制之外。

以下是复制筛选条件的一些使用案例：
+ 缩减只读副本的大小。使用复制筛选，您可以排除只读副本上不需要的数据库和表。
+ 出于安全原因，将数据库和表从只读副本中排除。
+ 在不同只读副本中为特定使用案例复制不同的数据库和表。例如，您可以使用特定的只读副本进行分析或分片。
+ 对于在不同 AWS 区域中具有只读副本的数据库集群，要在不同的 AWS 区域中复制不同的数据库或表。
+ 指定使用 Aurora MySQL 数据库集群复制哪些数据库和表，该集群配置为入站复制拓扑中的副本。有关此配置的更多信息，请参阅[Aurora 与 MySQL 之间或 Aurora 与其他 Aurora 数据库集群之间的复制（二进制日志复制）](AuroraMySQL.Replication.MySQL.md)。

**Topics**
+ [设置 Aurora MySQL 的复制筛选参数](#AuroraMySQL.Replication.Filters.Configuring)
+ [Aurora MySQL 的复制筛选限制](#AuroraMySQL.Replication.Filters.Limitations)
+ [Aurora MySQL 的复制筛选示例](#AuroraMySQL.Replication.Filters.Examples)
+ [查看只读副本的复制筛选条件](#AuroraMySQL.Replication.Filters.Viewing)

## 设置 Aurora MySQL 的复制筛选参数
<a name="AuroraMySQL.Replication.Filters.Configuring"></a>

要配置复制筛选条件，请设置以下参数：
+ `binlog-do-db` –将更改复制到指定的二进制日志。为二进制日志源集群设置此参数时，仅复制在此参数中指定的二进制日志。
+ `binlog-ignore-db` –不将更改复制到指定的二进制日志。为二进制日志源集群设置 `binlog-do-db` 参数时，不会评估此参数。
+ `replicate-do-db` –将更改复制到指定的数据库。为二进制日志副本集群设置此参数时，仅复制在参数中指定的数据库。
+ `replicate-ignore-db` –不将更改复制到指定的数据库。为二进制日志副本集群设置 `replicate-do-db` 参数时，不会评估此参数。
+ `replicate-do-table` –将更改复制到指定的表。为只读副本设置此参数时，仅复制参数中指定的表。此外，设置 `replicate-do-db` 或 `replicate-ignore-db` 参数时，请确保包含指定表的数据库包含在使用二进制日志副本集群的复制中。
+ `replicate-ignore-table` –不将更改复制到指定的表。为二进制日志副本集群设置 `replicate-do-table` 参数时，不会评估此参数。
+ `replicate-wild-do-table` – 根据指定的数据库和表名模式复制表。支持 `%` 和 `_` 通配符。设置 `replicate-do-db` 或 `replicate-ignore-db` 参数时，请确保包含指定表的数据库包含在使用二进制日志副本集群的复制中。
+ `replicate-wild-ignore-table` –不基于指定的数据库和表名模式复制表。支持 `%` 和 `_` 通配符。为二进制日志副本集群设置 `replicate-do-table` 或 `replicate-wild-do-table` 参数时，不会评估此参数。

将按这些参数列出的顺序对其进行评估。有关这些参数如何运行的更多信息，请参阅 MySQL 文档：
+ 有关一般信息，请参阅[副本服务器选项和变量](https://dev.mysql.com/doc/refman/8.0/en/replication-options-replica.html)。
+ 有关如何评估数据库复制筛选参数的信息，请参阅[评估数据库级复制和二进制日志记录选项](https://dev.mysql.com/doc/refman/8.0/en/replication-rules-db-options.html)。
+ 有关如何评估表复制筛选参数的信息，请参阅[评估表级复制选项](https://dev.mysql.com/doc/refman/8.0/en/replication-rules-table-options.html)。

默认情况下，这些参数中的每个参数都具有一个空值。在每个二进制日志集群上，您可以使用这些参数来设置、更改和删除复制筛选条件。设置其中一个参数时，请用逗号将各筛选条件分开。

您可以在 `%` 和 `_` 参数中使用 `replicate-wild-do-table` 和 `replicate-wild-ignore-table` 通配符。`%` 通配符可以匹配任意数量的字符，而 `_` 通配符只能匹配一个字符。

源数据库实例的二进制日志记录格式对于复制非常重要，因为它决定了数据更改的记录。`binlog_format` 参数的设置将决定复制是基于行还是基于语句的复制。有关更多信息，请参阅“[为单可用区数据库配置 Aurora MySQL 二进制日志记录](USER_LogAccess.MySQL.BinaryFormat.md)”。

**注意**  
无论源数据库实例上的 `binlog_format` 设置如何，所有数据定义语言 (DDL) 语句都将作为语句进行复制。

## Aurora MySQL 的复制筛选限制
<a name="AuroraMySQL.Replication.Filters.Limitations"></a>

以下限制适用于 Aurora MySQL 的复制筛选：
+ 仅 Aurora MySQL 版本 3 支持复制筛选条件。
+ 每个复制筛选参数不得超过 2000 个字符。
+ 复制筛选条件中不支持逗号。
+ 复制筛选不支持 XA 事务。

  有关更多信息，请参阅 MySQL 文档中的[XA 事务限制](https://dev.mysql.com/doc/refman/8.0/en/xa-restrictions.html)。

## Aurora MySQL 的复制筛选示例
<a name="AuroraMySQL.Replication.Filters.Examples"></a>

要为只读副本配置复制筛选，请修改与只读副本关联的数据库集群参数组中的复制筛选参数。

**注意**  
您无法修改默认数据库集群参数组。如果只读副本使用默认参数组，请创建新的参数组并将其与只读副本关联。有关数据库集群参数组的更多信息，请参阅[Amazon Aurora 的参数组](USER_WorkingWithParamGroups.md)。

您可以使用 AWS 管理控制台、AWS CLI 或 RDS API 在数据库集群参数组中设置参数。有关设置参数的信息，请参阅 [在 Amazon Aurora 中修改数据库参数组中的参数](USER_WorkingWithParamGroups.Modifying.md)。在数据库集群参数组中设置参数时，与参数组关联的所有数据库集群都使用参数设置。如果在数据库集群参数组中设置复制筛选参数，请确保参数组仅与只读副本集群关联。将源数据库实例的复制筛选参数留空。

以下示例使用 AWS CLI 设置参数。这些示例将 `ApplyMethod` 设置为 `immediate`，以便在 CLI 命令完成后立即发生参数更改。如果希望在只读副本重新启动后应用待处理的更改，请将 `ApplyMethod` 设置为 `pending-reboot`。

以下示例设置了复制筛选条件：
+ [Including databases in replication](#rep-filter-in-dbs-ams)
+ [Including tables in replication](#rep-filter-in-tables-ams)
+ [Including tables in replication with wildcard characters](#rep-filter-in-tables-wildcards-ams)
+ [Excluding databases from replication](#rep-filter-ex-dbs-ams)
+ [Excluding tables from replication](#rep-filter-ex-tables-ams)
+ [Excluding tables from replication using wildcard characters](#rep-filter-ex-tables-wildcards-ams)<a name="rep-filter-in-dbs-ams"></a>

**Example 将数据库包含在复制之中**  
以下示例将 `mydb1` 和 `mydb2` 数据库包含在复制之内。  
对于 Linux、macOS 或 Unix：  

```
aws rds modify-db-cluster-parameter-group \
  --db-cluster-parameter-group-name myparametergroup \
  --parameters "ParameterName=replicate-do-db,ParameterValue='mydb1,mydb2',ApplyMethod=immediate"
```
对于 Windows：  

```
aws rds modify-db-cluster-parameter-group ^
  --db-cluster-parameter-group-name myparametergroup ^
  --parameters "ParameterName=replicate-do-db,ParameterValue='mydb1,mydb2',ApplyMethod=immediate"
```<a name="rep-filter-in-tables-ams"></a>

**Example 将表包含在复制之中**  
以下示例将数据库 `table1` 中的 `table2` 和 `mydb1` 表包含在复制之中。  
对于 Linux、macOS 或 Unix：  

```
aws rds modify-db-cluster-parameter-group \
  --db-cluster-parameter-group-name myparametergroup \
  --parameters "ParameterName=replicate-do-table,ParameterValue='mydb1.table1,mydb1.table2',ApplyMethod=immediate"
```
对于 Windows：  

```
aws rds modify-db-cluster-parameter-group ^
  --db-cluster-parameter-group-name myparametergroup ^
  --parameters "ParameterName=replicate-do-table,ParameterValue='mydb1.table1,mydb1.table2',ApplyMethod=immediate"
```<a name="rep-filter-in-tables-wildcards-ams"></a>

**Example 使用通配符将表包含在复制之中**  
以下示例将数据库 `order` 中名称以 `return` 和 `mydb` 开头的表包含在复制之中。  
对于 Linux、macOS 或 Unix：  

```
aws rds modify-db-cluster-parameter-group \
  --db-cluster-parameter-group-name myparametergroup \
  --parameters "ParameterName=replicate-wild-do-table,ParameterValue='mydb.order%,mydb.return%',ApplyMethod=immediate"
```
对于 Windows：  

```
aws rds modify-db-cluster-parameter-group ^
  --db-cluster-parameter-group-name myparametergroup ^
  --parameters "ParameterName=replicate-wild-do-table,ParameterValue='mydb.order%,mydb.return%',ApplyMethod=immediate"
```<a name="rep-filter-ex-dbs-ams"></a>

**Example 将数据库排除在复制之外**  
以下示例将 `mydb5` 和 `mydb6` 数据库排除在复制之外。  
对于 Linux、macOS 或 Unix：  

```
aws rds modify-db-cluster-parameter-group \
  --db-cluster-parameter-group-name myparametergroup \
  --parameters "ParameterName=replicate-ignore-db,ParameterValue='mydb5,mydb6',ApplyMethod=immediate"
```
对于 Windows：  

```
aws rds modify-db-cluster-parameter-group ^
  --db-cluster-parameter-group-name myparametergroup ^
  --parameters "ParameterName=replicate-ignore-db,ParameterValue='mydb5,mydb6,ApplyMethod=immediate"
```<a name="rep-filter-ex-tables-ams"></a>

**Example 将表排除在复制之外**  
以下示例将数据库 `mydb5` 中的表 `table1` 和数据库 `mydb6` 中的表 `table2` 排除在复制之外。  
对于 Linux、macOS 或 Unix：  

```
aws rds modify-db-cluster-parameter-group \
  --db-cluster-parameter-group-name myparametergroup \
  --parameters "ParameterName=replicate-ignore-table,ParameterValue='mydb5.table1,mydb6.table2',ApplyMethod=immediate"
```
对于 Windows：  

```
aws rds modify-db-cluster-parameter-group ^
  --db-cluster-parameter-group-name myparametergroup ^
  --parameters "ParameterName=replicate-ignore-table,ParameterValue='mydb5.table1,mydb6.table2',ApplyMethod=immediate"
```<a name="rep-filter-ex-tables-wildcards-ams"></a>

**Example 使用通配符将表排除在复制之外**  
以下示例将数据库 `order` 中名称以 `return` 和 `mydb7` 开头的表排除在复制之外。  
对于 Linux、macOS 或 Unix：  

```
aws rds modify-db-cluster-parameter-group \
  --db-cluster-parameter-group-name myparametergroup \
  --parameters "ParameterName=replicate-wild-ignore-table,ParameterValue='mydb7.order%,mydb7.return%',ApplyMethod=immediate"
```
对于 Windows：  

```
aws rds modify-db-cluster-parameter-group ^
  --db-cluster-parameter-group-name myparametergroup ^
  --parameters "ParameterName=replicate-wild-ignore-table,ParameterValue='mydb7.order%,mydb7.return%',ApplyMethod=immediate"
```

## 查看只读副本的复制筛选条件
<a name="AuroraMySQL.Replication.Filters.Viewing"></a>

您可以通过以下方式查看只读副本的复制筛选条件：
+ 检查与只读副本关联的参数组中复制筛选参数的设置。

  有关说明，请参阅[在 Amazon Aurora 中查看数据库参数组的参数值](USER_WorkingWithParamGroups.Viewing.md)。
+ 在 MySQL 客户端中，连接到只读副本并运行 `SHOW REPLICA STATUS` 语句。

  在输出中，以下字段显示了只读副本的复制筛选条件：
  + `Binlog_Do_DB`
  + `Binlog_Ignore_DB`
  + `Replicate_Do_DB`
  + `Replicate_Ignore_DB`
  + `Replicate_Do_Table`
  + `Replicate_Ignore_Table`
  + `Replicate_Wild_Do_Table`
  + `Replicate_Wild_Ignore_Table`

  有关这些字段的更多信息，请参阅 MySQL 文档中的[检查复制状态](https://dev.mysql.com/doc/refman/8.0/en/replication-administration-status.html)。

## 监控 Amazon Aurora MySQL 复制
<a name="AuroraMySQL.Replication.Monitoring"></a>

读取扩展和高可用性依赖于尽可能短的滞后时间。您可以通过监控 Amazon CloudWatch `AuroraReplicaLag` 指标来监控 Aurora 副本滞后于 Aurora MySQL 数据库集群主实例的时间。`AuroraReplicaLag` 指标记录在每个 Aurora 副本中。

主数据库实例还记录 `AuroraReplicaLagMaximum` 和 `AuroraReplicaLagMinimum` Amazon CloudWatch 指标。`AuroraReplicaLagMaximum` 指标记录主数据库实例与数据库集群中每个 Aurora 副本之间的最大滞后量。`AuroraReplicaLagMinimum` 指标记录主数据库实例与数据库集群中每个 Aurora 副本之间的最小滞后量。

如果您需要 Aurora 副本滞后的最新值，可在 Amazon CloudWatch 中检查 `AuroraReplicaLag` 指标。有关 Aurora MySQL 数据库集群的每个 Aurora 副本的 Aurora 副本滞后也会记录在 `information_schema.replica_host_status` 表中。有关此表的更多信息，请参阅 [information\$1schema.replica\$1host\$1status](AuroraMySQL.Reference.ISTables.md#AuroraMySQL.Reference.ISTables.replica_host_status)。

有关监控 RDS 实例和 CloudWatch 指标的更多信息，请参阅[监控 Amazon Aurora 集群中的指标](MonitoringAurora.md)。

# 跨 AWS 区域复制 Amazon Aurora MySQL 数据库集群
<a name="AuroraMySQL.Replication.CrossRegion"></a>

 您可以在与源数据库集群不同的 AWS 区域中创建 Amazon Aurora MySQL 数据库集群作为只读副本。采用此方法可增强灾难恢复能力，允许您将读取操作扩展到更靠近用户的 AWS 区域，并使从一个 AWS 区域迁移到另一个区域变得更轻松。

 您可以创建加密和不加密数据库集群的只读副本。如果加密了源数据库集群，则必须加密只读副本。

 对于每个源数据库集群，您最多可以具有 5 个作为只读副本的跨区域数据库集群。

**注意**  
 作为跨区域只读副本的替代方案，您可以使用 Aurora 全局数据库以最小的延迟时间来扩展读取操作。1 个 Aurora Global Database 在 1 个 AWS 区域中有 1 个主 Aurora 数据库集群，在不同区域中最多有 10 个辅助只读数据库集群。每个辅助数据库集群最多可以包含 16 个（而不是 15）Aurora 副本。从主数据库集群到所有辅助集群的复制由 Aurora 存储层而不是由数据库引擎处理，因此复制更改的延迟最短，通常不到 1 秒。将数据库引擎排除在复制过程之外意味着数据库引擎专用于处理工作负载。这还意味着您不需要配置或管理 Aurora MySQL 二进制日志（二进制日志记录）复制。要了解更多信息，请参阅[使用 Amazon Aurora Global Database](aurora-global-database.md)。

 当您在另一个 AWS 区域中创建 Aurora MySQL 数据库集群只读副本时，您应了解：
+  源数据库集群和跨区域只读副本数据库集群最多可以具有 15 个 Aurora 副本以及数据库集群的主实例。通过使用该功能，您可以扩展源 AWS 区域和复制目标 AWS 区域的读取操作。
+  在跨区域方案中，由于各 AWS 区域之间的网络通道更长，因此，源数据集群和只读副本之间的滞后时间更长。
+  跨区域复制时传输的数据可产生 Amazon RDS 数据传输费用。以下跨区域复制操作会针对传输到源 AWS 区域以外的数据收取费用：
  +  在创建只读副本时，Amazon RDS 将创建源集群的快照，并将快照传输到保存只读副本的 AWS 区域。
  +  对于源数据库中做出的每项数据修改，Amazon RDS 都会将数据从源区域传输到保存只读副本的 AWS 区域。

   有关 Amazon RDS 数据传输定价的更多信息，请参阅 [Amazon Aurora 定价](https://aws.amazon.com/rds/aurora/pricing/)。
+  您可以为引用相同源数据库集群的只读副本运行多个并发创建或删除操作。不过，您必须保持在每个源数据库集群中具有 5 个只读副本的限制。
+  为了有效地进行复制，每个只读副本应具有与源数据库集群相同数量的计算和存储资源。如果扩展源数据库集群，您还应扩展只读副本。

**Topics**
+ [开始前的准备工作](#AuroraMySQL.Replication.CrossRegion.Prerequisites)
+ [创建 Aurora MySQL 的跨区域只读副本数据库集群](AuroraMySQL.Replication.CrossRegion.Creating.md)
+ [将只读副本提升为 Aurora MySQL 的数据库集群](AuroraMySQL.Replication.CrossRegion.Promote.md)
+ [Amazon Aurora MySQL 的跨区域副本故障排除](AuroraMySQL.Replication.CrossRegion.Troubleshooting.md)

## 开始前的准备工作
<a name="AuroraMySQL.Replication.CrossRegion.Prerequisites"></a>

 在创建作为跨区域只读副本的 Aurora MySQL 数据库集群之前，必须先在源 Aurora MySQL 数据库集群上开启二进制日志记录。Aurora MySQL 的跨区域复制使用 MySQL 二进制复制来重放对跨区域只读副本数据库集群的更改。

 要在 Aurora MySQL 数据库集群上开启二进制日志记录，请更新源数据库集群的 `binlog_format` 参数。`binlog_format` 参数是默认集群参数组中的集群级参数。如果数据库集群使用默认的数据库集群参数组，则需创建新的数据库集群参数组来修改 `binlog_format` 设置。建议您将 `binlog_format` 设置为 `MIXED`。不过，您也可以将 `binlog_format` 设置为 `ROW` 或 `STATEMENT` (如果您需要特定的二进制日志格式)。重启您的 Aurora 数据库集群以使更改生效。

 有关对 Aurora MySQL 使用二进制日志记录的更多信息，请参阅 [Aurora 与 MySQL 之间或 Aurora 与其他 Aurora 数据库集群之间的复制（二进制日志复制）](AuroraMySQL.Replication.MySQL.md)。有关修改 Aurora MySQL 配置参数的更多信息，请参阅 [Amazon Aurora 数据库集群和数据库实例参数](USER_WorkingWithDBClusterParamGroups.md#Aurora.Managing.ParameterGroups) 和 [Amazon Aurora 的参数组](USER_WorkingWithParamGroups.md)。

# 创建 Aurora MySQL 的跨区域只读副本数据库集群
<a name="AuroraMySQL.Replication.CrossRegion.Creating"></a>

 您可以使用AWS 管理控制台、AWS Command Line Interface（AWS CLI）或 Amazon RDS API 创建作为跨区域只读副本的 Aurora 数据库集群。您可以从加密和未加密的数据库集群中创建跨区域只读副本。

 在使用 AWS 管理控制台 为 Aurora MySQL 创建跨区域只读副本时，Amazon RDS 先在目标 AWS 区域中创建一个数据库集群，然后自动为该数据库集群创建一个数据库实例以作为主实例。

 使用 AWS CLI 或 RDS API 创建跨区域只读副本时，您需要首先在目标 AWS 区域创建数据库集群，然后等待它变为活动状态。一旦处于活动状态，您就可以为该数据库集群创建一个数据库实例作为主实例。

 当只读副本数据库集群的主实例可用时，复制开始。

 执行以下过程从 Aurora MySQL 数据库集群创建跨区域只读副本。这些步骤适用于从加密和未加密的数据库集群中创建只读副本。

## 控制台
<a name="AuroraMySQL.Replication.CrossRegion.Creating.Console"></a>

**使用AWS 管理控制台创建作为跨区域只读副本的 Aurora MySQL 数据库集群**

1. 登录AWS 管理控制台并通过以下网址打开 Amazon RDS 控制台：[https://console.aws.amazon.com/rds/](https://console.aws.amazon.com/rds/)。

1.  在 AWS 管理控制台的右上角，选择托管源数据库集群的 AWS 区域。

1.  在导航窗格中，选择 **Databases**（数据库）。

1.  选择要为其创建跨区域只读副本的数据库集群。

1. 对于 **Actions**（操作），请选择 **Create cross-Region read replica**（创建跨区域只读副本）。

1.  在 **Create cross region read replica (创建跨区域只读副本)** 页面上，选择跨区域只读副本数据库集群的选项设置，如下表中所述。    
<a name="cross-region-read-replica-settings"></a>[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/AmazonRDS/latest/AuroraUserGuide/AuroraMySQL.Replication.CrossRegion.Creating.html)

1.  选择 **Create (创建)** 以创建 Aurora 的跨区域只读副本。

## AWS CLI
<a name="AuroraMySQL.Replication.CrossRegion.Creating.CLI"></a>

**使用 CLI 创建作为跨区域只读副本的 Aurora MySQL 数据库集群**

1.  在要创建只读副本数据库集群的 AWS 区域中调用 AWS CLI [create-db-cluster](https://docs.aws.amazon.com/cli/latest/reference/rds/create-db-cluster.html) 命令。包括 `--replication-source-identifier` 选项并指定要创建只读副本的源数据库集群的 Amazon Resource Name (ARN)。

    对于由 `--replication-source-identifier` 标识的数据库集群已加密的跨区域复制，请指定 `--kms-key-id` 选项和 `--storage-encrypted` 选项。
**注意**  
 通过指定 `--storage-encrypted` 并提供 `--kms-key-id` 的值，您可以设置从未加密数据库集群到加密只读副本的跨区域复制。

    您无法指定 `--master-username` 和 `--master-user-password` 参数。这些值取自源数据库集群。

    以下代码示例从 us-west-2 区域的一个未加密数据库集群快照中创建 us-east-1 区域的只读副本。在 us-east-1 区域调用命令。此示例指定了生成主用户密码并在 Secrets Manager 中对其进行管理的 `--manage-master-user-password` 选项。有关更多信息，请参阅 [使用 Amazon Aurora 和 AWS Secrets Manager 管理密码](rds-secrets-manager.md)。或者，您可以使用 `--master-password` 选项自行指定和管理密码。

   对于 Linux、macOS 或 Unix：

   ```
   aws rds create-db-cluster \
     --db-cluster-identifier sample-replica-cluster \
     --engine aurora-mysql \
     --engine-version 8.0.mysql_aurora.3.08.0 \
     --replication-source-identifier arn:aws:rds:us-west-2:123456789012:cluster:sample-master-cluster
   ```

   对于 Windows：

   ```
   aws rds create-db-cluster ^
     --db-cluster-identifier sample-replica-cluster ^
     --engine aurora-mysql ^
     --engine-version 8.0.mysql_aurora.3.08.0 ^
     --replication-source-identifier arn:aws:rds:us-west-2:123456789012:cluster:sample-master-cluster
   ```

    以下代码示例从 us-west-2 区域的一个加密数据库集群快照中创建 us-east-1 区域的只读副本。在 us-east-1 区域调用命令。

   对于 Linux、macOS 或 Unix：

   ```
   aws rds create-db-cluster \
     --db-cluster-identifier sample-replica-cluster \
     --engine aurora-mysql \
     --engine-version 8.0.mysql_aurora.3.08.0 \
     --replication-source-identifier arn:aws:rds:us-west-2:123456789012:cluster:sample-master-cluster \
     --kms-key-id my-us-east-1-key \
     --storage-encrypted
   ```

   对于 Windows：

   ```
   aws rds create-db-cluster ^
     --db-cluster-identifier sample-replica-cluster ^
     --engine aurora-mysql ^
     --engine-version 8.0.mysql_aurora.3.08.0 ^
     --replication-source-identifier arn:aws:rds:us-west-2:123456789012:cluster:sample-master-cluster ^
     --kms-key-id my-us-east-1-key ^
     --storage-encrypted
   ```

   `--source-region` 选项对于 AWS GovCloud（美国东部）和 AWS GovCloud（美国西部）区域之间的跨区域复制是必需的，其中由 `--replication-source-identifier` 标识的数据库集群已加密。对于 `--source-region`，指定源数据库集群的 AWS 区域。

   如果未指定 `--source-region`，请指定 `--pre-signed-url` 值。*预签名 URL* 包含签名版本 4 签名的请求，该请求用于在源 `create-db-cluster`中调用的 AWS 区域 命令。要了解有关 `pre-signed-url` 选项的更多信息，请参阅《AWS CLI 命令参考》中的 [create-db-cluster](https://docs.aws.amazon.com/cli/latest/reference/rds/create-db-cluster.html)。

1.  使用 AWS CLI [describe-db-clusters](https://docs.aws.amazon.com/cli/latest/reference/rds/describe-db-clusters.html) 命令检查数据库集群是否已变为可用状态，如以下示例中所示。

   ```
   aws rds describe-db-clusters --db-cluster-identifier sample-replica-cluster
   ```

    当 **`describe-db-clusters`** 结果显示状态 `available` 时，创建数据库集群的主实例以便复制能够开始。为此，请使用 AWS CLI [create-db-instance](https://docs.aws.amazon.com/cli/latest/reference/rds/create-db-instance.html) 命令，如以下示例中所示。

   对于 Linux、macOS 或 Unix：

   ```
   aws rds create-db-instance \
     --db-cluster-identifier sample-replica-cluster \
     --db-instance-class db.r5.large \
     --db-instance-identifier sample-replica-instance \
     --engine aurora-mysql
   ```

   对于 Windows：

   ```
   aws rds create-db-instance ^
     --db-cluster-identifier sample-replica-cluster ^
     --db-instance-class db.r5.large ^
     --db-instance-identifier sample-replica-instance ^
     --engine aurora-mysql
   ```

    在数据库实例已创建并可用后，复制将开始。您可以调用 AWS CLI [describe-db-instances](https://docs.aws.amazon.com/cli/latest/reference/rds/describe-db-instances.html) 命令以确定数据库实例是否可用。

## RDS API
<a name="AuroraMySQL.Replication.CrossRegion.Creating.API"></a>

**使用 API 创建作为跨区域只读副本的 Aurora MySQL 数据库集群**

1.  在要创建只读副本数据库集群的 AWS 区域中调用 RDS API [CreateDBCluster](https://docs.aws.amazon.com/AmazonRDS/latest/APIReference/API_CreateDBCluster.html) 操作。包括 `ReplicationSourceIdentifier` 参数并指定要创建只读副本的源数据库集群的 Amazon Resource Name (ARN)。

    对于由 `ReplicationSourceIdentifier` 标识的数据库集群已加密的跨区域复制，应指定 `KmsKeyId` 参数并将 `StorageEncrypted` 参数设置为 `true`。
**注意**  
 您可以将 `StorageEncrypted` 指定为 **true** 并提供 `KmsKeyId` 值，以设置从未加密数据库集群到加密只读副本的跨区域复制。在这种情况下，不需要指定 `PreSignedUrl`。

    您无需包含 `MasterUsername` 和 `MasterUserPassword` 参数，因为这些值是从源数据库集群中获取的。

    以下代码示例从 us-west-2 区域的一个未加密数据库集群快照中创建 us-east-1 区域的只读副本。在 us-east-1 区域调用操作。

   ```
   https://rds.us-east-1.amazonaws.com/
     ?Action=CreateDBCluster
     &ReplicationSourceIdentifier=arn:aws:rds:us-west-2:123456789012:cluster:sample-master-cluster
     &DBClusterIdentifier=sample-replica-cluster
     &Engine=aurora-mysql
     &SignatureMethod=HmacSHA256
     &SignatureVersion=4
     &Version=2014-10-31
     &X-Amz-Algorithm=AWS4-HMAC-SHA256
     &X-Amz-Credential=AKIADQKE4SARGYLE/20161117/us-east-1/rds/aws4_request
     &X-Amz-Date=20160201T001547Z
     &X-Amz-SignedHeaders=content-type;host;user-agent;x-amz-content-sha256;x-amz-date
     &X-Amz-Signature=a04c831a0b54b5e4cd236a90dcb9f5fab7185eb3b72b5ebe9a70a4e95790c8b7
   ```

    以下代码示例从 us-west-2 区域的一个加密数据库集群快照中创建 us-east-1 区域的只读副本。在 us-east-1 区域调用操作。

   ```
   https://rds.us-east-1.amazonaws.com/
     ?Action=CreateDBCluster
     &KmsKeyId=my-us-east-1-key
     &StorageEncrypted=true
     &PreSignedUrl=https%253A%252F%252Frds.us-west-2.amazonaws.com%252F
            %253FAction%253DCreateDBCluster
            %2526DestinationRegion%253Dus-east-1
            %2526KmsKeyId%253Dmy-us-east-1-key
            %2526ReplicationSourceIdentifier%253Darn%25253Aaws%25253Ards%25253Aus-west-2%25253A123456789012%25253Acluster%25253Asample-master-cluster
            %2526SignatureMethod%253DHmacSHA256
            %2526SignatureVersion%253D4
            %2526Version%253D2014-10-31
            %2526X-Amz-Algorithm%253DAWS4-HMAC-SHA256
            %2526X-Amz-Credential%253DAKIADQKE4SARGYLE%252F20161117%252Fus-west-2%252Frds%252Faws4_request
            %2526X-Amz-Date%253D20161117T215409Z
            %2526X-Amz-Expires%253D3600
            %2526X-Amz-SignedHeaders%253Dcontent-type%253Bhost%253Buser-agent%253Bx-amz-content-sha256%253Bx-amz-date
            %2526X-Amz-Signature%253D255a0f17b4e717d3b67fad163c3ec26573b882c03a65523522cf890a67fca613
     &ReplicationSourceIdentifier=arn:aws:rds:us-west-2:123456789012:cluster:sample-master-cluster
     &DBClusterIdentifier=sample-replica-cluster
     &Engine=aurora-mysql
     &SignatureMethod=HmacSHA256
     &SignatureVersion=4
     &Version=2014-10-31
     &X-Amz-Algorithm=AWS4-HMAC-SHA256
     &X-Amz-Credential=AKIADQKE4SARGYLE/20161117/us-east-1/rds/aws4_request
     &X-Amz-Date=20160201T001547Z
     &X-Amz-SignedHeaders=content-type;host;user-agent;x-amz-content-sha256;x-amz-date
     &X-Amz-Signature=a04c831a0b54b5e4cd236a90dcb9f5fab7185eb3b72b5ebe9a70a4e95790c8b7
   ```

   对于 AWS GovCloud（美国东部）和 AWS GovCloud（美国西部）区域之间的跨区域复制（其中由 `ReplicationSourceIdentifier` 标识的数据库集群已加密），还应指定 `PreSignedUrl` 参数。预签名 URL 必须是对 `CreateDBCluster` API 操作的有效请求，该操作能够在包含要复制的加密数据库集群的源 AWS 区域中执行。KMS 密钥标识符用于加密只读副本，并且必须是对目标 AWS 区域有效的 KMS 密钥。要自动而非手动生成预签名的 URL，请改用具有 `--source-region` 选项的 AWS CLI [create-db-cluster](https://docs.aws.amazon.com/cli/latest/reference/rds/create-db-cluster.html) 命令。

1.  如下例所示，通过使用 RDS API [DescribeDBClusters](https://docs.aws.amazon.com/AmazonRDS/latest/APIReference/API_DescribeDBClusters.html) 操作检查数据库集群是否可用。

   ```
   https://rds.us-east-1.amazonaws.com/
     ?Action=DescribeDBClusters
     &DBClusterIdentifier=sample-replica-cluster
     &SignatureMethod=HmacSHA256
     &SignatureVersion=4
     &Version=2014-10-31
     &X-Amz-Algorithm=AWS4-HMAC-SHA256
     &X-Amz-Credential=AKIADQKE4SARGYLE/20161117/us-east-1/rds/aws4_request
     &X-Amz-Date=20160201T002223Z
     &X-Amz-SignedHeaders=content-type;host;user-agent;x-amz-content-sha256;x-amz-date
     &X-Amz-Signature=84c2e4f8fba7c577ac5d820711e34c6e45ffcd35be8a6b7c50f329a74f35f426
   ```

    当 `DescribeDBClusters` 结果显示状态 `available` 时，创建数据库集群的主实例以便复制能够开始。为此，请使用 RDS API [CreateDBInstance](https://docs.aws.amazon.com/AmazonRDS/latest/APIReference/API_CreateDBInstance.html) 操作，如以下示例所示。

   ```
   https://rds.us-east-1.amazonaws.com/
     ?Action=CreateDBInstance
     &DBClusterIdentifier=sample-replica-cluster
     &DBInstanceClass=db.r5.large
     &DBInstanceIdentifier=sample-replica-instance
     &Engine=aurora-mysql
     &SignatureMethod=HmacSHA256
     &SignatureVersion=4
     &Version=2014-10-31
     &X-Amz-Algorithm=AWS4-HMAC-SHA256
     &X-Amz-Credential=AKIADQKE4SARGYLE/20161117/us-east-1/rds/aws4_request
     &X-Amz-Date=20160201T003808Z
     &X-Amz-SignedHeaders=content-type;host;user-agent;x-amz-content-sha256;x-amz-date
     &X-Amz-Signature=125fe575959f5bbcebd53f2365f907179757a08b5d7a16a378dfa59387f58cdb
   ```

    在数据库实例已创建并可用后，复制将开始。您可以调用 AWS CLI [DescribeDBInstances](https://docs.aws.amazon.com/AmazonRDS/latest/APIReference/API_DescribeDBInstances.html) 命令以确定数据库实例是否可用。

## 查看 Amazon Aurora MySQL 跨区域副本
<a name="AuroraMySQL.Replication.CrossRegion.Viewing"></a>

 您可以调用 [describe-db-clusters](https://docs.aws.amazon.com/cli/latest/reference/rds/describe-db-clusters.html) AWS CLI 命令或 [DescribeDBClusters](https://docs.aws.amazon.com/AmazonRDS/latest/APIReference/API_DescribeDBClusters.html) RDS API 操作以查看 Amazon Aurora MySQL 数据库集群的跨区域复制关系。在响应中，请参阅 `ReadReplicaIdentifiers` 字段，获取任何跨区域只读副本数据库集群的数据库集群标识符。请参阅 `ReplicationSourceIdentifier` 元素，获取作为复制源的源数据库集群的 ARN。

# 将只读副本提升为 Aurora MySQL 的数据库集群
<a name="AuroraMySQL.Replication.CrossRegion.Promote"></a>

 可将 Aurora MySQL 只读副本提升为独立的数据库集群。提升 Aurora MySQL 只读副本时，其数据库实例将在重启后变得可用。

 通常，如果源数据库集群出现故障，可以作为数据恢复方案将 Aurora MySQL 只读副本提升为单独数据库集群。

 为此，请先创建只读副本，然后监控源数据库集群的故障。如果出现故障，请执行以下操作：

1.  提升只读副本。

1.  将数据库流量定向到提升的数据库集群。

1.  将提升的数据库集群作为源，创建替代只读副本。

 在提升只读副本时，只读副本将成为独立的 Aurora 数据库集群。提升过程可能需要几分钟或更长时间才能完成，具体时间取决于只读副本的大小。将只读副本提升为新数据库集群后，它将与任何其他数据库集群相同。例如，可从中创建只读副本并执行时间点还原操作。还可以为数据库集群创建 Aurora 副本。

 由于经过提升的数据库集群不再是只读副本，因此不能再使用它作为复制目标。

 以下步骤说明将只读副本提升为数据库集群的一般过程：

1.  停止向只读副本源数据库集群写入任何事务，然后等待对只读副本完成所有更新。在源数据库集群完成数据库更新后，只读副本才会进行数据库更新，且这种复制滞后可能会有很大差异。使用 `ReplicaLag` 指标确定只读副本完成所有更新的时间。`ReplicaLag` 指标记录只读副本数据库实例滞后于源数据库实例的时间量。当 `ReplicaLag` 指标达到 `0` 时，即表示只读副本已赶上源数据库实例进度。

1.  使用 Amazon RDS 控制台上的 **Promote**（提升）选项、AWS CLI 命令 [promote-read-replica-db-cluster](https://docs.aws.amazon.com/cli/latest/reference/rds/promote-read-replica-db-cluster.html) 或 [PromoteReadReplicaDBCluster](https://docs.aws.amazon.com/AmazonRDS/latest/APIReference/API_PromoteReadReplicaDBCluster.html) Amazon RDS API 操作来提升只读副本。

    选择 Aurora MySQL 数据库实例来提升只读副本。在提升只读副本后，Aurora MySQL 数据库集群将被提升为单独数据库集群。故障转移优先级最高的数据库实例将被提升为数据库集群的主数据库实例。其他数据库实例将变为 Aurora 副本。
**注意**  
 提升过程需要几分钟才能完成。在提升只读副本时，会停止复制并重启数据库实例。完成重启后，只读副本即可作为新数据库集群使用。

## 控制台
<a name="AuroraMySQL.Replication.CrossRegion.Promote.Console"></a>

**将 Aurora MySQL 只读副本提升为数据库集群**

1. 登录AWS 管理控制台并通过以下网址打开 Amazon RDS 控制台：[https://console.aws.amazon.com/rds/](https://console.aws.amazon.com/rds/)。

1.  在控制台中，选择 **Instances (实例)**。

    此时将显示**实例**窗格。

1.  在 **Instances (实例)** 窗格中，选择要提升的只读副本。

    只读副本将显示为 Aurora MySQL 数据库实例。

1.  对于**操作**，选择**提升只读副本**。

1.  在确认页面上，选择 **Promote read replica**（提升只读副本）。

## AWS CLI
<a name="AuroraMySQL.Replication.CrossRegion.Promote.CLI"></a>

 要将只读副本升级为数据库集群，请使用 AWS CLI [promote-read-replica-db-cluster](https://docs.aws.amazon.com/cli/latest/reference/rds/promote-read-replica-db-cluster.html) 命令。

**Example**  
对于 Linux、macOS 或 Unix：  

```
aws rds promote-read-replica-db-cluster \
    --db-cluster-identifier mydbcluster
```
对于 Windows：  

```
aws rds promote-read-replica-db-cluster ^
    --db-cluster-identifier mydbcluster
```

## RDS API
<a name="AuroraMySQL.Replication.CrossRegion.Promote.API"></a>

 要将只读副本提升为数据库集群，请调用 [PromoteReadReplicaDBCluster](https://docs.aws.amazon.com/AmazonRDS/latest/APIReference/API_PromoteReadReplicaDBCluster.html)。

# Amazon Aurora MySQL 的跨区域副本故障排除
<a name="AuroraMySQL.Replication.CrossRegion.Troubleshooting"></a>

 以下是您在创建 Amazon Aurora 跨区域只读副本时可能遇到的常见错误消息的列表以及指定错误的解决方法。

## 源集群 [数据库集群 ARN] 未启用二进制日志
<a name="AuroraMySQL.Replication.CrossRegion.Troubleshooting.1"></a>

 要解决该问题，请对源数据库集群开启二进制日志记录。有关更多信息，请参阅 [开始前的准备工作](AuroraMySQL.Replication.CrossRegion.md#AuroraMySQL.Replication.CrossRegion.Prerequisites)。

## 源集群 [数据库集群 ARN] 没有在写入器上同步的集群参数组
<a name="AuroraMySQL.Replication.CrossRegion.Troubleshooting.2"></a>

 如果您已更新 `binlog_format` 数据库集群参数，但尚未重启数据库集群的主实例，则会收到该错误。重启数据库集群的主实例 (即写入器) 并重试。

## 源集群 [数据库集群 ARN] 已具有此区域中的只读副本
<a name="AuroraMySQL.Replication.CrossRegion.Troubleshooting.3"></a>

 对于任意 AWS 区域中的每个源数据库集群，您最多可以具有 5 个作为只读副本的跨区域数据库集群。如果在特定 AWS 区域中，您已有数据库集群的最大数量只读副本，则必须先删除一个现有副本，然后才能在该区域中创建新的跨区域数据库集群。

## 数据库集群 [数据库集群 ARN] 需要数据库引擎升级来支持跨区域复制
<a name="AuroraMySQL.Replication.CrossRegion.Troubleshooting.4"></a>

 要解决该问题，请将源数据库集群中的所有实例的数据库引擎版本升级到最新的数据库引擎版本，然后再次尝试创建跨区域只读副本数据库。

# Aurora 与 MySQL 之间或 Aurora 与其他 Aurora 数据库集群之间的复制（二进制日志复制）
<a name="AuroraMySQL.Replication.MySQL"></a><a name="binlog_replication"></a><a name="binlog"></a>

Amazon Aurora MySQL 与 MySQL 兼容，因此您可以在 MySQL 数据库与 Amazon Aurora MySQL 数据库集群之间设置复制。此类复制使用 MySQL 二进制日志复制，也称为*二进制日志复制*。如果将二进制日志复制与 Aurora 结合使用，建议您的 MySQL 数据库运行 MySQL 版本 5.5 或更高版本。您可以在 Aurora MySQL 数据库集群为复制源或副本的位置设置复制。您可以使用 Amazon RDS MySQL 数据库实例、Amazon RDS 外部的 MySQL 数据库或其他 Aurora MySQL 数据库集群进行复制。

**注意**  
您不能使用二进制日志复制以复制到某些类型的 Aurora 数据库集群或从中进行复制。特别是，二进制日志复制不可用于 Aurora Serverless v1 集群。如果 `SHOW MASTER STATUS` 和 `SHOW SLAVE STATUS`（Aurora MySQL 版本 2）或 `SHOW REPLICA STATUS`（Aurora MySQL 版本 3）语句不返回任何输出，请检查您使用的集群是否支持二进制日志复制。

您还可以在其他 AWS 区域中的 RDS for MySQL 数据库实例或 Aurora MySQL 数据库集群之间进行复制。跨 AWS 区域执行复制时，请确保您的数据库集群和数据库实例可公开访问。如果 Aurora MySQL 数据库集群位于您的 VPC 的私有子网中，请在 AWS 区域之间使用 VPC 对等。有关更多信息，请参阅 [VPC 中的数据库集群由另一 VPC 中的 EC2 实例访问](USER_VPC.Scenarios.md#USER_VPC.Scenario3)。

如果要在 Aurora MySQL 数据库集群和另一个 AWS 区域中的 Aurora MySQL 数据库集群之间配置复制，您可以在与源数据库集群不同的 AWS 区域 中创建一个 Aurora MySQL 数据库集群作为只读副本。有关更多信息，请参阅 [跨 AWS 区域复制 Amazon Aurora MySQL 数据库集群](AuroraMySQL.Replication.CrossRegion.md)。

使用 Aurora MySQL 版本 2 和 3，您可以在 Aurora MySQL 与为复制使用全局事务标识符（GTID）的外部源或目标之间进行复制。请确保 Aurora MySQL 数据库集群中的 GTID 相关参数具有与外部数据库的 GTID 状态兼容的设置。若要了解如何执行此操作，请参阅 [使用基于 GTID 的复制](mysql-replication-gtid.md)。在 Aurora MySQL 版本 3.01 及更高版本中，您可以选择如何将 GTID 分配给从不使用 GTID 的源复制的事务。有关控制该设置的存储过程的信息，请参阅 [mysql.rds\$1assign\$1gtids\$1to\$1anonymous\$1transactions（Aurora MySQL 版本 3）](mysql-stored-proc-gtid.md#mysql_assign_gtids_to_anonymous_transactions)。

**警告**  
 在 Aurora MySQL 与 MySQL 之间复制时，请确保仅使用 InnoDB 表。如果有 MyISAM 表需要复制，可以在设置复制之前使用以下命令将其转换为 InnoDB。  

```
alter table <schema>.<table_name> engine=innodb, algorithm=copy;
```

在以下各节中，设置复制、停止复制、扩展数据库的读取、优化二进制日志复制以及设置增强型二进制日志。

**Topics**
+ [为 Aurora MySQL 设置二进制日志复制](AuroraMySQL.Replication.MySQL.SettingUp.md)
+ [停止 Aurora MySQL 的二进制日志复制](AuroraMySQL.Replication.MySQL.Stopping.md)
+ [使用 Amazon Aurora 扩展 MySQL 数据库的读取](AuroraMySQL.Replication.ReadScaling.md)
+ [优化 Aurora MySQL 的二进制日志复制](binlog-optimization.md)
+ [为 Aurora MySQL 设置增强型二进制日志](AuroraMySQL.Enhanced.binlog.md)

# 为 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 来更改复制源上的主密码，则这些更改不会自动复制到复制目标。如果要在源系统和目标系统之间同步主用户和主密码，则必须自己对复制目标进行相同的更改。

# 停止 Aurora MySQL 的二进制日志复制
<a name="AuroraMySQL.Replication.MySQL.Stopping"></a>

要停止对 MySQL 数据库实例、外部 MySQL 数据库或其他 Aurora 数据库集群进行的二进制日志复制，请执行以下步骤 (本主题后文有详细讨论)。

[1. 在副本目标上停止二进制日志复制](#AuroraMySQL.Replication.MySQL.Stopping.StopReplication)

[2. 在复制源上关闭二进制日志记录](#AuroraMySQL.Replication.MySQL.Stopping.DisableBinaryLogging)

## 1. 在副本目标上停止二进制日志复制
<a name="AuroraMySQL.Replication.MySQL.Stopping.StopReplication"></a>

按照以下说明停止数据库引擎的二进制日志复制。


|  数据库引擎  |  说明  | 
| --- | --- | 
|   Aurora MySQL   |  **在 Aurora MySQL 数据库集群副本目标上停止二进制日志复制** 连接到作为副本目标的 Aurora 数据库集群，然后调用 [mysql.rds\$1stop\$1replication](mysql-stored-proc-replicating.md#mysql_rds_stop_replication) 过程。  | 
|   RDS for MySQL   |  **在 Amazon RDS 数据库实例上停止二进制日志复制** 连接到作为副本目标的 RDS 数据库实例，然后调用 [mysql.rds\$1stop\$1replication](mysql-stored-proc-replicating.md#mysql_rds_stop_replication) 过程。  | 
|   MySQL (外部)   |  **在外部 MySQL 数据库上停止二进制日志复制** 连接到 MySQL 数据库并运行 `STOP SLAVE`（版本 5.7）或 `STOP REPLICA`（版本 8.0）命令。  | 

## 2. 在复制源上关闭二进制日志记录
<a name="AuroraMySQL.Replication.MySQL.Stopping.DisableBinaryLogging"></a>

使用下表中的说明在数据库引擎的复制源上关闭二进制日志记录。


| 数据库引擎 | 说明 | 
| --- | --- | 
|   Aurora MySQL   |  **在 Amazon Aurora 数据库集群上关闭二进制日志记录** [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/AmazonRDS/latest/AuroraUserGuide/AuroraMySQL.Replication.MySQL.Stopping.html)  | 
|   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.Stopping.html)  | 
|   MySQL (外部)   |  **在外部 MySQL 数据库上关闭二进制日志记录** 连接到 MySQL 数据库并调用 `STOP REPLICATION` 命令。 [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/AmazonRDS/latest/AuroraUserGuide/AuroraMySQL.Replication.MySQL.Stopping.html)  | 

# 使用 Amazon Aurora 扩展 MySQL 数据库的读取
<a name="AuroraMySQL.Replication.ReadScaling"></a>

您可以将 Amazon Aurora 用于 MySQL 数据库实例，以便利用 Amazon Aurora 的读取扩展功能并为 MySQL 数据库实例扩展读取工作负载。要使用 Aurora 对 MySQL 数据库实例扩缩读取，请创建 Amazon Aurora MySQL 数据库集群并使它成为 MySQL 数据库实例的只读副本。这适用于 RDS for MySQL 数据库实例或是在 Amazon RDS 外部运行的 MySQL 数据库。

有关创建 Amazon Aurora 数据库集群的信息，请参阅[创建 Amazon Aurora 数据库集群](Aurora.CreateInstance.md)。

在 MySQL 数据库实例与 Amazon Aurora 数据库集群之间设置复制时，请确保遵循以下准则：
+ 当您引用 Amazon Aurora 数据库集群时，使用 Amazon Aurora MySQL 数据库集群端点地址。如果发生故障转移，则提升为 Aurora 数据库集群主实例的 Aurora MySQL 副本继续使用数据库集群端点地址。
+ 在您的写入器实例上维护二进制日志，直至您确认其已应用于 Aurora 副本。这种维护将确保您可以在发生故障时还原写入器实例。

**重要**  
当使用自管理复制时，您负责监控和解决可能发生的所有复制问题。有关更多信息，请参阅 [诊断并解决只读副本之间的滞后](CHAP_Troubleshooting.md#CHAP_Troubleshooting.MySQL.ReplicaLag)。

**注意**  
对 Aurora MySQL 数据库集群启动复制功能所需的权限受到限制且对 Amazon RDS 主用户不可用。为此，您必须使用 [mysql.rds\$1set\$1external\$1master（Aurora MySQL 版本 2）](mysql-stored-proc-replicating.md#mysql_rds_set_external_master) 或 [mysql.rds\$1set\$1external\$1source（Aurora MySQL 版本 3）](mysql-stored-proc-replicating.md#mysql_rds_set_external_source) 和 [mysql.rds\$1start\$1replication](mysql-stored-proc-replicating.md#mysql_rds_start_replication) 过程来设置 Aurora MySQL 数据库集群和 MySQL 数据库实例之间的复制。

## 启动外部源实例和 Aurora MySQL 数据库集群之间的复制
<a name="AuroraMySQL.Replication.ReadScaling.Procedure"></a>

1.  将源 MySQL 数据库实例设为只读：

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

1.  对源 MySQL 数据库实例运行 `SHOW MASTER STATUS` 命令以确定二进制日志位置。将会收到类似于以下示例的输出：

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

1. 使用 `mysqldump` 将数据库从外部 MySQL 数据库实例复制到 Amazon Aurora MySQL 数据库集群。对于非常大的数据库，您可能希望使用《Amazon Relational Database Service 用户指南》**中的[将数据导入到 Amazon RDS for MySQL 数据库并减少停机时间](https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/mysql-importing-data-reduced-downtime.html)中的过程。

   对于 Linux、macOS 或 Unix：

   ```
   mysqldump \
       --databases <database_name> \
       --single-transaction \
       --compress \
       --order-by-primary \
       -u local_user \
       -p local_password | mysql \
           --host aurora_cluster_endpoint_address \
           --port 3306 \
           -u RDS_user_name \
           -p RDS_password
   ```

   对于：Windows

   ```
   mysqldump ^
       --databases <database_name> ^
       --single-transaction ^
       --compress ^
       --order-by-primary ^
       -u local_user ^
       -p local_password | mysql ^
           --host aurora_cluster_endpoint_address ^
           --port 3306 ^
           -u RDS_user_name ^
           -p RDS_password
   ```
**注意**  
确保 `-p` 选项和输入的密码之间没有空格。

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

1. 再次将源 MySQL 数据库实例设为可写：

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

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

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

   您可能还需要配置本地网络以允许来自 Amazon Aurora 数据库集群的 IP 地址的连接，以便它能与源 MySQL 实例进行通信。要查找 Amazon Aurora 数据库集群的 IP 地址，请使用 `host` 命令。

   ```
   host aurora_endpoint_address
   ```

   主机名是 Amazon Aurora 数据库集群端点中的 DNS 名称。

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

   ```
   CREATE USER 'repl_user'@'example.com' IDENTIFIED BY 'password';
   ```

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

   ```
   GRANT REPLICATION CLIENT, REPLICATION SLAVE ON *.* TO 'repl_user'@'example.com'
       IDENTIFIED BY 'password';
   ```

1. 在设置复制之前，请创建 Aurora MySQL 数据库集群的手动快照以作为只读副本。如果您需要将数据库集群作为只读副本来重新建立复制，则可从此快照还原 Aurora MySQL 数据库集群，而不必将 MySQL 数据库实例中的数据导入新的 Aurora MySQL 数据库集群。

1. 使 Amazon Aurora 数据库集群成为副本。以主用户身份连接到 Amazon Aurora 数据库集群，并通过使用 [mysql.rds\$1set\$1external\$1master（Aurora MySQL 版本 2）](mysql-stored-proc-replicating.md#mysql_rds_set_external_master)或 [mysql.rds\$1set\$1external\$1source（Aurora MySQL 版本 3）](mysql-stored-proc-replicating.md#mysql_rds_set_external_source)和 [mysql.rds\$1start\$1replication](mysql-stored-proc-replicating.md#mysql_rds_start_replication) 过程将源 MySQL 数据库确定为复制源。

   使用在步骤 2 中确定的二进制日志文件名和位置。示例如下：

   ```
   For Aurora MySQL version 2:
   CALL mysql.rds_set_external_master ('mymasterserver.example.com', 3306,
       'repl_user', 'password', 'mysql-bin-changelog.000031', 107, 0);
   
   For Aurora MySQL version 3:
   CALL mysql.rds_set_external_source ('mymasterserver.example.com', 3306,
       'repl_user', 'password', 'mysql-bin-changelog.000031', 107, 0);
   ```

1. 在 Amazon Aurora 数据库集群上，调用 [mysql.rds\$1start\$1replication](mysql-stored-proc-replicating.md#mysql_rds_start_replication) 过程以开始复制。

   ```
   CALL mysql.rds_start_replication; 
   ```

在源 MySQL 数据库实例与 Amazon Aurora 数据库集群之间建立复制之后，可以将 Aurora 副本添加到 Amazon Aurora 数据库集群。随后可以连接到 Aurora 副本以对数据进行读取扩展。有关创建 Aurora 副本的信息，请参阅[将 Aurora 副本添加到数据库集群](aurora-replicas-adding.md)。

# 优化 Aurora MySQL 的二进制日志复制
<a name="binlog-optimization"></a>

 接下来，您可以了解如何优化二进制日志复制性能和排查 Aurora MySQL 中的相关问题。

**提示**  
 本讨论假定您熟悉 MySQL 二进制日志复制机制及其工作原理。有关背景信息，请参阅 MySQL 文档中的[复制实施](https://dev.mysql.com/doc/refman/8.0/en/replication-implementation.html)。

## 多线程二进制日志复制
<a name="binlog-optimization-multithreading"></a>

使用多线程二进制日志复制时，SQL 线程会从中继日志中读取事件并将其排队，以便 SQL 工作线程应用。SQL 工作线程由协调器线程管理。尽可能并行应用二进制日志事件。并行度级别取决于版本、参数、架构设计和工作负载特性等因素。

Aurora MySQL 版本 3 和 Aurora MySQL 2.12.1 及更高版本支持多线程二进制日志复制。为了使多线程副本能够高效地并行处理二进制日志事件，您必须为多线程二进制日志复制配置源，并且源使用的版本必须包含有关其二进制日志文件中的并行度信息。

当 Aurora MySQL 数据库实例配置为使用二进制日志复制时，默认情况下，副本实例对低于 3.04 的 Aurora MySQL 版本使用单线程复制。要启用多线程复制，请在您的自定义参数组中将 `replica_parallel_workers` 参数更新为大于 `1` 的值。

对于 Aurora MySQL 版本 3.04 及更高版本，复制默认是多线程的，`replica_parallel_workers` 设置为 `4`。您可以在自定义参数组中修改此参数。

为了提高数据库在意外中断时的弹性，我们建议您在源上启用 GTID 复制，并在副本上支持 GTID。要支持 GTID 复制，请同时在源和副本上将 `gtid_mode` 设置为 `ON_PERMISSIVE`。有关基于 GTID 的复制的更多信息，请参阅[使用基于 GTID 的复制](mysql-replication-gtid.md)。

以下配置选项可以帮助您优化多线程复制。有关使用信息，请参阅 *MySQL 参考手册*中的[复制和二进制日志记录选项和变量](https://dev.mysql.com/doc/refman/8.0/en/replication-options.html)。有关多线程复制的更多信息，请参阅 MySQL 博客 [https://dev.mysql.com/blog-archive/improving-the-parallel-applier-with-writeset-based-dependency-tracking/](https://dev.mysql.com/blog-archive/improving-the-parallel-applier-with-writeset-based-dependency-tracking/)。

最佳参数值取决于多个因素。例如，二进制日志复制的性能受数据库工作负载特征和副本运行所在的数据库实例类的影响。因此，建议您在将新参数设置应用于生产实例之前，彻底测试对这些配置参数的所有更改：
+ `binlog_format recommended value` – 设置为 `ROW`
+ `binlog_group_commit_sync_delay`
+ `binlog_group_commit_sync_no_delay_count`
+ `binlog_transaction_dependency_history_size`
+ `binlog_transaction_dependency_tracking`：建议值为 `WRITESET`
+ `replica_preserve_commit_order`
+ `replica_parallel_type`：建议值为 `LOGICAL_CLOCK`
+ `replica_parallel_workers`
+ `replica_pending_jobs_size_max`
+ `transaction_write_set_extraction`：建议值为 `XXHASH64`

您的架构和工作负载特征是影响并行复制的因素。最常见的因素如下。
+ 缺少主键：RDS 无法为没有主键的表建立写集依赖关系。使用 `ROW` 格式，可以通过在源上进行单次全表扫描来完成单个多行语句，但会导致对在副本上修改的每一行都进行一次完整表扫描。缺少主键会显著降低复制吞吐量。
+ 存在外键：如果存在外键，Amazon RDS 就无法使用写集依赖关系来实现表与 FK 关系的并行性。
+ 事务大小：如果单个事务跨越数十或数百兆字节或千兆字节，则协调器线程和其中一个工作线程可能会花很长时间只处理该事务。在此期间，所有其它工作线程在完成对先前事务的处理后可能会保持空闲状态。

在 Aurora MySQL 版本 3.06 及更高版本中，在为具有多个二级索引的大型表复制事务时，可以提高二进制日志副本的性能。此功能引入了一个线程池，用于在二进制日志副本上并行应用二级索引更改。该功能由 `aurora_binlog_replication_sec_index_parallel_workers` 数据库集群参数控制，该参数控制可用于应用二级索引更改的并行线程总数。默认情况下，此参数设置为 `0`（禁用）。启用此功能不需要重启实例。要启用此功能，请停止正在进行的复制，设置所需的并行工作线程数，然后重新开始复制。

## 优化二进制日志复制
<a name="binlog-optimization-binlog-io-cache"></a><a name="binlog_boost"></a><a name="binlog_io_cache"></a>

 在 Aurora MySQL 2.10 及更高版本中，Aurora 会自动将称为二进制日志 I/O 缓存的优化应用于二进制日志复制。通过缓存最近提交的二进制日志事件，此优化旨在提高二进制日志转储线程性能，同时限制对二进制日志源实例上前台事务的影响。

**注意**  
 用于此功能的内存独立于 MySQL `binlog_cache` 设置。  
 此功能不适用于使用 `db.t2` 和 `db.t3` 实例类的 Aurora 数据库实例。

您无需调整任何配置参数即可启用此优化。特别是，如果您在早期 Aurora MySQL 版本中曾将配置参数 `aurora_binlog_replication_max_yield_seconds` 调整为非零值，请为当前可用版本设置回零。

状态变量 `aurora_binlog_io_cache_reads` 和 `aurora_binlog_io_cache_read_requests` 可帮助您监控从二进制日志 I/O 缓存读取数据的频率。
+  `aurora_binlog_io_cache_read_requests` 显示来自缓存的二进制日志输入/输出读取请求的数量。
+  `aurora_binlog_io_cache_reads` 显示从缓存检索信息的二进制日志输入/输出读取的数量。

 以下 SQL 查询计算利用缓存信息的二进制日志读取请求的百分比。在此情况下，比率越接近 100，就越好。

```
mysql> SELECT
  (SELECT VARIABLE_VALUE FROM INFORMATION_SCHEMA.GLOBAL_STATUS
    WHERE VARIABLE_NAME='aurora_binlog_io_cache_reads')
  / (SELECT VARIABLE_VALUE FROM INFORMATION_SCHEMA.GLOBAL_STATUS
    WHERE VARIABLE_NAME='aurora_binlog_io_cache_read_requests')
  * 100
  as binlog_io_cache_hit_ratio;
+---------------------------+
| binlog_io_cache_hit_ratio |
+---------------------------+
|         99.99847949080622 |
+---------------------------+
```

 二进制日志 I/O 缓存功能还包括与二进制日志转储线程相关的新指标。*转储线程*是当新的二进制日志副本连接到二进制日志源实例时创建的线程。

转储线程指标每 60 秒输出到数据库日志中一次，并带有前缀 `[Dump thread metrics]`。这些指标包括每个二进制日志副本的信息，例如，`Secondary_id`、`Secondary_uuid`、二进制日志文件名以及每个副本读取的位置。这些指标还包括 `Bytes_behind_primary`，表示复制源和副本之间的距离（以字节为单位）。此指标衡量副本 I/O 线程的滞后。该数字不同于副本 SQL 应用程序线程的滞后，后者通过二进制日志副本上的 `seconds_behind_master` 指标表示。您可以通过检查距离是减少还是增加来确定二进制日志副本是跟上源还是落后。

## 内存中继日志
<a name="binlog-optimization-in-memory-relay-log"></a>

在 Aurora MySQL 版本 3.10 及更高版本中，Aurora 引入了称为内存中继日志的优化来提高复制吞吐量。此优化通过在内存中缓存所有中间中继日志内容来增强中继日志 I/O 性能。因此，它通过最大限度地减少存储 I/O 操作来减少提交延迟，因为中继日志内容在内存中仍然保持可供随时访问。

默认情况下，当副本满足以下任何配置时，会自动为 Aurora 托管式复制场景（包括蓝绿部署、Aurora-Aurora 复制以及跨区域副本）启用内存中继日志功能：
+ 单线程复制模式（replica\$1parallel\$1workers = 0）
+ 启用了 GTID 模式的多线程复制：
  + 启用了自动定位
  + 副本上的 GTID 模式设置为 ON
+ 在 replica\$1preserve\$1commit\$1order = ON 时进行基于文件的复制

大于 t3.large 的实例类支持内存中继日志功能，但此功能在 Aurora Serverless 实例上不可用。中继日志循环缓冲区的固定大小为 128 MB。要监控此功能的内存消耗，可以运行以下查询：

```
SELECT event_name, current_alloc FROM sys.memory_global_by_current_bytes WHERE event_name = 'memory/sql/relaylog_io_cache';
```

内存中继日志功能由 aurora\$1in\$1memory\$1relaylog 参数控制，该参数可以在数据库集群或实例级别进行设置。可以在不重新启动实例的情况下动态启用或禁用此功能：

1. 停止正在进行的复制

1. 在参数组中将 aurora\$1in\$1memory\$1relaylog 设置为 ON（启用）或 OFF（禁用）

1. 重新启动复制

示例：

```
CALL mysql.rds_stop_replication;
set aurora_in_memory_relaylog to ON to enable or OFF to disable in cluster parameter group
CALL mysql.rds_start_replication;
```

即使 aurora\$1in\$1memory\$1relaylog 设置为 ON，在某些条件下，内存中继日志功能仍可能被禁用。要验证该功能的当前状态，可以使用以下命令：

```
SHOW GLOBAL STATUS LIKE 'Aurora_in_memory_relaylog_status';
```

如果意外禁用了该功能，则可以通过运行以下命令来确定原因：

```
SHOW GLOBAL STATUS LIKE 'Aurora_in_memory_relaylog_disabled_reason';
```

此命令返回一条消息，解释当前禁用该功能的原因。

# 为 Aurora MySQL 设置增强型二进制日志
<a name="AuroraMySQL.Enhanced.binlog"></a>

增强型二进制日志可减少开启二进制日志所导致的计算性能开销，在某些情况下，该开销最高可达 50%。使用增强型二进制日志，这种开销可以减少到大约 13%。为了减少开销，增强型二进制日志将二进制和事务日志并行写入存储，从而最大限度地减少在事务提交时间写入的数据。

与社区 MySQL 二进制日志相比，使用增强型二进制日志还可以将重启和故障转移后的数据库恢复时间缩短多达 99%。增强型二进制日志与现有的基于二进制日志的工作负载兼容，您与其交互的方式和您与社区 MySQL 二进制日志交互的方式相同。

增强型二进制日志在 Aurora MySQL 版本 3.03.1 及更高版本上可用。

**Topics**
+ [配置增强型二进制日志参数](#AuroraMySQL.Enhanced.binlog.enhancedbinlog.parameters)
+ [其他相关参数](#AuroraMySQL.Enhanced.binlog.other.parameters)
+ [增强型二进制日志和社区 MySQL 二进制日志之间的区别](#AuroraMySQL.Enhanced.binlog.differences)
+ [增强型二进制日志的 Amazon CloudWatch 指标](#AuroraMySQL.Enhanced.binlog.cloudwatch.metrics)
+ [增强型二进制日志限制](#AuroraMySQL.Enhanced.binlog.limitations)

## 配置增强型二进制日志参数
<a name="AuroraMySQL.Enhanced.binlog.enhancedbinlog.parameters"></a>

您可以通过开启/关闭增强型二进制日志参数，在社区 MySQL 二进制日志和增强型二进制日志之间切换。现有的二进制日志使用者可以继续读取和使用二进制日志文件，而不会在二进制日志文件序列中出现任何间隔。

要开启增强型二进制日志，请设置以下参数：


| 参数 | 默认值 | 描述 | 
| --- | --- | --- | 
| binlog\$1format | – | 将 binlog\$1format 参数设置为您选择的二进制日志记录格式，以开启增强型二进制日志。确保 binlog\$1format parameter 未设置为 OFF。有关更多信息，请参阅[配置 Aurora MySQL 二进制日志记录](https://docs.aws.amazon.com/AmazonRDS/latest/AuroraUserGuide/USER_LogAccess.MySQL.BinaryFormat.html)。 | 
| aurora\$1enhanced\$1binlog | 0 | 在与 Aurora MySQL 集群关联的数据库集群参数组中，将此参数的值设置为 1。更改此参数的值时，当 DBClusterParameterGroupStatus 值显示为 pending-reboot 时，必须重启写入器实例。 | 
| binlog\$1backup | 1 |  关闭此参数可开启增强型二进制日志。为此，请将此参数的值设置为 0。 | 
| binlog\$1replication\$1globaldb | 1 |  关闭此参数可开启增强型二进制日志。为此，请将此参数的值设置为 0。 | 

**重要**  
只有在使用增强型二进制日志时，才能关闭 `binlog_backup` 和 `binlog_replication_globaldb` 参数。

要关闭增强型二进制日志，请设置以下参数：


| 参数 | 描述 | 
| --- | --- | 
| aurora\$1enhanced\$1binlog | 在与 Aurora MySQL 集群关联的数据库集群参数组中，将此参数的值设置为 0。每当您更改此参数的值时，当 DBClusterParameterGroupStatus 值显示为 pending-reboot 时，必须重启写入器实例。 | 
| binlog\$1backup | 关闭增强型二进制日志时开启此参数。为此，请将此参数的值设置为 1。 | 
| binlog\$1replication\$1globaldb | 关闭增强型二进制日志时开启此参数。为此，请将此参数的值设置为 1。 | 

要检查增强型二进制日志是否已开启，请在 MySQL 客户端中使用以下命令：

```
mysql>show status like 'aurora_enhanced_binlog';
              
+------------------------+--------+
| Variable_name          | Value  |
+------------------------+--------+
| aurora_enhanced_binlog | ACTIVE |
+------------------------+--------+
1 row in set (0.00 sec)
```

开启增强型二进制日志时，输出将对于 `aurora_enhanced_binlog` 显示 `ACTIVE`。

## 其他相关参数
<a name="AuroraMySQL.Enhanced.binlog.other.parameters"></a>

当您开启增强型二进制日志时，以下参数会受到影响：
+ `max_binlog_size` 参数可见但不可修改。当开启增强型二进制日志时，此参数的默认值 `134217728` 会自动调整为 `268435456`。
+ 与社区 MySQL 二进制日志不同，当开启增强型二进制日志时，`binlog_checksum` 不充当动态参数。要使对此参数的更改生效，必须手动重启数据库集群，即使 `ApplyMethod` 为 `immediate` 也是如此。
+ 开启增强型二进制日志时，您对 `binlog_order_commits` 参数设置的值对提交顺序没有影响。提交始终是按顺序排列的，不会对性能产生任何进一步的影响。

## 增强型二进制日志和社区 MySQL 二进制日志之间的区别
<a name="AuroraMySQL.Enhanced.binlog.differences"></a>

与社区 MySQL 二进制日志相比，增强型二进制日志与克隆、备份和 Aurora Global Database 的交互方式不同。我们建议您在使用增强型二进制日志之前了解以下差异。
+ 来自源数据库集群的增强型二进制日志文件在克隆的数据库集群上不可用。
+ 增强型二进制日志文件不包含在 Aurora 备份中。因此，尽管在数据库集群上设置了任何保留期，但在还原数据库集群后，源数据库集群中的增强型二进制日志文件不可用。
+ 与 Aurora 全局数据库一起使用时，主数据库集群的增强二进制日志文件不会复制到辅助区域中的数据库集群。

****示例****  
以下示例说明了增强型二进制日志和社区 MySQL 二进制日志之间的区别。

**在还原或克隆的数据库集群上**

开启增强型二进制日志后，历史二进制日志文件在还原或克隆的数据库集群中不可用。在执行还原或克隆操作后，如果开启二进制日志，则新的数据库集群将开始写入其自己的二进制日志文件序列，从 1 开始（mysql-bin-changelog.000001）。

要在还原或克隆操作后开启增强型二进制日志，请在还原或克隆的数据库集群上设置所需的数据库集群参数。有关更多信息，请参阅 [配置增强型二进制日志参数](#AuroraMySQL.Enhanced.binlog.enhancedbinlog.parameters)。

**Example 示例：开启增强型二进制日志时执行的克隆或还原操作**  
源数据库集群：  

```
mysql> show binary logs;
                      
+----------------------------+-----------+-----------+
| Log_name                   | File_size | Encrypted |
+----------------------------+-----------+-----------+
| mysql-bin-changelog.000001 |       156 | No        |
| mysql-bin-changelog.000002 |       156 | No        |
| mysql-bin-changelog.000003 |       156 | No        |
| mysql-bin-changelog.000004 |       156 | No        | --> Enhanced Binlog turned on
| mysql-bin-changelog.000005 |       156 | No        | --> Enhanced Binlog turned on
| mysql-bin-changelog.000006 |       156 | No        | --> Enhanced Binlog turned on
+----------------------------+-----------+-----------+
6 rows in set (0.00 sec)
```
 在还原或克隆的数据库集群上，开启增强型二进制日志时不备份二进制日志文件。为避免二进制日志数据出现不连续性，在开启增强型二进制日志之前写入的二进制日志文件也不可用。  

```
mysql>show binary logs;
                      
+----------------------------+-----------+-----------+
| Log_name                   | File_size | Encrypted |
+----------------------------+-----------+-----------+
| mysql-bin-changelog.000001 |       156 | No        | --> New sequence of Binlog files
+----------------------------+-----------+-----------+ 
1 row in set (0.00 sec)
```

**Example 示例：关闭增强型二进制日志时执行的克隆或还原操作**  
源数据库集群：  

```
mysql>show binary logs;
                                                
+----------------------------+-----------+-----------+
| Log_name                   | File_size | Encrypted |
+----------------------------+-----------+-----------+
| mysql-bin-changelog.000001 |       156 | No        |
| mysql-bin-changelog.000002 |       156 | No        | --> Enhanced Binlog enabled
| mysql-bin-changelog.000003 |       156 | No        | --> Enhanced Binlog enabled
| mysql-bin-changelog.000004 |       156 | No        | 
| mysql-bin-changelog.000005 |       156 | No        | 
| mysql-bin-changelog.000006 |       156 | No        |
+----------------------------+-----------+-----------+
6 rows in set (0.00 sec)
```
`mysql-bin-changelog.000003` 之后禁用了增强型二进制日志。在还原或克隆的数据库集群上，关闭增强型二进制日志后写入的二进制日志文件可用。  

```
mysql>show binary logs;
                      
+----------------------------+-----------+-----------+
| Log_name                   | File_size | Encrypted |
+----------------------------+-----------+-----------+
| mysql-bin-changelog.000004 |       156 | No        | 
| mysql-bin-changelog.000005 |       156 | No        | 
| mysql-bin-changelog.000006 |       156 | No        |
+----------------------------+-----------+-----------+
1 row in set (0.00 sec)
```

**在 Amazon Aurora 全局数据库上**

在 Amazon Aurora 全局数据库上，主数据库集群的二进制日志数据不会复制到辅助数据库集群。在执行跨区域故障转移过程后，二进制日志数据在新升级的主数据库集群中不可用。如果开启二进制日志，则新提升的数据库集群将开始其自己的二进制日志文件序列，从 1 开始（mysql-bin-changelog.000001）。

要在故障转移后开启增强型二进制日志，您必须在辅助数据库集群上设置所需的数据库集群参数。有关更多信息，请参阅 [配置增强型二进制日志参数](#AuroraMySQL.Enhanced.binlog.enhancedbinlog.parameters)。

**Example 示例：开启增强型二进制日志时执行全球数据库失效转移操作**  
旧的主数据库集群（故障转移前）：  

```
mysql>show binary logs;
                  
+----------------------------+-----------+-----------+
| Log_name                   | File_size | Encrypted |
+----------------------------+-----------+-----------+
| mysql-bin-changelog.000001 |       156 | No        |
| mysql-bin-changelog.000002 |       156 | No        |
| mysql-bin-changelog.000003 |       156 | No        |
| mysql-bin-changelog.000004 |       156 | No        | --> Enhanced Binlog enabled
| mysql-bin-changelog.000005 |       156 | No        | --> Enhanced Binlog enabled
| mysql-bin-changelog.000006 |       156 | No        | --> Enhanced Binlog enabled
+----------------------------+-----------+-----------+
6 rows in set (0.00 sec)
```
新的主数据库集群（故障转移后）：  
开启增强型二进制日志后，二进制日志文件不会复制到辅助区域。为避免二进制日志数据出现不连续性，在开启增强型二进制日志之前写入的二进制日志文件不可用。  

```
mysql>show binary logs;
                      
+----------------------------+-----------+-----------+
| Log_name                   | File_size | Encrypted |
+----------------------------+-----------+-----------+
| mysql-bin-changelog.000001 |       156 | No        | --> Fresh sequence of Binlog files
+----------------------------+-----------+-----------+ 
1 row in set (0.00 sec)
```

**Example 示例：关闭增强型二进制日志时执行全球数据库失效转移操作**  
源数据库集群：  

```
mysql>show binary logs;
                  
+----------------------------+-----------+-----------+
| Log_name                   | File_size | Encrypted |
+----------------------------+-----------+-----------+
| mysql-bin-changelog.000001 |       156 | No        |
| mysql-bin-changelog.000002 |       156 | No        | --> Enhanced Binlog enabled
| mysql-bin-changelog.000003 |       156 | No        | --> Enhanced Binlog enabled
| mysql-bin-changelog.000004 |       156 | No        | 
| mysql-bin-changelog.000005 |       156 | No        | 
| mysql-bin-changelog.000006 |       156 | No        |
+----------------------------+-----------+-----------+
6 rows in set (0.00 sec)
```
**还原或克隆的数据库集群：**  
`mysql-bin-changelog.000003` 之后禁用了增强型二进制日志。关闭增强型二进制日志后写入的二进制日志文件会被复制，并在新提升的数据库集群中可用。  

```
mysql>show binary logs;
                  
+----------------------------+-----------+-----------+
| Log_name                   | File_size | Encrypted |
+----------------------------+-----------+-----------+
| mysql-bin-changelog.000004 |       156 | No        | 
| mysql-bin-changelog.000005 |       156 | No        | 
| mysql-bin-changelog.000006 |       156 | No        |
+----------------------------+-----------+-----------+
3 rows in set (0.00 sec)
```

## 增强型二进制日志的 Amazon CloudWatch 指标
<a name="AuroraMySQL.Enhanced.binlog.cloudwatch.metrics"></a>

以下 Amazon CloudWatch 指标仅在开启增强型二进制日志时发布。


| CloudWatch 指标 | 描述 | 单位 | 
| --- | --- | --- | 
| ChangeLogBytesUsed | 增强型二进制日志使用的存储空间量。 | 字节 | 
| ChangeLogReadIOPs | 在 5 分钟的时间间隔内，在增强型二进制日志中执行的读取 I/O 操作的数量。 | 每 5 分钟计数 | 
| ChangeLogWriteIOPs | 在 5 分钟的时间间隔内，在增强型二进制日志中执行的写入磁盘 I/O 操作的数量。 | 每 5 分钟计数 | 

## 增强型二进制日志限制
<a name="AuroraMySQL.Enhanced.binlog.limitations"></a>

开启增强型二进制日志时，以下限制适用于 Amazon Aurora 数据库集群。
+ 仅在 Aurora MySQL 版本 3.03.1 及更高版本上支持增强型二进制日志。
+ 在主数据库集群上写入的增强型二进制日志文件不会复制到克隆或还原的数据库集群。
+ 与 Amazon Aurora 全局数据库一起使用时，主数据库集群的增强型二进制日志文件不会复制到辅助数据库集群。因此，在故障转移过程之后，历史二进制日志数据在新的主数据库集群中不可用。
+ 将忽略以下二进制日志配置参数：
  + `binlog_group_commit_sync_delay`
  + `binlog_group_commit_sync_no_delay_count`
  + `binlog_max_flush_queue_time`
+ 您无法删除或重命名数据库中损坏的表。要删除这些表，您可以联系 支持。
+ 开启增强型二进制日志时，会禁用二进制日志 I/O 缓存。有关更多信息，请参阅 [优化 Aurora MySQL 的二进制日志复制](binlog-optimization.md)。
**注意**  
增强型二进制日志提供了与二进制日志 I/O 缓存类似的读取性能改进以及更好的写入性能改进。
+ 不支持回溯特征。在以下情况下，无法在数据库集群中开启增强型二进制日志：
  + 当前已启用回溯特征的数据库集群。
  + 先前已启用但现在禁用回溯功能的数据库集群。
  + 从启用了回溯特征的源数据库集群或快照中还原的数据库集群。

# 使用基于 GTID 的复制
<a name="mysql-replication-gtid"></a>

以下内容说明了如何在 Aurora MySQL 集群和外部源之间使用采用二进制日志（binlog）复制的全局事务标识符（GTID）。

**注意**  
对于 Aurora，只能通过对外部 MySQL 数据库使用二进制日志复制的 Aurora MySQL 集群使用此功能。另一个数据库可能是其他 AWS 区域的 Amazon RDS MySQL 实例、本地 MySQL 数据库或 Aurora 数据库集群。要了解如何配置此类复制，请参阅 [Aurora 与 MySQL 之间或 Aurora 与其他 Aurora 数据库集群之间的复制（二进制日志复制）](AuroraMySQL.Replication.MySQL.md)。

如果您使用的是二进制日志复制，不熟悉 MySQL 的基于 GTID 的复制，请参阅 MySQL 文档中的 [Replication with global transaction identifiers](https://dev.mysql.com/doc/refman/5.7/en/replication-gtids.html)。

Aurora MySQL 版本 2 和 3 支持基于 GTID 的复制。

**Topics**
+ [全局事务标识符 (GTID) 概述](#mysql-replication-gtid.overview)
+ [基于 GTID 的复制的参数](#mysql-replication-gtid.parameters)
+ [为 Aurora MySQL 集群启用基于 GTID 的复制](mysql-replication-gtid.configuring-aurora.md)
+ [为Aurora MySQL 数据库集群禁用基于 GTID 的复制](mysql-replication-gtid.disabling.md)

## 全局事务标识符 (GTID) 概述
<a name="mysql-replication-gtid.overview"></a>

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

**注意**  
当 Aurora 在集群中的数据库实例之间同步数据时，该复制机制不会涉及二进制日志 (binlog)。对于 Aurora MySQL，基于 GTID 的复制仅在您还使用二进制日志复制从外部的 MySQL 兼容数据向 Aurora MySQL 数据库集群复制或从中复制时应用。

MySQL 使用两种不同类型的事务进行二进制日志复制：
+ *GTID 事务* – 由 GTID 标识的事务。
+ *匿名事务* – 未分配 GTID 的事务。

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

 在从外部的 MySQL 兼容数据向 Aurora 集群复制时，通常使用 Aurora 的基于 GTID 的复制。您可以将此复制配置设置为从本地数据库或 Amazon RDS 数据库迁移到 Aurora MySQL 的一部分。如果外部数据库已使用 GTID，为 Aurora 集群启用基于 GTID 的复制可以简化复制过程。

 为 Aurora MySQL 集群配置基于 GTID 的复制的方法是先在数据库集群参数组中设置相关配置参数。然后将该参数组与集群关联。

## 基于 GTID 的复制的参数
<a name="mysql-replication-gtid.parameters"></a>

可以使用以下参数配置基于 GTID 的复制。


| 参数 | 有效值 | 描述 | 
| --- | --- | --- | 
|  `gtid_mode`  |  `OFF`, `OFF_PERMISSIVE`, `ON_PERMISSIVE`, `ON`  |  `OFF` 指定新事务是匿名事务（即，没有 GTID），并且事务必须是匿名事务才能复制。 `OFF_PERMISSIVE` 指定新事务是匿名事务，但可以复制所有事务。 `ON_PERMISSIVE` 指定新事务是 GTID 事务，但可以复制所有事务。 `ON` 指定新事务是 GTID 事务，并且事务必须是 GTID 事务才能复制。  | 
|  `enforce_gtid_consistency`  |  `OFF`, `ON`, `WARN`  |  `OFF` 允许事务违反 GTID 一致性。 `ON` 禁止事务违反 GTID 一致性。 `WARN` 允许事务违反 GTID 一致性，但在违反一致性时生成警告。  | 

**注意**  
在 AWS 管理控制台中，`gtid_mode` 参数显示为 `gtid-mode`。

对于基于 GTID 的复制，请为 Aurora MySQL 数据库集群的数据库集群参数组使用这些设置：
+ `ON` 和 `ON_PERMISSIVE` 仅适用于从 Aurora MySQL 集群的传出复制。这两个值都可以让 Aurora 数据库集群为复制到外部数据库的事务使用 GTID。`ON` 要求外部数据库也使用基于 GTID 的复制。`ON_PERMISSIVE` 让基于 GTID 的复制成为外部数据库上的可选项。
+ `OFF_PERMISSIVE`（如果设置）表明您的 Aurora 数据库集群可以接受来自外部数据库的传入复制。不论外部数据库是否使用基于 GTID 的复制，它都可以接受。
+  `OFF`（如果设置）表明您的 Aurora 数据库集群只接受来自不使用基于 GTID 的复制的外部数据库的传入复制。

**提示**  
传入复制是 Aurora MySQL 集群最常见的二进制日志复制场景。对于传入复制，建议您将 GTID 模式设置为 `OFF_PERMISSIVE`。该设置允许来自外部数据库的传入复制，不论复制源的 GTID 设置如何。

有关参数组的更多信息，请参阅 [Amazon Aurora 的参数组](USER_WorkingWithParamGroups.md)。

# 为 Aurora MySQL 集群启用基于 GTID 的复制
<a name="mysql-replication-gtid.configuring-aurora"></a><a name="gtid"></a>

在为 Aurora MySQL 数据库集群启用了基于 GTID 的复制后，GTID 设置将应用于入站和出站两种二进制日志复制。

**为 Aurora MySQL 集群启用基于 GTID 的复制**

1. 使用以下参数设置创建或编辑数据库集群参数组：
   + `gtid_mode` – `ON` 或 `ON_PERMISSIVE`
   + `enforce_gtid_consistency` – `ON`

1. 将数据库集群参数组与 Aurora MySQL 集群关联。为此，请按照 [Amazon Aurora 的参数组](USER_WorkingWithParamGroups.md) 中的过程进行操作。

1. （可选）指定如何将 GTID 分配给不包括它们的事务。为实现此目的，请在 [mysql.rds\$1assign\$1gtids\$1to\$1anonymous\$1transactions（Aurora MySQL 版本 3）](mysql-stored-proc-gtid.md#mysql_assign_gtids_to_anonymous_transactions) 中调用已存储的过程。

# 为Aurora MySQL 数据库集群禁用基于 GTID 的复制
<a name="mysql-replication-gtid.disabling"></a>

您可以为 Aurora MySQL 数据库集群禁用基于 GTID 的复制。这样做意味着 Aurora 集群不能对使用基于 GTID 的复制的外部数据库执行入站或出站二进制日志复制。

**注意**  
在以下过程中，*只读副本* 表示采用对外部数据库执行二进制日志复制的 Aurora 配置中的复制目标。它不表示只读 Aurora 副本数据库实例。例如，当 Aurora 集群接受来自外部源的传入复制时，Aurora 主实例充当二进制日志复制的只读副本。

有关此部分提到的存储过程的更多详细信息，请参阅 [Aurora MySQL 存储过程参考](AuroraMySQL.Reference.StoredProcs.md)。

**为 Aurora MySQL 数据库集群禁用基于 GTID 的复制**

1. 在 Aurora 副本上，运行以下过程：

   对于版本 3

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

   对于版本 2

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

1. 将 `gtid_mode` 重置为 `ON_PERMISSIVE`。

   1. 确保与 Aurora MySQL 集群关联的数据库集群参数组将 `gtid_mode` 设置为 `ON_PERMISSIVE`。

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

   1. 重启 Aurora MySQL 数据库集群。

1. 将 `gtid_mode` 重置为 `OFF_PERMISSIVE`。

   1. 确保与 Aurora MySQL 集群关联的数据库集群参数组将 `gtid_mode` 设置为 `OFF_PERMISSIVE`。

   1. 重启 Aurora MySQL 数据库集群。

1. 等待在 Aurora 主实例上应用所有 GTID 事务。要检查是否应用了这些事务，请按以下步骤操作：

   1. 在 Aurora 主实例上，运行 `SHOW MASTER STATUS` 命令。

      您的输出应类似于以下输出。

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

      记下输出中的文件和位置。

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

      对于版本 3

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

      对于版本 2

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

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

      对于版本 3

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

      对于版本 2

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

1. 重置 GTID 参数以禁用基于 GTID 的复制。

   1. 确保与 Aurora MySQL 集群关联的数据库集群参数组具有以下参数设置：
      + `gtid_mode` – `OFF`
      + `enforce_gtid_consistency` – `OFF`

   1. 重启 Aurora MySQL 数据库集群。