

# 使用数据库实例只读副本
<a name="USER_ReadRepl"></a>

只读副本是数据库实例的只读副本。您可以将从应用程序发出的查询路由到只读副本，以减轻主数据库实例上的负载。通过这种方法，可以实现弹性横向扩展并超越单个数据库实例的容量限制，以处理读取密集型数据库工作负载。

要从源数据库实例创建只读副本，Amazon RDS 使用数据库引擎的内置复制特征。有关在特定引擎上使用只读副本的信息，请参阅以下部分：
+ [使用适用于 Amazon RDS for Db2 的副本](db2-replication.md)
+ [使用 MariaDB 只读副本](USER_MariaDB.Replication.ReadReplicas.md)
+ [在 Amazon RDS 中使用 Microsoft SQL Server 的只读副本](SQLServer.ReadReplicas.md)
+ [使用 MySQL 只读副本](USER_MySQL.Replication.ReadReplicas.md)
+ [使用 Amazon RDS for Oracle 的只读副本](oracle-read-replicas.md)
+ [使用 Amazon RDS for PostgreSQL 只读副本](USER_PostgreSQL.Replication.ReadReplicas.md)

在从源数据库实例创建只读副本后，源将成为主数据库实例。当您更新主数据库实例时，Amazon RDS 将它们异步复制到只读副本。下图显示了源数据库实例正在复制到不同可用区（AZ）中的只读副本。客户端拥有对主数据库实例的读/写访问权限以及对副本的只读访问权限。

![\[只读副本配置\]](http://docs.aws.amazon.com/zh_cn/AmazonRDS/latest/UserGuide/images/read-replica.png)


只读副本按标准数据库实例计费，费率与用于副本的数据库实例类相同。在位于同一个 AWS 区域中的源数据库实例与只读副本之间复制数据所产生的数据传输不收费。有关更多信息，请参阅[跨区域复制成本](USER_ReadRepl.XRgn.md#USER_ReadRepl.XRgn.Costs)和[Amazon RDS 的数据库实例计费 ](User_DBInstanceBilling.md)。

**Topics**
+ [Amazon RDS 只读副本概述](#USER_ReadRepl.Overview)
+ [数据库引擎的只读副本之间的差异](USER_ReadRepl.Overview.Differences.md)
+ [创建只读副本](USER_ReadRepl.Create.md)
+ [将只读副本提升为独立的数据库实例](USER_ReadRepl.Promote.md)
+ [监控只读复制](USER_ReadRepl.Monitoring.md)
+ [在不同的 中创建只读副本AWS 区域](USER_ReadRepl.XRgn.md)

## Amazon RDS 只读副本概述
<a name="USER_ReadRepl.Overview"></a>

以下各节讨论数据库*实例*只读副本。有关多可用区数据库*集群* 只读副本的信息，请参阅[使用 Amazon RDS 的多可用区数据库集群只读副本](USER_MultiAZDBCluster_ReadRepl.md)。

**Topics**
+ [只读副本的使用案例](#USER_ReadRepl.Overview.use-cases)
+ [只读副本的工作原理](#USER_ReadRepl.Overview.how-it-works)
+ [多可用区部署中的只读副本](#USER_ReadRepl.Overview.maz-replicas)
+ [跨区域只读副本](#USER_ReadRepl.Overview.xregion-replicas)
+ [只读副本存储类型](#USER_ReadRepl.Overview.replica-storage)
+ [从副本创建副本的限制](#USER_ReadRepl.Overview.circular-replication)
+ [删除副本时的注意事项](#USER_ReadRepl.Overview.deletion-considerations)

### 只读副本的使用案例
<a name="USER_ReadRepl.Overview.use-cases"></a>

为给定的源数据库实例部署一个或多个只读副本在各种情况下都可能有意义，包括：
+ 扩展用于执行大量读取数据库工作负载的单个数据库实例的计算资源或 I/O 容量。可以将过多的读取流量引导到一个或多个只读副本。
+ 当源数据库实例不可用时，为读取流量提供服务。在某些情况下，您的源数据库实例可能无法处理 I/O 请求（例如，由于备份或计划维护而暂停 I/O)。在这些情况下，您可以将读取流量引导到只读副本。对于这种使用案例，请注意，由于源数据库实例不可用，因而只读副本中的数据可能处于“静态”。
+ 对于业务报告或数据仓库方案，您可能希望针对只读副本（而生产数据库实例）运行业务报告查询。
+ 实施灾难恢复。如果主数据库实例出现故障，则将只读副本提升为独立的实例作为灾难恢复解决方案。

### 只读副本的工作原理
<a name="USER_ReadRepl.Overview.how-it-works"></a>

创建只读副本时，请指定现有的数据库实例作为源。紧接着，Amazon RDS 拍摄源实例的快照，并根据该快照创建一个只读实例。然后，每当主数据库实例发生更改时，Amazon RDS 就使用数据库引擎的异步复制方法来更新只读副本。

只读副本是仅允许只读连接的数据库实例。例外情况是 RDS for Db2 和 RDS for Oracle DB 数据库引擎，它们分别支持处于备用模式和装载模式的副本数据库。备用副本和装载副本不接受用户连接，因此无法为只读工作负载提供服务。备用副本和装载副本的主要用途是跨区域灾难恢复。有关更多信息，请参阅[使用适用于 Amazon RDS for Db2 的副本](db2-replication.md)和[使用 Amazon RDS for Oracle 的只读副本](oracle-read-replicas.md)。

应用程序连接到只读副本就像连接到任何数据库实例一样。Amazon RDS 复制源数据库实例中的所有数据库。

您必须手动创建只读副本。RDS 不支持自动扩缩只读副本，即在读取需求发生变化时自动添加或移除只读副本。

### 多可用区部署中的只读副本
<a name="USER_ReadRepl.Overview.maz-replicas"></a>

您可以为数据库实例配置只读副本，此外还配置了备用副本以实现多可用区部署中的高可用性。使用备用副本进行复制是同步的。与只读副本不同，备用副本无法处理读取流量。

在以下场景中，客户端拥有对一个可用区中的主数据库实例的读取/写入权限。主实例将更新异步复制到第二个可用区中的只读副本，还将更新同步复制到第三个可用区中的备用副本。客户端仅对只读副本具有读取权限。

![\[只读副本和备用副本配置\]](http://docs.aws.amazon.com/zh_cn/AmazonRDS/latest/UserGuide/images/read-and-standby-replica.png)


有关高可用性和备用副本的更多信息，请参阅[配置和管理 Amazon RDS 的多可用区部署](Concepts.MultiAZ.md)。

### 跨区域只读副本
<a name="USER_ReadRepl.Overview.xregion-replicas"></a>

在某些情况下，只读副本与其主数据库实例位于不同的 AWS 区域。在这些情况下，Amazon RDS 在主数据库实例与只读副本之间设置安全通道。Amazon RDS 建立启用安全通道所需的任何AWS安全配置，例如添加安全组条目。有关跨区域只读副本的更多信息，请参阅[在不同的 中创建只读副本AWS 区域](USER_ReadRepl.XRgn.md)。

本章中的信息适用于在源数据库实例所在的相同 AWS 区域中或在单独的 AWS 区域中创建 Amazon RDS 只读副本。以下信息不适用于对 Amazon EC2 实例上运行的实例或本地实例设置复制操作。

### 只读副本存储类型
<a name="USER_ReadRepl.Overview.replica-storage"></a>

默认情况下，将创建与源数据库实例的存储类型相同的只读副本。但是，您可基于下表中列出的选项创建与源数据库实例的存储类型不同的只读副本。

<a name="rds-read-replica-storage-reference"></a>[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/AmazonRDS/latest/UserGuide/USER_ReadRepl.html)

**注意**  
增加只读副本的分配存储空间时，它必须至少增加 10%。如果您尝试将该值增加不到 10％，则会得到错误。

### 从副本创建副本的限制
<a name="USER_ReadRepl.Overview.circular-replication"></a>

Amazon RDS 不支持循环复制。您不能将数据库实例配置为充当现有数据库实例的复制源。您只可以基于现有数据库实例创建新的只读副本。例如，如果 **MySourceDBInstance** 复制到 **ReadReplica1**，您不能将 **ReadReplica1** 配置为复制回 **MySourceDBInstance**。

对于 RDS for MariaDB 和 RDS for MySQL 以及特定版本的 RDS for PostgreSQL，您可以基于现有只读副本创建只读副本。例如，您可以从现有副本 **ReadReplica1** 创建新的只读副本 **ReadReplica2**。对于 RDS for Db2、RDS for Oracle 和 RDS for SQL Server，您不能基于现有只读副本来创建只读副本。

### 删除副本时的注意事项
<a name="USER_ReadRepl.Overview.deletion-considerations"></a>

RDS 不支持自动扩缩只读副本。因此，RDS 不会在需求上升时增加副本数量，也不会在需求下降时减少副本数量。如果您不再需要只读副本，则使用用于删除数据库实例的相同机制手动删除它们。如果您在同一 AWS 区域中删除源数据库实例而未删除其只读副本，则每个副本都会提升为独立的数据库实例。

有关删除数据库实例的信息，请参阅[删除数据库实例](USER_DeleteInstance.md)。有关只读副本提升的信息，请参阅[将只读副本提升为独立的数据库实例](USER_ReadRepl.Promote.md)。有关删除跨区域只读副本的源数据库实例的信息，请参阅[跨区域复制注意事项](USER_ReadRepl.XRgn.md#USER_ReadRepl.XRgn.Cnsdr)。

# 数据库引擎的只读副本之间的差异
<a name="USER_ReadRepl.Overview.Differences"></a>

由于 Amazon RDS 数据库引擎实施复制的方式不同，因此您应了解几个显著差异。

## Db2
<a name="USER_ReadRepl.Overview.Differences.Db2"></a>

RDS for Db2 的副本具有以下功能和行为：
+ **复制方法**：物理复制。
+ **事务日志清除**：当满足以下条件时，RDS for Db2 会清除主数据库实例中的日志：
  + 这些日志至少保留了两个小时。
  + 归档日志保留时间设置已过期。
  + RDS for Db2 已成功将日志复制到所有副本数据库实例。

  这同时适用于相同 AWS 区域数据库实例和跨区域数据库实例。有关如何设置存档日志保留时间的信息，请参阅[rdsadmin.set\$1archive\$1log\$1retention](db2-sp-managing-databases.md#db2-sp-set-archive-log-retention)。
+ **可写副本**：Db2 副本是物理副本，而 Db2 不支持写入副本。您可以提升副本以使其变为可写。提升的副本拥有提出提升请求时的已复制数据。
+ **备份** – RDS for Db2 副本支持自动备份和手动快照。
+ **并行复制** – 归档日志数据始终会从主数据库并行传输到其所有副本。
+ **备用状态** – 备用副本的主要用途是跨区域灾难恢复。有关信息，请参阅[使用适用于 Amazon RDS for Db2 的副本](db2-replication.md)。

## MariaDB 和 MySQL
<a name="USER_ReadRepl.Overview.Differences.MariaDBMySQL"></a>

RDS for MariaDB 和 RDS for MySQL 的只读副本具有以下功能和行为：
+ **复制方法**：逻辑复制。
+ **事务日志清除**：RDS for MariaDB 和 RDS for MySQL 保留尚未应用的任何二进制日志。
+ **可写副本**：可将 MariaDB 或 MySQL 只读副本启用为可写。
+ **备份** – RDS for MariaDB 或 RDS for MySQL 只读副本支持自动备份和手动快照。
+ **并行复制** – 所有受支持的 MariaDB 和 MySQL 版本均支持并行复制线程。
+ **装载状态**：不支持。

## Oracle
<a name="USER_ReadRepl.Overview.Differences.Oracle"></a>

RDS for Oracle 的只读副本具有以下功能和行为：
+ **复制方法**：物理复制。
+ **事务日志清除**：如果主数据库实例没有跨区域只读副本，则 Amazon RDS for Oracle 会在源数据库实例上至少保留两个小时的事务日志。两小时之后或在传递存档日志保留小时数设置之后从源数据库实例中清除日志，以时间较长者为准。传递存档日志保留小时数设置之后，仅当日志已成功应用到数据库时，才会从只读副本清除日志。

  在某些情况下，主数据库实例可能具有一个或多个跨区域只读副本。如果是这样，则 Amazon RDS for Oracle 将保留源数据库实例上的事务日志，直到将它们传输并应用到所有跨区域只读副本为止。

  有关如何设置存档日志保留时间的信息，请参阅[保留存档重做日志](Appendix.Oracle.CommonDBATasks.RetainRedoLogs.md)。
+ **可写副本**：Oracle 只读副本是物理副本，Oracle 不支持写入只读副本。您可以提升只读副本以将它设置为可写。提升的只读副本拥有提出提升请求时的已复制数据。
+ **备份** – RDS for Oracle 只读副本支持自动备份和手动快照。
+ **并行复制**：重做日志数据始终会从主数据库并行传输到其所有只读副本。
+ **装载状态** – 装载副本的主要用途是跨区域灾难恢复。装载副本不需要具有 Active Data Guard 许可证。有关更多信息，请参阅 [使用 Amazon RDS for Oracle 的只读副本](oracle-read-replicas.md)。

## PostgreSQL
<a name="USER_ReadRepl.Overview.Differences.PostgreSQL"></a>

RDS for PostgreSQL 的只读副本具有以下功能和行为：
+ **复制方法**：物理复制。
+ **事务日志清除**：PostgreSQL 具有参数 `wal_keep_segments`，该参数指示保留多少个提前写入日志（WAL）文件以便为只读副本提供数据。该参数值指定要保留的日志的数量。
+ **可写副本**：PostgreSQL 只读副本是一个物理副本，PostgreSQL 不支持使只读副本变为可写。
+ **备份**：RDS for PostgreSQL 只读副本支持手动快照。仅 RDS for PostgreSQL 14.1 及更高版本支持只读副本的自动备份。您无法为早于 14.1 的 RDS for PostgreSQL 版本的 PostgreSQL 只读副本启用自动备份。对于 RDS for PostgreSQL 13 和更早版本，如果需要只读副本的备份，请从只读副本创建快照。
+ **并行复制**：PostgreSQL 是一个处理复制的过程。
+ **装载状态**：不支持。

## SQL Server
<a name="USER_ReadRepl.Overview.Differences.SQLServer"></a>

RDS for SQL Server 的只读副本具有以下功能和行为：
+ **复制方法**：物理复制。
+ **事务日志清除**：辅助副本不再需要主副本上事务日志文件的虚拟日志文件（VLF）后，可以截断该文件。

  只有在副本中稳定了日志记录时，才能将 VLF 标记为非活动。无论磁盘子系统在主副本中的速度如何，事务日志都将保留 VLF，直到最慢的副本已进行稳定。
+ **可写副本**：SQL Server 只读副本是物理副本，也不支持写入。您可以提升只读副本以将它设置为可写。提升的只读副本拥有提出提升请求时的已复制数据。
+ **备份**：RDS for SQL Server 只读副本不支持自动备份和手动快照。
+ **并行复制**：重做日志数据始终会从主数据库并行传输到其所有只读副本。
+ **装载状态**：不支持。

# 创建只读副本
<a name="USER_ReadRepl.Create"></a>

您可以使用 AWS 管理控制台、AWS CLI 或 RDS API 从现有数据库实例创建只读副本。可通过指定 `SourceDBInstanceIdentifier`（要从其进行复制的源数据库实例的数据库实例标识符）创建只读副本。

当您创建只读副本时，Amazon RDS 会制作源数据库实例的数据库快照，然后开始复制。数据库快照操作开始时，源数据库实例会经历非常短暂的 I/O 暂停。这种 I/O 暂停通常持续大约一秒时间。如果源数据库实例为多可用区部署，则可避免 I/O 暂停，因为在这种情况下，会从辅助数据库实例制作数据库快照。

长时间运行的活动事务会减慢创建只读副本的过程。我们建议您等待长时间运行的事务完成，然后再创建只读副本。如果从同一源数据库实例同时创建多个并行只读副本，则 Amazon RDS 仅在开始第一个创建操作时创建一张快照。

创建只读副本时，有几件事情需要考虑。首先，您必须先通过将备份保留期设置为一个非零值来在源数据库实例上启用自动备份。此要求也适用于作为一个只读副本的源数据库实例的另一个只读副本。要对 RDS for MariaDB 只读副本启用自动备份，请先创建只读副本，然后修改只读副本以启用自动备份。

**注意**  
在 AWS 区域内，我们强烈建议您在与源数据库实例相同的基于 Amazon VPC 的虚拟私有云（VPC）中创建所有只读副本。如果您在与源数据库实例不同的 VPC 中创建只读副本，则副本和 RDS 系统之间的无类域间路由 (CIDR) 范围可能会重叠。CIDR 重叠会使副本不稳定，从而对连接到副本的应用程序产生负面影响。如果您在创建只读副本时收到错误，请选择其他目标数据库子网组。有关更多信息，请参阅 [在 VPC 中使用数据库实例](USER_VPC.WorkingWithRDSInstanceinaVPC.md)。  
无法直接使用控制台或 AWS CLI 在其他 AWS 账户中创建只读副本。

## 控制台
<a name="USER_ReadRepl.Create.Console"></a>

**从源数据库实例创建只读副本**

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

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

1. 选择要作为只读副本源的数据库实例。

1. 对于 **Actions (操作)**，选择 **Create read replica (创建只读副本)**。

1. 对于**数据库实例标识符**，输入该只读副本的名称。

1. 选择您的实例配置。建议您为只读副本使用与源数据库实例相同或更大的数据库实例类和存储类型。

1. 对于 **AWS 区域**，指定只读副本的目标区域。

1. 对于**存储**，指定分配的存储大小以及是否要使用存储自动扩缩。

   如果您的源数据库实例未使用最新的存储配置，则可以使用**升级存储文件系统配置**选项。您可以启用此设置将只读副本的存储文件系统升级到首选配置。有关更多信息，请参阅 [升级数据库实例的存储文件系统](USER_PIOPS.UpgradeFileSystem.md)。

1. 对于**可用性**，选择是否在另一个可用区中创建副本的备用来支持副本的故障转移。
**注意**  
创建您的只读副本作为多可用区数据库实例与源数据库是否为多可用区数据库实例无关。

1. 指定其他数据库实例设置。有关每项可用设置的信息，请参阅[数据库实例的设置](USER_CreateDBInstance.Settings.md)。

1. 要创建加密的只读副本，请展开**其他配置**并指定以下设置：

   1. 选择**启用加密**。

   1. 对于 **AWS KMS key**，选择 KMS 密钥的 AWS KMS key 标识符。
**注意**  
 源数据库实例必须加密。要了解关于加密源数据库实例的更多信息，请参阅 [加密 Amazon RDS 资源](Overview.Encryption.md)。

1. 选择 **Create read replica (创建只读副本)**。

创建只读副本后，您可以在 RDS 控制台的**数据库**页面上看到它。它在**角色**列中显示**副本**。

## AWS CLI
<a name="USER_ReadRepl.Create.CLI"></a>

要从源数据库实例创建只读副本，请使用 AWS CLI 命令 [create-db-instance-read-replica](https://docs.aws.amazon.com/cli/latest/reference/rds/create-db-instance-read-replica.html)。此示例还设置了分配存储大小、启用了存储自动扩展，并将文件系统升级到首选配置。

您可以指定其他设置。有关每项设置的信息，请参阅 [数据库实例的设置](USER_CreateDBInstance.Settings.md)。

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

```
aws rds create-db-instance-read-replica \
    --db-instance-identifier myreadreplica \
    --source-db-instance-identifier mydbinstance \
    --allocated-storage 100 \
    --max-allocated-storage 1000 \
    --upgrade-storage-config
```
对于：Windows  

```
aws rds create-db-instance-read-replica ^
    --db-instance-identifier myreadreplica ^
    --source-db-instance-identifier mydbinstance ^
    --allocated-storage 100 ^
    --max-allocated-storage 1000 ^
    --upgrade-storage-config
```

## RDS API
<a name="USER_ReadRepl.Create.API"></a>

要从源 Db2、MySQL、MariaDB、Oracle、PostgreSQL 或 SQL Server 数据库实例创建只读副本，请调用具有以下必要参数的 Amazon RDS API [CreateDBInstanceReadReplica](https://docs.aws.amazon.com/AmazonRDS/latest/APIReference/API_CreateDBInstanceReadReplica.html) 操作：
+ `DBInstanceIdentifier`
+ `SourceDBInstanceIdentifier`

**注意**  
 要创建 RDS for Db2 备用副本，请将可选 `ReplicaMode` 操作设置为 `mounted`。

# 将只读副本提升为独立的数据库实例
<a name="USER_ReadRepl.Promote"></a>

您可以将只读副本提升为独立的数据库实例。如果源数据库实例有多个只读副本，则将其中一个只读副本提升为数据库实例对其他副本无影响。

提升只读副本时，RDS 会在使其可用之前重启数据库实例。提升过程可能需要几分钟或更长时间才能完成，具体时间取决于只读副本的大小。

![\[提升只读副本\]](http://docs.aws.amazon.com/zh_cn/AmazonRDS/latest/UserGuide/images/read-replica-promote.png)


## 提升只读副本的使用案例
<a name="USER_ReadRepl.Promote.use_cases"></a>

出于以下几个原因，您可能需要将只读副本提升为独立的数据库实例：
+ **实施故障恢复** – 如果主数据库实例失败，您可以使用只读副本提升作为数据恢复方案。此方法可补充同步复制、自动故障检测和故障转移。

  如果您了解异步复制的影响和限制，并且仍然要使用只读副本提升功能实现数据恢复，则可以这样做。为此，请先创建只读副本，然后监控主数据库实例的故障。如果出现故障，请执行以下操作：

  1. 提升只读副本。

  1. 将数据库流量指引到提升的数据库实例。

  1. 将提升的数据库实例作为源，创建替代只读副本。
+ **升级存储配置** - 如果您的源数据库实例未使用首选存储配置，则可以创建该实例的只读副本，并升级存储文件系统配置。此选项可将只读副本的文件系统迁移到首选配置。您可以将只读副本升级为独立的数据库实例。

  您可以使用此选项来克服较旧 32 位文件系统的存储和文件大小的扩展限制。有关更多信息，请参阅 [升级数据库实例的存储文件系统](USER_PIOPS.UpgradeFileSystem.md)。

  只有当您的源数据库实例*未*使用最新的存储配置，或者您要在同一请求中修改数据库实例类时，此选项才可用。
+ **分片** – 分片体现了“无共享”架构，主要涉及将大型数据库分成几个较小的数据库。拆分数据库的一种常用方法是将未加入到同一查询中的表拆分到不同主机。另一种方法是跨多台主机复制表，然后通过哈希算法确定哪一台主机接收给定的更新。您可以创建与各分片（较小的数据库）相对应的只读副本，决定将它们转换成独立分片后即可对其进行提升。然后可以根据您的要求，为每个分区创建表的密钥空间 (如果要拆分行) 或分配。
+ **执行 DDL 操作（仅限 MySQL 和 MariaDB）**– 创建或重新生成索引等 DDL 操作需要耗费时间，并且会显著影响数据库实例性能。在 MySQL 或 MariaDB 只读副本与其主数据库实例同步后，可以对该只读副本执行这些操作。然后就可以提升此只读副本并指导应用程序使用提升的实例。

**注意**  
如果您的只读副本是 RDS for Oracle 数据库实例，则可以执行*切换*而不是提升操作。在切换中，源数据库实例成为新的副本，副本成为新的源数据库实例。有关更多信息，请参阅 [执行 Oracle Data Guard 切换](oracle-replication-switchover.md)。

## 提升后的只读副本的特征
<a name="USER_ReadRepl.Promote.characteristics"></a>

在提升只读副本后，它不再作为只读副本，而是成为独立的数据库实例。该新的独立数据库实例具有以下特性：
+ 独立的数据库实例会保留提升前只读副本的选项组和参数组。
+ 您可以从独立的数据库实例创建只读副本，并执行时间点还原操作。
+ 由于数据库实例不再是只读副本，因此不能再使用它作为复制目标。

## 提升只读副本的先决条件
<a name="USER_ReadRepl.Promote.prereqs"></a>

在提升只读副本之前，请执行以下操作：
+ 查看您的备份策略：
  + 建议启用备份并至少完成一次备份。备份持续时间随在上次备份后对数据库进行的更改数而发生变化。
  + 如果您为只读副本启用了备份，请配置自动备份时段，以便每日备份不会影响只读副本提升。
  + 确保您的只读副本不处于 `backing-up` 状态。当只读副本处于这种状态时，您无法对其进行提升。
+ 停止向主数据库实例写入任何事务，然后等待 RDS 将所有更新应用于只读副本。

  在主数据库实例上完成数据库更新后，只读副本进行数据库更新。复制滞后可能会有很大差异。使用 [https://aws.amazon.com/rds/faqs/#105](https://aws.amazon.com/rds/faqs/#105) 指标确定只读副本完成所有更新的时间。
+ （仅限 MySQL 和 MariaDB）：如果要在提升之前，对 MySQL 或 MariaDB 只读副本进行更改，必须在只读副本的数据库参数组中将 `read_only` 参数设置为 `0`。然后可在只读副本上执行所有必需的 DDL 操作，如创建索引。在只读副本上执行的操作不会影响主数据库实例的性能。

## 提升只读副本：基本步骤
<a name="USER_ReadRepl.Promote.steps"></a>

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

1. 使用 Amazon RDS 控制台上的**提升**选项、AWS CLI 命令 [https://docs.aws.amazon.com/cli/latest/reference/rds/promote-read-replica.html](https://docs.aws.amazon.com/cli/latest/reference/rds/promote-read-replica.html) 或 [https://docs.aws.amazon.com/AmazonRDS/latest/APIReference/API_PromoteReadReplica.html](https://docs.aws.amazon.com/AmazonRDS/latest/APIReference/API_PromoteReadReplica.html) Amazon RDS API 操作来提升只读副本。
**注意**  
提升过程需要几分钟才能完成。在提升只读副本时，RDS 会停止复制并重启只读副本。完成重启后，只读副本即可作为新数据库实例使用。

1. (可选) 将新的数据库实例修改为多可用区部署。有关更多信息，请参阅 [修改 Amazon RDS 数据库实例](Overview.DBInstance.Modifying.md) 和 [配置和管理 Amazon RDS 的多可用区部署](Concepts.MultiAZ.md)。

### 控制台
<a name="USER_ReadRepl.Promote.Console"></a>

**将只读副本提升为独立的数据库实例**

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

1. 在 Amazon RDS 控制台中，选择**数据库**。

   随后会显示**数据库**窗格。每个只读副本在**角色**列中显示**副本**。

1. 选择要提升的只读副本。

1. 对于**操作**，请选择**提升**。

1. 在**提升只读副本**页面上，输入新提升的数据库实例的备份保留期和备份时段。

1. 根据需要设置完毕后，选择 **Continue**。

1. 在确认页面上，选择 **Promote Read Replica (提升只读副本)**。

### AWS CLI
<a name="USER_ReadRepl.Promote.CLI"></a>

要将只读副本提升为独立的数据库实例，请使用 AWS CLI [https://docs.aws.amazon.com/cli/latest/reference/rds/promote-read-replica.html](https://docs.aws.amazon.com/cli/latest/reference/rds/promote-read-replica.html) 命令。

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

```
aws rds promote-read-replica \
    --db-instance-identifier myreadreplica
```
对于：Windows  

```
aws rds promote-read-replica ^
    --db-instance-identifier myreadreplica
```

### RDS API
<a name="USER_ReadRepl.Promote.API"></a>

要将只读副本提升为独立的数据库实例，请调用具有必要参数 `PromoteReadReplica` 的 Amazon RDS API [https://docs.aws.amazon.com/AmazonRDS/latest/APIReference/API_PromoteReadReplica.html](https://docs.aws.amazon.com/AmazonRDS/latest/APIReference/API_PromoteReadReplica.html) 操作。

# 监控只读复制
<a name="USER_ReadRepl.Monitoring"></a>

您可以通过几个方法监控只读副本的状态。Amazon RDS 控制台在只读副本详细信息的 **Connectivity & security**（连接和安全）选项卡的 **Replication**（复制）部分中显示只读副本的状态。要查看只读副本的详细信息，请在 Amazon RDS 控制台的数据库实例列表中选择该只读副本的名称。

![\[只读副本状态\]](http://docs.aws.amazon.com/zh_cn/AmazonRDS/latest/UserGuide/images/ReadReplicaStatus.png)


您还可以使用 AWS CLI`describe-db-instances` 命令或 Amazon RDS API `DescribeDBInstances` 操作查看只读副本的状态。

只读副本的状态可以是以下某项：
+ ****正在复制**** – 正在成功地复制只读副本。
+ ****复制已降级**（仅 SQL Server 和 PostgreSQL）– **副本从主实例接收数据，但一个或多个数据库可能无法获取更新。例如，当副本正在设置新创建的数据库时，可能会发生这种情况。当在蓝绿部署的蓝色环境中进行不支持的 DDL 或大型对象更改时，也可能发生这种情况。

  除非在降级状态期间发生错误，否则状态不会从 `replication degraded` 转换为 `error`。
+ ****错误**** – 复制出错。检查 Amazon RDS 控制台中的**复制错误**字段或事件日志以确定具体错误。有关复制错误故障诊断的详细信息，请参阅 [排查 MySQL 只读副本问题](USER_ReadRepl.Troubleshooting.md)。
+ ****已终止**（仅限 MariaDB、MySQL 或 PostgreSQL）** – 复制已终止。如果复制连续终止超过 30 天，不论是手动还是由于复制错误，都将会出现这种情况。在这种情况下，Amazon RDS 会终止主数据库实例和所有只读副本之间的复制。Amazon RDS 这样做是为了防止源数据库实例上的存储需求增长以及长失效转移时间。

  复制中断可能影响存储，因为日志的大小和数量可能因向日志写入大量错误消息而增大。复制中断还可能影响故障恢复，因为 Amazon RDS 在恢复期间需要一段时间来维护和处理大量日志。
+ ****terminated**（已终止）（仅限 Oracle）** – 复制已终止。如果复制因只读副本上没有剩下足够的存储空间而停止超过 8 小时，就会发生这种情况。在这种情况下，Amazon RDS 会终止主数据库实例与受影响只读副本之间的复制。此状态为最终状态，必须重新创建只读副本。
+ ****已停止**（仅限 MariaDB 或 MySQL）** – 复制已因客户发起请求而停止。
+ ****复制停止点设置**​（仅限 MySQL）** – 使用[mysql.rds\$1start\$1replication\$1until](mysql-stored-proc-replicating.md#mysql_rds_start_replication_until)存储过程设置客户启动的停止点，并且正在进行复制。
+ ****达到复制停止点**​（仅限 MySQL）** – 使用[mysql.rds\$1start\$1replication\$1until](mysql-stored-proc-replicating.md#mysql_rds_start_replication_until)存储过程设置客户启动的停止点，并且复制已停止（因为已达到停止点）。

您可以查看到数据库实例的复制位置，如果是，请检查其复制状态。在 RDS 控制台的**数据库**页面上，它在**角色**列中显示**主要**。选择其数据库实例名称。在详细信息页面的**连接性和安全性**选项卡上，其复制状态位于**复制**下。

## 监控复制滞后
<a name="USER_ReadRepl.Monitoring.Lag"></a>

您可以通过查看 Amazon RDS `ReplicaLag` 指标，在 Amazon CloudWatch 中监控复制滞后。

对于 Db2，`ReplicaLag` 指标是已落后的数据库的最大滞后秒数。例如，如果两个数据库分别滞后 5 秒和 10 秒，则 `ReplicaLag` 为 10 秒。没有可用高可用性灾难恢复（HADR）状态的数据库不包括在计算中。

对于 MariaDB 和 MySQL，`ReplicaLag` 指标报告 `Seconds_Behind_Master` 命令的 `SHOW REPLICA STATUS` 字段的值。MySQL 和 MariaDB 的复制滞后的常见原因如下所示：
+ 网络中断。
+ 向只读副本上带索引的表写入。如果只读副本上的 `read_only` 参数未设置为 0，它可以中断复制。
+ 使用 MyISAM 等非事务性存储引擎。只有 MySQL 上 InnoDB 存储引擎和 MariaDB 上的 XtraDB 存储引擎支持复制。

**注意**  
以前的 MariaDB 版本使用的是 `SHOW SLAVE STATUS`，而不是 `SHOW REPLICA STATUS`。如果您使用的 MariaDB 版本低于 10.5，请使用 `SHOW SLAVE STATUS`。

当 `ReplicaLag` 指标达到 0 时，即表示副本已赶上主数据库实例进度。如果 `ReplicaLag` 指标返回 `-1`，则当前未激活复制。`ReplicaLag = -1` 等效于 `Seconds_Behind_Master = NULL`。

对于 Oracle，`ReplicaLag` 指标是以下项的总和：`Apply Lag` 值加上当前时间和应用滞后的 `DATUM_TIME` 值之间的差。`DATUM_TIME` 值是只读副本从其源数据库实例收到数据的最后时间。有关更多信息，请参阅 Oracle 文档中的[V\$1DATAGUARD\$1STATS](https://docs.oracle.com/database/121/REFRN/GUID-B346DD88-3F5E-4F16-9DEE-2FDE62B1ABF7.htm#REFRN30413)。

对于 SQL Server，`ReplicaLag` 指标是已落后数据库的最大滞后秒数。例如，如果您有两个数据库分别滞后 5 秒和 10 秒，则 `ReplicaLag` 为 10 秒。`ReplicaLag` 指标返回以下查询的值。

```
SELECT MAX(secondary_lag_seconds) max_lag FROM sys.dm_hadr_database_replica_states;
```

有关更多信息，请参阅 Microsoft 文档中的 [secondary\$1lag\$1seconds](https://docs.microsoft.com/en-us/sql/relational-databases/system-dynamic-management-views/sys-dm-hadr-database-replica-states-transact-sql)。

如果 RDS 无法确定滞后，例如在副本安装期间或只读副本处于 `ReplicaLag` 状态时，则 `-1` 返回 `error`。

**注意**  
只有当新数据库在只读副本上可供访问之后，才会将其包含在延迟计算中。

对于 PostgreSQL， `ReplicaLag` 指标返回以下查询的值。

```
SELECT extract(epoch from now() - pg_last_xact_replay_timestamp()) AS reader_lag
```

PostgreSQL 9.5.2 版及更高版本使用物理复制槽来管理源实例上的提前写入日志 (WAL) 保留。对于每个跨区域只读副本实例，Amazon RDS 创建一个物理复制槽并将它与实例关联。两个 Amazon CloudWatch 指标、`Oldest Replication Slot Lag` 和 `Transaction Logs Disk Usage` 表示最滞后的副本（依据接收到的 WAL 数据）的滞后时间和用于 WAL 数据的存储空间。当跨区域只读副本长时间滞后时，`Transaction Logs Disk Usage` 值会显著增大。

有关使用 CloudWatch 监控数据库实例的更多信息，请参阅[使用 Amazon CloudWatch 监控 Amazon RDS 指标](monitoring-cloudwatch.md)。

# 在不同的 中创建只读副本AWS 区域
<a name="USER_ReadRepl.XRgn"></a>

借助 Amazon RDS，您可以在与源数据库实例不同的 AWS 区域中创建只读副本。

![\[跨区域只读副本配置\]](http://docs.aws.amazon.com/zh_cn/AmazonRDS/latest/UserGuide/images/read-replica-cross-region.png)


您可在其他 AWS 区域创建只读副本，用于执行以下操作：
+ 完善灾难恢复功能。
+ 将读取操作扩展到与用户更接近的 AWS 区域。
+ 使从一个 AWS 区域中的数据中心迁移到另一个 AWS 区域中的数据中心的操作变得更轻松。

在与源实例不同的 AWS 区域中创建只读副本与在同一 AWS 区域中创建副本非常相似。您可以使用 AWS 管理控制台、运行 [https://docs.aws.amazon.com/cli/latest/reference/rds/create-db-instance-read-replica.html](https://docs.aws.amazon.com/cli/latest/reference/rds/create-db-instance-read-replica.html) 命令或调用 [https://docs.aws.amazon.com/AmazonRDS/latest/APIReference/API_CreateDBInstanceReadReplica.html](https://docs.aws.amazon.com/AmazonRDS/latest/APIReference/API_CreateDBInstanceReadReplica.html) API 操作。

**注意**  
要在与源数据库实例不同的 AWS 区域中创建一个加密的只读副本，源数据库实例必须加密。

**Topics**
+ [区域和版本可用性](#USER_ReadRepl.XRgn.RegionVersionAvailability)
+ [创建跨区域只读副本](#ReadRepl.XRgn)
+ [Amazon RDS 如何执行跨区域复制](#USER_ReadRepl.XRgn.Process)
+ [跨区域复制注意事项](#USER_ReadRepl.XRgn.Cnsdr)
+ [跨区域复制成本](#USER_ReadRepl.XRgn.Costs)

## 区域和版本可用性
<a name="USER_ReadRepl.XRgn.RegionVersionAvailability"></a>

功能可用性和支持因每个数据库引擎的特定版本以及 AWS 区域而异。有关跨区域复制的版本和区域可用性的更多信息，请参阅[支持 Amazon RDS 中跨区域只读副本的区域和数据库引擎](Concepts.RDS_Fea_Regions_DB-eng.Feature.CrossRegionReadReplicas.md)。

## 创建跨区域只读副本
<a name="ReadRepl.XRgn"></a>

以下过程演示如何根据不同 AWS 区域中的源 Db2、MariaDB、Microsoft SQL Server、MySQL、Oracle 或 PostgreSQL 数据库实例创建只读副本。

### 控制台
<a name="USER_ReadRepl.XRgn.CON"></a>

您可以使用 AWS 管理控制台 跨不同 AWS 区域创建只读副本。

**使用控制台跨不同 AWS 区域创建只读副本**

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

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

1. 选择要用作只读副本源的 Db2、MariaDB、Microsoft SQL Server、MySQL、Oracle 或 PostgreSQL 数据库实例。

1. 对于 **Actions (操作)**，选择 **Create read replica (创建只读副本)**。

1. 对于**数据库实例标识符**，输入该只读副本的名称。

1. 选择**目标区域**。

1. 选择要使用的实例规格。我们建议您为只读副本使用相同或更大的数据库实例类和存储类型。

1. 要在其他 AWS 区域中创建加密只读副本，请执行以下操作：

   1. 选择 **Enable encryption（启用加密）**。

   1. 对于 **AWS KMS key**，请选择目标 AWS 区域中的 KMS 密钥的 AWS KMS key 标识符。
**注意**  
 要创建加密的只读副本，必须对源数据库实例进行加密。要了解关于加密源数据库实例的更多信息，请参阅 [加密 Amazon RDS 资源](Overview.Encryption.md)。

1. 选择其他选项，例如存储自动扩展。

1. 选择 **Create read replica (创建只读副本)**。

### AWS CLI
<a name="USER_ReadRepl.XRgn.CLI"></a>

要从不同 AWS 区域中的源 Db2、MariaDB、Microsoft SQL Server、MySQL、Oracle 或 PostgreSQL 数据库实例创建只读副本，可以使用 [https://docs.aws.amazon.com/cli/latest/reference/rds/create-db-instance-read-replica.html](https://docs.aws.amazon.com/cli/latest/reference/rds/create-db-instance-read-replica.html) 命令。在这种情况下，您从要在其中创建只读副本的 AWS 区域（目标区域）使用 [https://docs.aws.amazon.com/cli/latest/reference/rds/create-db-instance-read-replica.html](https://docs.aws.amazon.com/cli/latest/reference/rds/create-db-instance-read-replica.html)，并指定源数据库实例的 Amazon 资源名称（ARN）。ARN 唯一地标识 Amazon Web Services 中创建的资源。

例如，如果您的源数据库实例位于US East (N. Virginia)区域，则 ARN 看起来类似于下例：

```
arn:aws:rds:us-east-1:123456789012:db:mydbinstance
```

有关 ARN 的信息，请参阅 [Amazon RDS 中的 Amazon 资源名称（ARN）](USER_Tagging.ARN.md)。

 要在与源数据库实例不同的 AWS 区域中创建一个只读副本，您可以在目标 AWS 区域使用 AWS CLI [https://docs.aws.amazon.com/cli/latest/reference/rds/create-db-instance-read-replica.html](https://docs.aws.amazon.com/cli/latest/reference/rds/create-db-instance-read-replica.html) 命令。在另一 AWS 区域创建只读副本需要以下参数：
+  `--region` – 创建只读副本的目标 AWS 区域。
+  `--source-db-instance-identifier` – 源数据库实例的数据库实例标识符。对于源 AWS 区域，此标识符必须采用 ARN 格式。
+  `--db-instance-identifier` – 目标 中只读副本的标识符。AWS 区域

**Example 跨区域只读副本**  
以下代码从 US East (N. Virginia) 区域中的源数据库实例，在 美国西部（俄勒冈州） 区域中创建只读副本。  
对于 Linux、macOS 或 Unix：  

```
aws rds create-db-instance-read-replica \
    --db-instance-identifier myreadreplica \
    --region us-west-2 \
    --source-db-instance-identifier arn:aws:rds:us-east-1:123456789012:db:mydbinstance
```
对于：Windows  

```
aws rds create-db-instance-read-replica ^
    --db-instance-identifier myreadreplica ^
    --region us-west-2 ^
    --source-db-instance-identifier arn:aws:rds:us-east-1:123456789012:db:mydbinstance
```

在另一 AWS 区域创建加密的只读副本还需要以下参数：
+  `--kms-key-id` – 要用于对目标 AWS 区域中只读副本进行加密的 KMS 密钥的 AWS KMS key 标识符。

**Example 加密的跨区域只读副本**  
以下代码从 US East (N. Virginia) 区域中的源数据库实例，在 美国西部（俄勒冈州） 区域中创建加密的只读副本。  
对于 Linux、macOS 或 Unix：  

```
aws rds create-db-instance-read-replica \
    --db-instance-identifier myreadreplica \
    --region us-west-2 \
    --source-db-instance-identifier arn:aws:rds:us-east-1:123456789012:db:mydbinstance \
    --kms-key-id my-us-west-2-key
```
对于：Windows  

```
aws rds create-db-instance-read-replica ^
    --db-instance-identifier myreadreplica ^
    --region us-west-2 ^
    --source-db-instance-identifier arn:aws:rds:us-east-1:123456789012:db:mydbinstance ^
    --kms-key-id my-us-west-2-key
```

在 AWS GovCloud（美国东部）和 AWS GovCloud（美国西部）区域之间创建加密只读副本时需要 `--source-region` 选项。对于 `--source-region`，指定源数据库实例的 AWS 区域。

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

### RDS API
<a name="USER_ReadRepl.XRgn.API"></a>

要从不同 AWS 区域中的源 Db2、MariaDB、MySQL、Microsoft SQL Server、Oracle 或 PostgreSQL 数据库实例创建只读副本，可以调用 Amazon RDS API 操作 [CreateDBInstanceReadReplica](https://docs.aws.amazon.com/AmazonRDS/latest/APIReference/API_CreateDBInstanceReadReplica.html)。在本示例中，您从要在其中创建只读副本的 AWS 区域（目标区域）调用 [CreateDBInstanceReadReplica](https://docs.aws.amazon.com/AmazonRDS/latest/APIReference/API_CreateDBInstanceReadReplica.html) 并指定源数据库实例的 Amazon 资源名称（ARN）。ARN 唯一地标识 Amazon Web Services 中创建的资源。

要在与源数据库实例不同的 AWS 区域中创建加密只读副本，您可以在目标 AWS 区域使用 Amazon RDS API [https://docs.aws.amazon.com/AmazonRDS/latest/APIReference/API_CreateDBInstanceReadReplica.html](https://docs.aws.amazon.com/AmazonRDS/latest/APIReference/API_CreateDBInstanceReadReplica.html) 操作。要在另一个 AWS 区域中创建加密的只读副本，必须指定 `PreSignedURL` 的值。`PreSignedURL` 应包含对 [https://docs.aws.amazon.com/AmazonRDS/latest/APIReference/API_CreateDBInstanceReadReplica.html](https://docs.aws.amazon.com/AmazonRDS/latest/APIReference/API_CreateDBInstanceReadReplica.html) 操作的请求，以便调用创建只读副本的源 AWS 区域。要了解有关 `PreSignedUrl` 的更多信息，请参阅[https://docs.aws.amazon.com/AmazonRDS/latest/APIReference/API_CreateDBInstanceReadReplica.html](https://docs.aws.amazon.com/AmazonRDS/latest/APIReference/API_CreateDBInstanceReadReplica.html)。

例如，如果您的源数据库实例位于US East (N. Virginia)区域，则 ARN 看起来类似以下内容。

```
arn:aws:rds:us-east-1:123456789012:db:mydbinstance
```

有关 ARN 的信息，请参阅[Amazon RDS 中的 Amazon 资源名称（ARN）](USER_Tagging.ARN.md)。

**Example**  

```
https://us-west-2.rds.amazonaws.com/
    ?Action=CreateDBInstanceReadReplica
    &KmsKeyId=my-us-east-1-key
    &PreSignedUrl=https%253A%252F%252Frds.us-west-2.amazonaws.com%252F
         %253FAction%253DCreateDBInstanceReadReplica
         %2526DestinationRegion%253Dus-east-1
         %2526KmsKeyId%253Dmy-us-east-1-key
         %2526SourceDBInstanceIdentifier%253Darn%25253Aaws%25253Ards%25253Aus-west-2%123456789012%25253Adb%25253Amydbinstance
         %2526SignatureMethod%253DHmacSHA256
         %2526SignatureVersion%253D4%2526SourceDBInstanceIdentifier%253Darn%25253Aaws%25253Ards%25253Aus-west-2%25253A123456789012%25253Ainstance%25253Amydbinstance
         %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
    &DBInstanceIdentifier=myreadreplica
    &SourceDBInstanceIdentifier=&region-arn;rds:us-east-1:123456789012:db:mydbinstance
    &Version=2012-01-15						
    &SignatureVersion=2
    &SignatureMethod=HmacSHA256
    &Timestamp=2012-01-20T22%3A06%3A23.624Z
    &AWSAccessKeyId=<&AWS; Access Key ID>
    &Signature=<Signature>
```

## Amazon RDS 如何执行跨区域复制
<a name="USER_ReadRepl.XRgn.Process"></a>

Amazon RDS 使用以下过程创建跨区域只读副本。根据涉及的 AWS 区域和数据库中的数据量，此过程可能需要几个小时才能完成。在创建跨区域只读副本时，可使用此信息来确定过程进度：

1. Amazon RDS 开始将源数据库实例作为复制源配置，并将状态设置为 *modifying*。

1. Amazon RDS 开始在目标 AWS 区域中设置指定的只读副本，并将其状态设置为 *creating*（正在创建）。

1. Amazon RDS 在源 AWS 区域创建源数据库实例的自动数据库快照。数据库快照名称的格式为 `rds:<InstanceID>-<timestamp>`，其中 `<InstanceID>` 是源实例的标识符，`<timestamp>` 是复制开始的日期和时间。例如，`rds:mysourceinstance-2013-11-14-09-24` 是在 `mysourceinstance` 从实例 `2013-11-14-09-24` 创建的。在创建自动数据库快照期间，源数据库实例保持*正在修改* 状态，只读副本保持*正在创建* 状态，数据库快照处于*正在创建* 状态。控制台中数据库快照页面的进度栏可报告数据库快照创建进度。数据库快照创建完成后，数据库快照和源数据库实例的状态都将设置为 *available (可用)*。

1. Amazon RDS 开始为初始数据传输复制跨区域快照。快照复制在目标 AWS 区域作为自动快照列出，状态为 *creating*（正在创建）。其名称与源数据库快照相同。数据库快照的进度栏可显示复制进度。复制完成后，数据库快照的状态将被设置为 *available (可用)*。

1. Amazon RDS 随后使用对只读副本的初始数据加载的数据库快照副本。在此期间，只读副本位于目标区域的数据库实例列表中，状态为*正在创建*。加载完成后，只读副本的状态将设置为*可用*，数据库快照副本则被删除。

1. 当只读副本为可用状态时，Amazon RDS 启动，并复制自创建只读副本操作启动以来对源实例所做的修改。在此期间，只读副本的复制滞后时间将大于 0。

   有关使用复制滞后时间的信息，请参阅 [监控只读复制](USER_ReadRepl.Monitoring.md)。

## 跨区域复制注意事项
<a name="USER_ReadRepl.XRgn.Cnsdr"></a>

在一个 AWS 区域内执行复制需要注意的所有事项都适用于跨区域复制。在执行跨 AWS 区域复制时，还需要额外注意以下事项：
+ 源数据库实例可在多个 AWS 区域具有跨区域只读副本。由于源 VPC 对访问控制列表（ACL）条目数有限制，因此 RDS 无法保证 5 个以上的跨区域只读副本数据库实例。
+ 对于单个目标 AWS 区域，每个账户最多可以同时进行 20 个并行创建跨区域只读副本请求。您必须等待这些请求完成，然后才能向同一目标 AWS 区域提交其他创建跨区域只读副本请求。
+ 您可以在 GovCloud（美国东部）和 GovCloud（美国西部）区域之间进行复制，但无法复制到 GovCloud（美国）或从其中复制。
+ 对于以下 RDS 引擎，只有当源 Amazon RDS 数据库实例不是其他 Amazon RDS 数据库实例的只读副本时，才能从该源创建跨区域的 Amazon RDS 只读副本。
  + RDS for Db2
  + RDS for SQL Server
  + RDS for Oracle
  + 版本低于 14.1 的 RDS for PostgreSQL

  此限制不适用于运行 RDS for PostgreSQL 版本 14.1 版及更高版本、RDS for MariaDB 和 RDS for MySQL 版本的数据库实例。
+ 对于所在 AWS 区域与源实例不同的任何只读副本，其滞后时间将更长。产生此滞后时间是因为区域数据中心之间的网络通道更长。
+ 对于跨区域只读副本，所有指定 `--db-subnet-group-name` 参数的只读副本创建命令必须从同一 VPC 指定数据库子网组。
+ 大多数情况下，只读副本使用指定数据库引擎的默认数据库参数组和数据库选项组。

  对于 Db2 数据库引擎，必须为副本指定自定义参数组。对于使用 BYOL 模型的副本，此自定义参数组必须包括您的 IBM Site ID 和 IBM Customer ID。您可以使用 AWS 管理控制台、AWS CLI 或 RDS API 为副本指定此自定义参数组。有关更多信息，请参阅 [Db2 的自带许可（BYOL）的 IBM ID](db2-licensing.md#db2-prereqs-ibm-info)。

  对于 MySQL 和 Oracle 数据库引擎，您可以在 AWS CLI 命令 [create-db-instance-read-replica](https://docs.aws.amazon.com//cli/latest/reference/rds/create-db-instance-read-replica.html) 的 `--db-parameter-group-name` 选项中为只读副本指定自定义参数组。使用 AWS 管理控制台 时，无法指定自定义参数组。
+ 只读副本使用默认安全组。
+ 对于 Db2、MariaDB、Microsoft SQL Server、MySQL 和 Oracle 数据库实例，删除跨区域只读副本的源数据库实例时，将提升只读副本。
+ 对于 PostgreSQL 数据库实例，删除跨区域只读副本的源数据库实例时，只读副本的复制状态将设置为 `terminated`。不会提升只读副本。

  您必须手动提升只读副本或将其删除。

### 请求跨区域只读副本
<a name="ReadRepl.XRgn.Policy"></a>

要与源区域通信以请求创建跨区域只读副本，请求者（IAM 角色或 IAM 用户）必须能够访问源数据库实例和源区域。

请求者的 IAM 策略中的某些条件可能会导致请求失败。以下示例假定源数据库实例位于美国东部（俄亥俄州），只读副本在US East (N. Virginia)中创建。这些示例显示了请求者的 IAM 策略中导致请求失败的条件：
+ 请求者的策略对于 `aws:RequestedRegion` 具有条件限制。

  ```
  ...
  "Effect": "Allow",
  "Action": "rds:CreateDBInstanceReadReplica",
  "Resource": "*",
  "Condition": {
      "StringEquals": {
          "aws:RequestedRegion": "us-east-1"
      }
  }
  ```

  请求失败，因为该策略不允许访问源区域。要想请求成功，请指定源区域和目标区域。

  ```
  ...
  "Effect": "Allow",
  "Action": "rds:CreateDBInstanceReadReplica",
  "Resource": "*",
  "Condition": {
      "StringEquals": {
          "aws:RequestedRegion": [
              "us-east-1",
              "us-east-2"
          ]
      }
  }
  ```
+ 请求者的策略不允许访问源数据库实例。

  ```
  ...
  "Effect": "Allow",
  "Action": "rds:CreateDBInstanceReadReplica",
  "Resource": "arn:aws:rds:us-east-1:123456789012:db:myreadreplica"
  ...
  ```

  要想请求成功，请指定源实例和副本。

  ```
  ...
  "Effect": "Allow",
  "Action": "rds:CreateDBInstanceReadReplica",
  "Resource": [
      "arn:aws:rds:us-east-1:123456789012:db:myreadreplica",
      "arn:aws:rds:us-east-2:123456789012:db:mydbinstance"
  ]
  ...
  ```
+ 请求者的政策拒绝 `aws:ViaAWSService`。

  ```
  ...
  "Effect": "Allow",
  "Action": "rds:CreateDBInstanceReadReplica",
  "Resource": "*",
  "Condition": {
      "Bool": {"aws:ViaAWSService": "false"}
  }
  ```

  与源区域的通信由 RDS 代表请求者进行。要想请求成功，请不要拒绝 AWS 服务发出的调用。
+ 请求者的策略对于 `aws:SourceVpc` 或 `aws:SourceVpce` 具有条件限制。

  这些请求可能会失败，因为 RDS 对远程区域进行调用时，它并非来自指定的 VPC 或 VPC 端点。

如果您需要使用可能导致请求失败的上述某个条件，则可以在策略中包含第二个带有 `aws:CalledVia` 的语句，以便请求成功。例如，您可以使用带有 `aws:CalledVia` 的 `aws:SourceVpce`，如下所示：

```
...
"Effect": "Allow",
"Action": "rds:CreateDBInstanceReadReplica",
"Resource": "*",
"Condition": {
    "Condition" : { 
        "ForAnyValue:StringEquals" : {
          "aws:SourceVpce": "vpce-1a2b3c4d"
        }
     }
},
{
    "Effect": "Allow",
    "Action": [
        "rds:CreateDBInstanceReadReplica"
    ],
    "Resource": "*",
    "Condition": {
        "ForAnyValue:StringEquals": {
            "aws:CalledVia": [
                "rds.amazonaws.com"
            ]
        }
    }
}
```

有关更多信息，请参阅 *IAM 用户指南* 中的 [IAM 中的策略和权限](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies.html) 。

### 授权只读副本
<a name="ReadRepl.XRgn.Auth"></a>

跨区域数据库只读副本创建请求返回后`success`，RDS 开始在后台创建副本。创建了 RDS 访问源数据库实例的授权。此授权将源数据库实例链接到只读副本，并允许 RDS 仅复制到指定的只读副本。

 RDS 使用服务链接的 IAM 角色中的 `rds:CrossRegionCommunication` 权限对授权进行验证。如果副本获得授权，RDS 将与源区域通信并完成副本创建。

 RDS 无权访问之前未经 `CreateDBInstanceReadReplica` 请求授权的数据库实例。只读副本创建完成后，将撤销授权。

 RDS 使用服务链接的角色来验证源区域中的授权。如果在复制创建过程中删除了服务链接的角色，则创建将失败。

有关更多信息，请参阅 *IAM 用户指南* 中的[使用服务相关角色](https://docs.aws.amazon.com/IAM/latest/UserGuide/using-service-linked-roles.html)。

### 使用 AWS Security Token Service 凭证
<a name="ReadRepl.XRgn.assumeRole"></a>

来自全局 AWS Security Token Service (AWS STS) 端点的会话令牌仅在默认启用的 AWS 区域（商业区域）中有效。在 `assumeRole` 中使用来自 AWS STS API 操作的凭证时， 如果源区域是选择加入区域，请使用区域端点。否则，请求将失败。发生这种情况的原因是，您的凭证必须在两个区域都有效，而在使用区域 AWS STS 端点时，仅选择加入区域有效。

要使用全局端点，请确保在操作中为两个区域都启用了该端点。在 AWS STS 账户设置中将全局端点设置为 `Valid in all AWS 区域`。

 同样的规则也适用于预签名 URL 参数中的凭证。

有关更多信息，请参阅《IAM 用户指南》**中的[在 AWS 区域中管理 AWS STS](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_credentials_temp_enable-regions.html)。

## 跨区域复制成本
<a name="USER_ReadRepl.XRgn.Costs"></a>

跨区域复制时传输的数据可产生 Amazon RDS 数据传输费用。这些跨区域复制操作会对传输到源 AWS 区域以外的数据收取费用：
+ 创建只读副本时，Amazon RDS 将创建源实例的快照，并将快照传输到只读副本 AWS 区域。
+ 对于源数据库中做出的每个数据修改，Amazon RDS 都会将数据从源 AWS 区域传输到只读副本 AWS 区域。

有关数据传输定价的更多信息，请参阅 [Amazon RDS 定价](https://aws.amazon.com/rds/pricing/)。

对于 MySQL 和 MariaDB 实例，可以通过减少创建的跨区域只读副本的数量来降低数据传输费用。例如，假设您在一个 AWS 区域中有一个源数据库实例并希望在另一个 AWS 区域中有三个只读副本。在这种情况下，您只能从源数据库实例创建一个只读副本。您可以从第一个只读副本而不是源数据库实例创建另外两个副本。

例如，如果您在一个 `source-instance-1`有 AWS 区域，则可以执行以下操作：
+ 在新的 `read-replica-1`创建 AWS 区域，指定 `source-instance-1` 作为源。
+ 从 `read-replica-2` 创建 `read-replica-1`。
+ 从 `read-replica-3` 创建 `read-replica-1`。

在此例中，只需支付从 `source-instance-1` 到 `read-replica-1` 的数据传输费用。您无需支付从 `read-replica-1` 到另外两个副本的数据传输费用，因为它们位于同一 AWS 区域。如果从其它 AWS 区域中的 `source-instance-1` 直接创建所有三个副本，则您需要为传输到所有三个副本的数据付费。