使用 pg_transport 在两个 Amazon RDS 数据库实例之间传输 PostgreSQL 数据库 - AWS Prescriptive Guidance

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

使用 pg_transport 在两个 Amazon RDS 数据库实例之间传输 PostgreSQL 数据库

创建者:Raunak Rishabh(AWS)和 Jitender Kumar(AWS)

环境:PoC 或试点

源:数据库:关系

目标:Amazon RDS for PostgreSQL

R 类型:重新定位

工作负载:开源

技术:迁移;数据库

Amazon Web Services:Amazon RDS

总结

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

先决条件和限制

先决条件

  • 两个数据库实例必须运行相同的 PostgreSQL 主要版本。

  • 数据库不得存在于目标上。否则,传输将失败。

  • 在源数据库中,除了 pg_transport 之外的任何扩展程序都不能启用。

  • 所有源数据库对象必须位于默认 pg_default 表空间中。

  • 源数据库实例的安全组应允许来自目标数据库实例的流量。

  • 安装 psql 这样的 PostgreSQL 客户端,PgAdmin或者使用 Amazon RDS PostgreSQL 数据库实例。您可以将客户端安装在本地系统中,也可以使用 Amazon Elastic Compute Cloud(Amazon EC2)实例。在这种模式中,我们在 EC2 实例上使用 psql。

限制

  • 您无法在 Amazon RDS for PostgreSQL 的不同主要版本之间传输数据库。

  • 源数据库的访问权限和所有权不会转移到目标数据库。

  • 您不能在只读副本或只读副本的父实例上传输数据库。

  • 您不能在打算使用该方法传输的任何数据库表中使用 reg 数据类型。

  • 您总共可以在数据库实例上同时运行 32 个传输(包括导入和导出)。

  • 您不能重命名或包含/排除表。所有内容都按原样迁移。

小心

  • 在移除扩展程序之前先进行备份,因为移除扩展程序还会移除依赖对象和一些对数据库运行至关重要的数据。

  • 在确定 pg_transport 的 Worker 数量和 work_mem值时,请考虑在源实例上的其他数据库上运行的实例类和进程。

  • 传输开始时,源数据库上的所有连接都将终止,数据库将进入只读模式。

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

产品版本

架构

在 Amazon RDS 数据库实例之间传输 PostgreSQL 数据库

工具

  • pg_transport 提供了物理传输机制以移动每个数据库。通过以最少的处理流式传输数据库文件,物理传输移动数据的速度比传统的转储和加载过程快得多,并且需要最少的停机时间。PostgreSQL 可传输数据库使用拉取模式,其中,目标数据库实例从源数据库实例导入数据库。在准备源环境和目标环境时,您可以在数据库实例上安装此扩展程序,如本模式中所述。

  • psql 使您能够连接和使用 PostgreSQL 数据库实例。要在系统上安装 psql,请参阅 PostgreSQL 下载量页面。

操作说明

任务描述所需技能

创建目标系统的参数组。

指定一个将其标识为目标参数组的组名;例如,pgtarget-param-group。有关说明,请参阅 Amazon RDS 文档

数据库管理员

修改参数组中的参数。

设置以下参数:

  1. pg_transport添加到 shared_preload_libraries参数。

    shared_preload_libraries = pg_stat_statements, pg_transport
  2. 设置 pg_transport.num_workers参数。选择要与之一起运行传输的 Worker 数量。您设置的值决定了将在源中创建的 transport.send_fileWorker 数量。

  3. max_worker_processes的值增加到 pg_transport.num_workers的值的三倍以上。例如,如果将 pg_transport.num_workers的值设置为 4,则该 max_worker_processes值应至少为 13。如果失败,pg_transport 建议使用最小值。 

  4. pg_transport.timing设置为 1。此设置允许在传输期间报告计时信息。

  5. 设置 pg_transport.work_mem参数。此参数指定分配给每个 Worker 的最大内存。默认值为 128 MB。

有关参数组的更多信息,请参阅 Amazon RDS 文档

数据库管理员
任务描述所需技能

创建源系统的参数组。

指定一个将其标识为源参数组的组名;例如,pgsource-param-group。有关说明,请参阅 Amazon RDS 文档

数据库管理员

修改参数组中的参数。

设置以下参数:

  1. pg_transport添加到 shared_preload_libraries参数。

    shared_preload_libraries = pg_stat_statements, pg_transport
  2. 设置 pg_transport.num_workers参数。目标中定义的此参数的值决定了要使用的 transport.send_fileWorker 数量。如果您正在此实例上运行导入,请增加此值,但要考虑已在运行的 Worker 数量。

  3. 在目标上将 max_worker_processes的值增加到 pg_transport.num_workers的值的三倍以上。例如,如果您在目标上将 pg_transport.num_workers的值设置为 4,则在源上的该 max_worker_processes值应至少为 13。如果失败,pg_transport 建议使用最小值。 

  4. 设置 pg_transport.work_mem参数。此参数指定分配给每个 Worker 的最大内存。默认值为 128 MB。

有关参数组的更多信息,请参阅 Amazon RDS 文档

数据库管理员
任务描述所需技能

创建一个新的 Amazon RDS for PostgreSQL 数据库实例,将源数据库传输到该数据库中。

根据业务需求确定实例类和 PostgreSQL 版本。

数据库管理员、系统管理员、数据库架构师

修改目标的安全组以允许从 EC2 实例通过数据库实例端口进行连接。

PostgreSQL 实例的默认端口为 5432。如果您使用其他端口,则必须为 EC2 实例打开与该端口的连接。

数据库管理员、系统管理员

修改实例,然后分配新的目标参数组。

例如,pgtarget-param-group

数据库管理员

重启 Amazon RDS 目标数据库实例。

参数 shared_preload_librariesmax_worker_processes是静态参数,需要重启实例。

数据库管理员、系统管理员

使用 psql 从 EC2 实例连接到数据库。

使用 命令: 

psql -h <rds_end_point> -p PORT -U username -d database -W
数据库管理员

创建 pg_transport 扩展程序。

以具有该 rds_superuser角色的用户身份运行以下查询:

create extension pg_transport;
数据库管理员
任务描述所需技能

修改源的安全组以允许从 Amazon EC2 实例和目标数据库实例的数据库实例端口进行连接

默认情况下,PostgreSQL 实例的端口为 5432。如果您使用其他端口,则必须为 EC2 实例打开与该端口的连接。

数据库管理员、系统管理员

修改实例,然后分配新的源参数组。

例如,pgsource-param-group

数据库管理员

重启 Amazon RDS 源数据库实例。

参数 shared_preload_librariesmax_worker_processes是静态参数,需要重启实例。

数据库管理员

使用 psql 从 EC2 实例连接到数据库。

使用 命令: 

psql -h <rds_end_point> -p PORT -U username -d database -W
数据库管理员

创建 pg_transport 扩展程序并从要传输的数据库中删除所有其他扩展程序。

如果源数据库上安装了 pg_transport 以外的任何扩展程序,则传输将失败。此命令必须由具有该 rds_superuser角色的用户运行。

数据库管理员
任务描述所需技能

执行试运行。

使用该 transport.import_from_server函数先执行试运行:

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');

此函数的最后一个参数(设置为 true)定义了试运行。

此函数显示您在运行主传输时会看到的任何错误。在运行主传输之前解决错误。

数据库管理员

如果试运行成功,则启动数据库传输。

运行该 transport.import_from_server函数以执行传输。它连接到源并导入数据。 

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);

此函数的最后一个参数(设置为 false)表示这不是试运行。

数据库管理员

执行传输后步骤。

数据库传输完成后:

  • 在目标环境中验证数据。

  • 向目标添加所有角色和权限。

  • 如果需要,在目标和源中启用所有必需的扩展程序。

  • 恢复 max_worker_processes参数的值。

数据库管理员

相关的资源