

本文属于机器翻译版本。若本译文内容与英语原文存在差异，则一律以英文原文为准。

# 使用 pg\$1transport 在两个 Amazon RDS 数据库实例之间传输 PostgreSQL 数据库
<a name="transport-postgresql-databases-between-two-amazon-rds-db-instances-using-pg-transport"></a>

*Raunak Rishabh 和 Jitender Kumar，Amazon Web Services*

## Summary
<a name="transport-postgresql-databases-between-two-amazon-rds-db-instances-using-pg-transport-summary"></a>

此模式描述了使用 **pg\$1transport** 扩展程序在适用于 PostgreSQL 数据库实例的两个 Amazon Relational Database Service（Amazon RDS）之间迁移超大型数据库的步骤。此扩展程序提供了用于移动每个数据库的物理传输机制。通过以最少的处理流式传输数据库文件，它为在数据库实例之间迁移大型数据库提供了一种极快的方法，将停机时间降到最低。此扩展程序使用拉取模式，其中，目标数据库实例从源数据库实例导入数据库。

## 先决条件和限制
<a name="transport-postgresql-databases-between-two-amazon-rds-db-instances-using-pg-transport-prereqs"></a>

**先决条件**
+ 两个数据库实例必须运行相同的 PostgreSQL 主要版本。
+ 数据库不得存在于目标上。否则，传输将失败。
+ 在源数据库中，除了 **pg\$1transport** 之外的任何扩展程序都不能启用。
+ 所有源数据库对象必须位于默认 **pg\$1default** 表空间中。
+ 源数据库实例的安全组应允许来自目标数据库实例的流量。
+ 安装[像](https://www.postgresql.org/docs/11/app-psql.html) psql 这样的 PostgreSQL 客户端，[PgAdmin](https://www.pgadmin.org/)或者使用 Amazon RDS PostgreSQL 数据库实例。您可以在本地系统中安装客户端，也可以使用亚马逊弹性计算云 (Amazon EC2) 实例。在这种模式中，我们在 EC2 实例上使用 psql。

**限制**
+ 您无法在 Amazon RDS for PostgreSQL 的不同主要版本之间传输数据库。
+ 源数据库的访问权限和所有权不会转移到目标数据库。
+ 您不能在只读副本或只读副本的父实例上传输数据库。
+ 您不能在打算使用该方法传输的任何数据库表中使用 **reg** 数据类型。
+ 您总共可以在数据库实例上同时运行 32 个传输（包括导入和导出）。
+ 您无法重命名或 include/exclude 表。所有内容都按原样迁移。

**小心**
+ 在移除扩展程序之前先进行备份，因为移除扩展程序还会移除依赖对象和一些对数据库运行至关重要的数据。
+ 在确定 **pg\$1transport** 的 Worker 数量和 `work_mem` 值时，请考虑在源实例上的其他数据库上运行的实例类和进程。
+ 传输开始时，源数据库上的所有连接都将终止，数据库将进入只读模式。

**注意**  
在一个数据库上运行传输时，它不会影响同一个服务器上的其他数据库。****

**产品版本**
+ Amazon RDS for PostgreSQL 10.10 和更高版本，Amazon RDS for PostgreSQL 11.5 和更高版本。有关最新版本的信息，请参阅 Amazon RDS 文档中的[在数据库实例之间传输 PostgreSQL 数据库](https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/PostgreSQL.TransportableDB.html)。

## 架构
<a name="transport-postgresql-databases-between-two-amazon-rds-db-instances-using-pg-transport-architecture"></a>

![\[在 Amazon RDS 数据库实例之间传输 PostgreSQL 数据库\]](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/patterns/images/pattern-img/d5fb7ea3-32b7-4602-b382-3cf5c075c7c9/images/aec4d8d2-37a8-4136-9042-f9667ac4aebb.png)


## 工具
<a name="transport-postgresql-databases-between-two-amazon-rds-db-instances-using-pg-transport-tools"></a>
+ **pg\$1transport** 提供了物理传输机制以移动每个数据库。通过以最少的处理流式传输数据库文件，物理传输移动数据的速度比传统的转储和加载过程快得多，并且需要最少的停机时间。PostgreSQL 可传输数据库使用拉取模式，其中，目标数据库实例从源数据库实例导入数据库。在准备源环境和目标环境时，您可以在数据库实例上安装此扩展程序，如本模式中所述。
+ [psql](https://www.postgresql.org/docs/11/app-psql.html) 使您能够连接和使用 PostgreSQL 数据库实例。要在系统上安装 **psql**，请参阅 [PostgreSQL 下载量](https://www.postgresql.org/download/)页面。

## 操作说明
<a name="transport-postgresql-databases-between-two-amazon-rds-db-instances-using-pg-transport-epics"></a>

### 创建目标参数组
<a name="create-the-target-parameter-group"></a>


| Task | 说明 | 所需技能 | 
| --- | --- | --- | 
| 创建目标系统的参数组。 | 指定一个将其标识为目标参数组的组名；例如，`pgtarget-param-group`。有关说明，请参阅 [Amazon RDS 文档](https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/USER_WorkingWithDBInstanceParamGroups.html#USER_WorkingWithParamGroups.Creating)。 | 数据库管理员 | 
| 修改参数组中的参数。 | 设置以下参数：[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/patterns/transport-postgresql-databases-between-two-amazon-rds-db-instances-using-pg-transport.html)有关参数组的更多信息，请参阅 [Amazon RDS 文档](https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/PostgreSQL.TransportableDB.html)。 | 数据库管理员 | 

### 创建源参数组
<a name="create-the-source-parameter-group"></a>


| Task | 说明 | 所需技能 | 
| --- | --- | --- | 
| 创建源系统的参数组。 | 指定一个将其标识为源参数组的组名；例如，`pgsource-param-group`。有关说明，请参阅 [Amazon RDS 文档](https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/USER_WorkingWithDBInstanceParamGroups.html#USER_WorkingWithParamGroups.Creating)。 | 数据库管理员 | 
| 修改参数组中的参数。 | 设置以下参数：[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/patterns/transport-postgresql-databases-between-two-amazon-rds-db-instances-using-pg-transport.html)有关参数组的更多信息，请参阅 [Amazon RDS 文档](https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/PostgreSQL.TransportableDB.html)。 | 数据库管理员 | 

### 准备目标环境
<a name="prepare-the-target-environment"></a>


| Task | 说明 | 所需技能 | 
| --- | --- | --- | 
| 创建一个新的 Amazon RDS for PostgreSQL 数据库实例，将源数据库传输到该数据库中。 | 根据业务需求确定实例类和 PostgreSQL 版本。 | 数据库管理员、系统管理员、数据库架构师 | 
| 修改目标的安全组以允许从实例通过数据库实例端口进行 EC2 连接。 | PostgreSQL 实例的默认端口为 5432。如果您使用的是其他端口，则必须为该 EC2 实例打开与该端口的连接。 | 数据库管理员、系统管理员 | 
| 修改实例，然后分配新的目标参数组。 | 例如 `pgtarget-param-group`。 | 数据库管理员 | 
| 重启 Amazon RDS 目标数据库实例。 | 参数 `shared_preload_libraries` 和 `max_worker_processes` 是静态参数，需要重新启动实例。 | 数据库管理员、系统管理员 | 
| 使用 psql 从 EC2 实例连接到数据库。 | 使用 命令： <pre>psql -h <rds_end_point> -p PORT -U username -d database -W</pre> | 数据库管理员 | 
| 创建 pg\$1transport 扩展程序。 | 以具有该 `rds_superuser` 角色的用户身份运行以下查询：<pre>create extension pg_transport;</pre> | 数据库管理员 | 

### 准备源环境
<a name="prepare-the-source-environment"></a>


| Task | 说明 | 所需技能 | 
| --- | --- | --- | 
| 修改源的安全组以允许通过数据库实例端口从 Amazon EC2 实例和目标数据库实例进行连接 | 默认情况下，PostgreSQL 实例的端口为 5432。如果您使用的是其他端口，则必须为该 EC2 实例打开与该端口的连接。 | 数据库管理员、系统管理员 | 
| 修改实例，然后分配新的源参数组。 | 例如 `pgsource-param-group`。 | 数据库管理员 | 
| 重启 Amazon RDS 源数据库实例。 | 参数 `shared_preload_libraries` 和 `max_worker_processes` 是静态参数，需要重启实例。 | 数据库管理员 | 
| 使用 psql 从 EC2 实例连接到数据库。 | 使用 命令： <pre>psql -h <rds_end_point> -p PORT -U username -d database -W</pre> | 数据库管理员 | 
| 创建 pg\$1transport 扩展程序并从要传输的数据库中删除所有其他扩展程序。 | 如果源数据库上安装了 **pg\$1transport** 以外的任何扩展程序，则传输将失败。此命令必须由具有该 `rds_superuser` 角色的用户运行。 | 数据库管理员 | 

### 执行传输
<a name="perform-the-transport"></a>


| Task | 说明 | 所需技能 | 
| --- | --- | --- | 
| 执行试运行。 | 使用该 `transport.import_from_server` 函数先执行试运行：<pre>SELECT transport.import_from_server( 'source-db-instance-endpoint', source-db-instance-port, 'source-db-instance-user', 'source-user-password', 'source-database-name', 'destination-user-password', 'true');</pre>此函数的最后一个参数（设置为 `true`）定义了试运行。此函数显示您在运行主传输时会看到的任何错误。在运行主传输之前解决错误。 | 数据库管理员 | 
| 如果试运行成功，则启动数据库传输。 | 运行该 `transport.import_from_server` 函数以执行传输。它连接到源并导入数据。 <pre>SELECT transport.import_from_server( 'source-db-instance-endpoint', source-db-instance-port, 'source-db-instance-user', 'source-user-password', 'source-database-name', 'destination-user-password', false);</pre>此函数的最后一个参数（设置为 `false`）表示这不是试运行。 | 数据库管理员 | 
| 执行传输后步骤。 | 数据库传输完成后：[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/patterns/transport-postgresql-databases-between-two-amazon-rds-db-instances-using-pg-transport.html) | 数据库管理员 | 

## 相关的资源
<a name="transport-postgresql-databases-between-two-amazon-rds-db-instances-using-pg-transport-resources"></a>
+ [Amazon RDS 文档](https://docs.aws.amazon.com/rds/)
+ [pg\$1transport 文档](https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/PostgreSQL.Procedural.Importing.html#PostgreSQL.TransportableDB.Setup)
+ [使用 RDS PostgreSQL 可传输数据库迁移数据库](https://aws.amazon.com/blogs/database/migrating-databases-using-rds-postgresql-transportable-databases/)（博客文章）
+ [PostgreSQL 下载量](https://www.postgresql.org/download/linux/redhat/)
+ [psql 实用程序](https://www.postgresql.org/docs/11/app-psql.html)
+ [创建数据库参数组](https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/USER_WorkingWithParamGroups.html#USER_WorkingWithParamGroups.Creating)
+ [修改数据库参数组中的参数](https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/USER_WorkingWithParamGroups.html#USER_WorkingWithParamGroups.Modifying)
+ [PostgreSQL 下载量](https://www.postgresql.org/download/)