

# 使用 Aurora 只读副本将数据从 RDS for PostgreSQL 数据库实例迁移到 Aurora PostgreSQL 数据库集群
<a name="AuroraPostgreSQL.Migrating.RDSPostgreSQL.Replica"></a>

通过使用 Aurora 只读副本进行迁移过程，您可以使用 RDS for PostgreSQL 数据库实例作为新 Aurora PostgreSQL 数据库集群的基础。Aurora 只读副本选项仅适用于在同一 Amazon Web Services 区域和账户内迁移，并且仅当该区域为 RDS for PostgreSQL 数据库实例提供兼容版本的 Aurora PostgreSQL 时才可用。*兼容*意味着 Aurora PostgreSQL 版本与 RDS for PostgreSQL 版本相同，或者它是同一主要版本系列中更高的次要版本。

例如，要使用此方法迁移 RDS for PostgreSQL 11.14 数据库实例，该区域必须提供 PostgreSQL 版本 11 系列中的 Aurora PostgreSQL 11.14 版或更高的次要版本。

**Topics**
+ [使用 Aurora 只读副本迁移数据概览](#AuroraPostgreSQL.Migrating.RDSPostgreSQL.Replica.Intro)
+ [准备使用 Aurora 只读副本迁移数据](#AuroraPostgreSQL.Migrating.RDSPostgreSQL.Replica.Prepare)
+ [创建 Aurora 只读副本](#AuroraPostgreSQL.Migrating.RDSPostgreSQL.Replica.Create)
+ [提升 Aurora 只读副本](#AuroraPostgreSQL.Migrating.RDSPostgreSQL.Replica.Promote)

## 使用 Aurora 只读副本迁移数据概览
<a name="AuroraPostgreSQL.Migrating.RDSPostgreSQL.Replica.Intro"></a>

从 RDS for PostgreSQL 数据库实例迁移到 Aurora PostgreSQL 数据库集群是一个多步骤过程。首先，您可创建源 RDS for PostgreSQL 数据库实例的 Aurora 只读副本。这将启动从 RDS for PostgreSQL 数据库实例到特殊用途数据库集群（称为**副本*集群*）的复制过程。副本集群仅由 Aurora 只读副本（读取器实例）组成。

**注意**  
每 TB 数据可能需要几小时才能完成迁移。

**提升 Aurora PostgreSQL 副本**

创建了 Aurora PostgreSQL 数据库集群后，请按照以下步骤提升 Aurora 副本：

1. 停止源 RDS for PostgreSQL 数据库实例上的所有数据库写入工作负载。

1. 从源 RDS for PostgreSQL 数据库实例获取当前 `WAL LSN`：

   ```
   SELECT pg_current_wal_lsn();
   pg_current_wal_lsn
   --------------------
   0/F0000318
   (1 row)
   ```

1. 在 Aurora PostgreSQL 副本集群上，检查重播的 LSN 是否大于步骤 2 中的 LSN：

   ```
   SELECT pg_last_wal_replay_lsn();
   pg_last_wal_replay_lsn
   ------------------------
   0/F0000400
   (1 row)
   ```

   或者，对源 RDS for PostgreSQL 数据库实例使用以下查询：

   ```
   SELECT restart_lsn FROM pg_replication_slots;
   ```

1. 提升 Aurora PostgreSQL 副本集群。

   当复制停止时，副本集群即被提升为独立 Aurora PostgreSQL 数据库集群，而读取器被提升为集群的写入器实例。此时，您可以将实例添加到 Aurora PostgreSQL 数据库集群，以根据自己的用例调整规模。如果您不再需要原始的 RDS for PostgreSQL 数据库实例，可以删除它。

如果 RDS for PostgreSQL 数据库实例已有 Aurora 只读副本或已有跨区域只读副本，则无法创建 Aurora 只读副本。

## 准备使用 Aurora 只读副本迁移数据
<a name="AuroraPostgreSQL.Migrating.RDSPostgreSQL.Replica.Prepare"></a>

**注意**  
在准备将数据迁移到 Aurora PostgreSQL 时，正确识别和处理未记录的表非常重要。有关更多信息，请参阅 [在迁移期间处理未记录的表](aurora-postgresql-unlogged-tables.md#aurora-postgresql-unlogged-tables-migration)。

在使用 Aurora 只读副本的迁移过程中，对源 RDS for PostgreSQL 数据库实例进行的更新将异步复制到副本集群的 Aurora 只读副本。该过程使用 PostgreSQL 的本机流式复制功能，该功能将预写日志 (WAL) 段存储在源实例上。在开始此迁移过程之前，请检查表中列出的指标的值，确保您的实例具有足够的存储容量。


| 指标 | 描述 | 
| --- | --- | 
|  `FreeStorageSpace`  |  可用存储空间。 单位：字节  | 
|  `OldestReplicationSlotLag`  |  最滞后的副本中的 WAL 数据的滞后大小。 单位：MB  | 
|  `RDSToAuroraPostgreSQLReplicaLag`  |  Aurora PostgreSQL 数据库集群滞后于源 RDS 数据库实例的时间长度（以秒为单位）。  | 
|  `TransactionLogsDiskUsage`  |  事务日志使用的磁盘空间。 单位：MB  | 

有关监控 RDS 实例的更多信息，请参阅 *Amazon RDS 用户指南* 中的[监控](https://docs.amazonaws.cn/AmazonRDS/latest/UserGuide/CHAP_Monitoring.html)。

## 创建 Aurora 只读副本
<a name="AuroraPostgreSQL.Migrating.RDSPostgreSQL.Replica.Create"></a>

您可以使用 Amazon Web Services 管理控制台 或 Amazon CLI 为 RDS for PostgreSQL 数据库实例创建 Aurora 只读副本。仅当 Amazon Web Services 区域提供兼容的 Aurora PostgreSQL 版本时，使用 Amazon Web Services 管理控制台 创建 Aurora 只读副本的选项才可用。也就是说，仅当 Aurora PostgreSQL 版本与 RDS for PostgreSQL 版本相同或者是同一主要版本系列中更高的次要版本时可用。

### 控制台
<a name="AuroraPostgreSQL.Migrating.RDSPostgreSQL.Replica.Create.Console"></a>

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

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

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

1. 选择要作为 Aurora 只读副本源的 RDS for PostgreSQL 数据库实例。对于**操作**，请选择**创建 Aurora 只读副本**。如果未显示此选项，则意味着该区域中没有兼容的 Aurora PostgreSQL 版本。  
![\[创建 Aurora 只读副本\]](http://docs.amazonaws.cn/AmazonRDS/latest/AuroraUserGuide/images/Aurorapgres-migrate.png)

1. 在创建 Aurora 只读副本设置页面上，您可以配置 Aurora PostgreSQL 数据库集群的属性，如下表中所示。副本数据库集群是使用与源相同的“主”用户名和密码从源数据库实例的快照创建的，因此您目前无法更改这些属性。    
[\[See the AWS documentation website for more details\]](http://docs.amazonaws.cn/AmazonRDS/latest/AuroraUserGuide/AuroraPostgreSQL.Migrating.RDSPostgreSQL.Replica.html)

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

### Amazon CLI
<a name="AuroraPostgreSQL.Migrating.RDSPostgreSQL.Replica.Create.CLI"></a>

要使用 Amazon CLI 从源 RDS for PostgreSQL 数据库实例创建 Aurora 只读副本，请首先使用 [https://docs.amazonaws.cn/cli/latest/reference/rds/create-db-cluster.html](https://docs.amazonaws.cn/cli/latest/reference/rds/create-db-cluster.html) CLI 命令创建一个空 Aurora 数据库集群。一旦存在数据库集群，您就可以使用 [https://docs.amazonaws.cn/cli/latest/reference/rds/create-db-instance.html](https://docs.amazonaws.cn/cli/latest/reference/rds/create-db-instance.html) 命令为数据库集群创建主实例。主实例是在 Aurora 数据库集群中创建的第一个实例。在这种情况下，它最初作为 RDS for PostgreSQL 数据库实例的 Aurora 只读副本而创建。当该过程结束时，您的 RDS for PostgreSQL 数据库实例已有效迁移到 Aurora PostgreSQL 数据库集群。

您不需要指定主用户账户（通常为 `postgres`）、其密码或数据库名称。Aurora 只读副本会自动从您在调用 Amazon CLI 命令时标识的源 RDS for PostgreSQL 数据库实例获取这些信息。

您需要指定要用于 Aurora PostgreSQL 数据库集群和数据库实例的引擎版本。您指定的版本应与源 RDS for PostgreSQL 数据库实例匹配。如果源 RDS for PostgreSQL 数据库实例已加密，您还需要为 Aurora PostgreSQL 数据库集群主实例指定加密。不支持将已加密的实例迁移到未加密的 Aurora 数据库集群。

以下示例创建一个名为 `my-new-aurora-cluster` 的 Aurora PostgreSQL 数据库集群，该集群将使用未加密的 RDS 数据库源实例。首先，您通过调用 [https://docs.amazonaws.cn/cli/latest/reference/rds/create-db-cluster.html](https://docs.amazonaws.cn/cli/latest/reference/rds/create-db-cluster.html) CLI 命令创建 Aurora PostgreSQL 数据库集群。该示例演示了如何使用可选 `--storage-encrypted ` 参数指定应加密数据库集群。由于源数据库没有加密，因此 `--kms-key-id` 用于指定要使用的密钥。有关必需参数和可选参数的更多信息，请参阅示例后面的列表。

对于 Linux、macOS 或 Unix：

```
aws rds create-db-cluster  \
    --db-cluster-identifier my-new-aurora-cluster \
    --db-subnet-group-name my-db-subnet
    --vpc-security-group-ids sg-11111111 
    --engine aurora-postgresql \
    --engine-version same-as-your-rds-instance-version \
    --replication-source-identifier arn:aws:rds:aws-region:111122223333:db/rpg-source-db \
    --storage-encrypted \
    --kms-key-id arn:aws:kms:aws-region:111122223333:key/11111111-2222-3333-444444444444
```

对于：Windows

```
aws rds create-db-cluster  ^
    --db-cluster-identifier my-new-aurora-cluster ^
    --db-subnet-group-name my-db-subnet ^
    --vpc-security-group-ids sg-11111111 ^
    --engine aurora-postgresql ^
    --engine-version same-as-your-rds-instance-version ^
    --replication-source-identifier arn:aws:rds:aws-region:111122223333:db/rpg-source-db ^
    --storage-encrypted ^
    --kms-key-id arn:aws:kms:aws-region:111122223333:key/11111111-2222-3333-444444444444
```

在下面的列表中，您可以找到有关示例中所示某些选项的更多信息。除非另有说明，否则这些参数是必需的。
+ `--db-cluster-identifier` – 您需要为新的 Aurora PostgreSQL 数据库集群命名。
+ `--db-subnet-group-name` – 在与源数据库实例相同的数据库子网中创建 Aurora PostgreSQL 数据库集群。
+ `--vpc-security-group-ids` – 指定 Aurora PostgreSQL 数据库集群的安全组。
+ `--engine-version` – 指定要用于 Aurora PostgreSQL 数据库集群的版本。此次要版本应与源 RDS for PostgreSQL 数据库实例使用的版本相同，或比后者更高。
+ `--replication-source-identifier` – 使用 RDS for PostgreSQL 数据库实例的 Amazon Resource Name (ARN) 识别该实例。有关 Amazon RDS ARN 的更多信息，请参阅数据库集群的《Amazon Web Services 一般参考》**中的 [Amazon Relational Database Service（Amazon RDS）](https://docs.amazonaws.cn/general/latest/gr/aws-arns-and-namespaces.html#arn-syntax-rds)。
+ `--storage-encrypted`：可选。仅在需要指定加密时使用，如下所示：
  + 当源数据库实例具有加密存储时，请使用此参数。如果您不对具有加密存储的源数据库实例使用此参数，则对 [https://docs.amazonaws.cn/cli/latest/reference/rds/create-db-cluster.html](https://docs.amazonaws.cn/cli/latest/reference/rds/create-db-cluster.html) 的调用会失败。如果您想为 Aurora PostgreSQL 数据库集群使用的密钥与源数据库实例使用的密钥不同，则还需要指定 `--kms-key-id`。
  + 如果源数据库实例的存储未加密，但您希望 Aurora PostgreSQL 数据库集群使用加密，则使用此参数。如果是这样，您还需要识别与 `--kms-key-id` 参数一起使用的加密密钥。
+ `--kms-key-id`：可选。使用时，您可以通过使用密钥的 ARN、ID、别名 ARN 或其别名来指定用于存储加密 (`--storage-encrypted`) 的密钥。仅在以下情况下需要此参数：
  + 为 Aurora PostgreSQL 数据库集群选择一个密钥，该密钥不同于源数据库实例使用的密钥。
  + 从未加密的源创建加密集群。在这种情况下，您需要指定 Aurora PostgreSQL 应该用于加密的密钥。

创建 Aurora PostgreSQL 数据库集群后，您可以使用 [https://docs.amazonaws.cn/cli/latest/reference/rds/create-db-instance.html](https://docs.amazonaws.cn/cli/latest/reference/rds/create-db-instance.html) CLI 命令创建主实例，如以下所示：

对于 Linux、macOS 或 Unix：

```
aws rds create-db-instance \
    --db-cluster-identifier my-new-aurora-cluster \
    --db-instance-class db.x2g.16xlarge \
    --db-instance-identifier rpg-for-migration \
    --engine aurora-postgresql
```

对于：Windows

```
aws rds create-db-instance ^
    --db-cluster-identifier my-new-aurora-cluster ^
    --db-instance-class db.x2g.16xlarge ^
    --db-instance-identifier rpg-for-migration ^
    --engine aurora-postgresql
```

在下面的列表中，您可以找到有关示例中所示某些选项的更多信息。
+ `--db-cluster-identifier` – 指定在前述步骤中使用 [https://docs.amazonaws.cn/cli/latest/reference/rds/create-db-instance.html](https://docs.amazonaws.cn/cli/latest/reference/rds/create-db-instance.html) 命令创建的 Aurora PostgreSQL 数据库集群的名称。
+ `--db-instance-class` – 要用于主实例的数据库实例类的名称，例如 `db.r4.xlarge`、`db.t4g.medium`、`db.x2g.16xlarge` 等。有关可用的数据库实例类列表，请参阅[数据库实例类类型](Concepts.DBInstanceClass.Types.md)。
+ `--db-instance-identifier` – 指定主实例的名称。
+ `--engine aurora-postgresql` – 指定引擎的 `aurora-postgresql`。

### RDS API
<a name="Aurora.Migration.RDSPostgreSQL.Create.API"></a>

要从源 RDS for PostgreSQL 数据库实例创建 Aurora 只读副本，请首先使用 RDS API 操作 [https://docs.amazonaws.cn/AmazonRDS/latest/APIReference/API_CreateDBCluster.html](https://docs.amazonaws.cn/AmazonRDS/latest/APIReference/API_CreateDBCluster.html) 为从源 RDS for PostgreSQL 数据库实例创建的 Aurora 只读副本创建新的 Aurora 数据库集群。当 Aurora PostgreSQL 数据库集群可用时，您可以使用 [https://docs.amazonaws.cn/AmazonRDS/latest/APIReference/API_CreateDBInstance.html](https://docs.amazonaws.cn/AmazonRDS/latest/APIReference/API_CreateDBInstance.html) 创建 Aurora 数据库集群的主实例。

您不需要指定主用户账户（通常为 `postgres`）、其密码或数据库名称。Aurora 只读副本会自动从使用 `ReplicationSourceIdentifier` 指定的源 RDS for PostgreSQL 数据库实例中获取这些信息。

您需要指定要用于 Aurora PostgreSQL 数据库集群和数据库实例的引擎版本。您指定的版本应与源 RDS for PostgreSQL 数据库实例匹配。如果源 RDS for PostgreSQL 数据库实例已加密，您还需要为 Aurora PostgreSQL 数据库集群主实例指定加密。不支持将已加密的实例迁移到未加密的 Aurora 数据库集群。

要为 Aurora 只读副本创建 Aurora 数据库集群，请使用带以下参数的 RDS API 操作 [https://docs.amazonaws.cn/AmazonRDS/latest/APIReference/API_CreateDBCluster.html](https://docs.amazonaws.cn/AmazonRDS/latest/APIReference/API_CreateDBCluster.html)：
+ `DBClusterIdentifier` – 要创建的数据库集群的名称。
+ `DBSubnetGroupName` – 要与该数据库集群关联的数据库子网组的名称。
+ `Engine=aurora-postgresql` – 要使用的引擎的名称。
+ `ReplicationSourceIdentifier` – 源 PostgreSQL 数据库实例的 Amazon Resource Name (ARN)。有关 Amazon RDS ARN 的更多信息，请参阅《Amazon Web Services 一般参考》**中的 [Amazon Relational Database Service（Amazon RDS）](https://docs.amazonaws.cn/general/latest/gr/aws-arns-and-namespaces.html#arn-syntax-rds)。如果 `ReplicationSourceIdentifier` 标识加密的源，Amazon RDS 将使用默认 KMS 密钥，除非您使用 `KmsKeyId` 选项指定一个不同的密钥。
+ `VpcSecurityGroupIds` – 要与此数据库集群关联的 Amazon EC2 VPC 安全组的列表。
+ `StorageEncrypted` – 指示数据库集群已加密。当您使用此参数而不同时指定 `ReplicationSourceIdentifier` 时，Amazon RDS 会使用您的默认 KMS 密钥。
+ `KmsKeyId` – 已加密集群的密钥。使用时，您可以通过使用密钥的 ARN、ID、别名 ARN 或其别名来指定用于存储加密的密钥。

有关更多信息，请参阅 *Amazon RDS API 参考*中的 [https://docs.amazonaws.cn/AmazonRDS/latest/APIReference/API_CreateDBCluster.html](https://docs.amazonaws.cn/AmazonRDS/latest/APIReference/API_CreateDBCluster.html)。

一旦 Aurora 数据库集群可用，您可以使用带以下参数的 RDS API 操作 [https://docs.amazonaws.cn/AmazonRDS/latest/APIReference/API_CreateDBInstance.html](https://docs.amazonaws.cn/AmazonRDS/latest/APIReference/API_CreateDBInstance.html) 为其创建主实例：
+ `DBClusterIdentifier` – 数据库集群的名称。
+ `DBInstanceClass` – 要用于主实例的数据库实例类的名称。
+ `DBInstanceIdentifier` – 主实例的名称。
+ `Engine=aurora-postgresql` – 要使用的引擎的名称。

有关更多信息，请参阅 *Amazon RDS API 参考*中的 [https://docs.amazonaws.cn/AmazonRDS/latest/APIReference/API_CreateDBInstance.html](https://docs.amazonaws.cn/AmazonRDS/latest/APIReference/API_CreateDBInstance.html)。

## 提升 Aurora 只读副本
<a name="AuroraPostgreSQL.Migrating.RDSPostgreSQL.Replica.Promote"></a>

在提升副本集群之前，迁移到 Aurora PostgreSQL 未完成，因此暂时不要删除 RDS for PostgreSQL 源数据库实例。

在提升副本集群之前，请确保 RDS for PostgreSQL 数据库实例没有向数据库写入任何进程中的事务或其他活动。当 Aurora 只读副本上的副本滞后达到零 (0) 时，您可以提升副本集群。有关监控副本滞后的更多信息，请参阅 [监控 Aurora PostgreSQL 复制](AuroraPostgreSQL.Replication.md#AuroraPostgreSQL.Replication.Monitoring) 和 [Amazon Aurora 的实例级指标](Aurora.AuroraMonitoring.Metrics.md#Aurora.AuroraMySQL.Monitoring.Metrics.instances)。

### 控制台
<a name="AuroraPostgreSQL.Migrating.RDSPostgreSQL.Replica.Promote.Console"></a>

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

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

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

1. 选择副本集群。  
![\[将副本集群提升为完整的 Aurora PostgreSQL 数据库集群状态\]](http://docs.amazonaws.cn/AmazonRDS/latest/AuroraUserGuide/images/Aurorapgres-migrate-2.png)

1. 对于**操作**，请选择**提升**。这可能需要几分钟时间，并可能导致停机。

该过程完成后，Aurora 副本集群成为区域性 Aurora PostgreSQL 数据库集群，其写入器实例包含来自 RDS for PostgreSQL 数据库实例的数据。

### Amazon CLI
<a name="AuroraPostgreSQL.Migrating.RDSPostgreSQL.Replica.Promote.CLI"></a>

要将 Aurora 只读副本提升为独立数据库集群，请使用 [https://docs.amazonaws.cn/cli/latest/reference/rds/promote-read-replica-db-cluster.html](https://docs.amazonaws.cn/cli/latest/reference/rds/promote-read-replica-db-cluster.html) Amazon CLI 命令。

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

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

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

### RDS API
<a name="AuroraPostgreSQL.Migrating.RDSPostgreSQL.Replica.Promote.API"></a>

要将 Aurora 只读副本提升为独立数据库集群，请使用 RDS API 操作 [PromoteReadReplicaDBCluster](https://docs.amazonaws.cn/AmazonRDS/latest/APIReference/API_PromoteReadReplicaDBCluster.html)。

提升副本集群后，您可以通过检查事件日志来确认提升已完成，如下所示。

**确认 Aurora 副本集群已提升**

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

1. 在导航窗格中，选择 **Events (事件)**。

1. 在 **Events**（事件）页面的 **Source**（源）列表中找到集群的名称。每个事件都有来源、类型、时间和消息。您可以查看在您账户的 Amazon Web Services 区域 中发生的所有事件。成功提升将生成以下消息。

   ```
   Promoted Read Replica cluster to a stand-alone database cluster.
   ```

提升完成后，源 RDS for PostgreSQL 数据库实例和 Aurora 数据库集群之间的链接会取消。您可以将客户端应用程序引导到 Aurora 只读副本的端点。有关 Aurora 终端节点的更多信息，请参阅[Amazon Aurora 端点连接](Aurora.Overview.Endpoints.md)。此时，您可以安全地删除数据库实例。