在数据库实例之间传输 PostgreSQL 数据库 - Amazon Relational Database Service
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅中国的 Amazon Web Services 服务入门

数据库实例之间传输 PostgreSQL 数据库

通过将 PostgreSQL 可传输数据库用于 Amazon RDS,您可以在两个数据库实例之间传输 PostgreSQL 数据库。这提供了一种非常快的方法,以便在不同的数据库实例之间迁移大型数据库。要使用该方法传输数据库,两个数据库实例必须运行相同的 PostgreSQL 主要版本。

要使用可传输数据库,请安装 pg_transport 扩展。该扩展提供了物理传输机制以移动每个数据库。通过以最少的处理流式传输数据库文件,物理传输移动数据的速度比传统的转储和加载过程快得多,并将停机时间降到最低。PostgreSQL 可传输数据库使用拉取模式,其中,目标数据库实例从源数据库实例导入数据库。

注意

PostgreSQL 可传输数据库运行 RDS for PostgreSQL 10.10 和更高版本以及 11.5 和更高版本。

使用 PostgreSQL 可传输数据库的限制

可传输数据库具有以下限制:

  • 只读副本 – 您无法在只读副本或只读副本的父实例上使用可传输数据库。

  • 不支持的列类型 – 您不能在打算使用该方法传输的任何数据库表中使用 reg 数据类型。这些类型取决于系统目录对象 ID (OID),这些 ID 在传输过程中经常发生变化。

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

  • 兼容性 – 源和目标数据库实例必须运行相同的 PostgreSQL 主要版本。

    在开始传输之前,transport.import_from_server 函数比较源和目标数据库实例以确保数据库兼容性。这包括验证 PostgreSQL 主要版本兼容性。此外,该函数还会验证目标数据库实例是否可能具有足够的空间以接收源数据库。该函数执行一些额外的检查,以确保顺利执行传输过程。

  • 扩展 – 在传输期间,可以在源数据库实例上安装的唯一扩展是 pg_transport

  • 角色和 ACL – 源数据库的访问权限和所有权信息不会传输到目标数据库。所有数据库对象是由传输的本地目标用户创建和拥有的。

  • 并发传输 – 您总共可以在数据库实例上同时运行 32 个传输,包括导入和导出。要定义用于每个传输的工作进程,请使用 pg_transport.work_mempg_transport.num_workers 参数。为了满足并发传输要求,您可能需要大幅增加 max_worker_processes 参数。有关更多信息,请参阅“ pg_transport 扩展的配置参数”。

设置以传输 PostgreSQL 数据库

要准备将 PostgreSQL 数据库从一个数据库实例传输到另一个数据库实例,请执行以下步骤。

设置以传输 PostgreSQL 数据库

  1. 确保源数据库实例的安全组允许来自目标数据库实例的入站流量。这是必需的,因为目标数据库实例通过对源数据库实例进行导入调用以启动数据库传输。有关如何使用安全组的信息,请参阅 使用安全组控制访问权限

  2. 对于源和目标数据库实例,请将 pg_transport 添加到每个参数组的 shared_preload_libraries 参数中。shared_preload_libraries 参数是静态的,并需要重新启动数据库以使更改生效。有关参数组的信息,请参阅 使用数据库参数组

  3. 对于源和目标数据库实例,请安装所需的 pg_transport PostgreSQL 扩展。

    为此,以具有 rds_superuser 角色的用户身份为每个数据库实例启动 psql,然后运行以下命令。

    psql=> CREATE EXTENSION pg_transport;

使用 transport.import_from_server 函数传输 PostgreSQL 数据库

在完成 设置以传输 PostgreSQL 数据库 中所述的过程后,您可以启动传输。为此,请在目标数据库实例上运行 transport.import_from_server 函数。

注意

传输的目标用户和连接的源用户必须是 rds_superuser 角色的成员。

目标数据库实例不能已包含名称与要传输的源数据库相同的数据库,否则,传输将会失败。

下面显示了一个示例传输。

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

该函数要求您提供数据库用户密码。因此,在传输完成后,我们建议您更改使用的用户角色的密码。或者,您可以使用 SQL 绑定变量创建临时用户角色。使用这些临时角色进行传输,然后丢弃这些角色。

有关 transport.import_from_server 函数及其参数的详细信息,请参阅 transport.import_from_server 函数参考

在数据库传输期间发生的情况

transport.import_from_server 函数在目标数据库实例上创建传输中的数据库。在传输期间,无法在目标数据库实例上访问传输中的数据库。

在传输开始时,源数据库上的所有当前会话将会结束。源数据库实例上的源数据库以外的任何数据库不受传输影响。

源数据库被置于特殊只读模式。在处于该模式时,您可以连接到源数据库并运行只读查询。不过,阻止启用了写入的查询和某些其他类型的命令。仅正在传输的特定源数据库受这些限制的影响。

在传输期间,您无法将目标数据库实例还原到某个时间点。这是因为传输不是事务性的,并且不使用 PostgreSQL 预写日志记录更改。如果目标数据库实例启用了自动备份,则会在传输完成后自动创建备份。时间点还原适用于备份完成后的时间。

如果传输失败,pg_transport 扩展将尝试撤消对源和目标数据库实例的所有更改。这包括删除目标的部分传输的数据库。根据失败类型,源数据库可能会继续拒绝启用了写入的查询。如果发生这种情况,请使用以下命令允许启用了写入的查询。

ALTER DATABASE my-database SET default_transaction_read_only = false;

transport.import_from_server 函数参考

transport.import_from_server 函数将 PostgreSQL 数据库从源数据库实例导入到目标数据库实例以传输该数据库。它使用物理数据库连接传输机制以执行该操作。

语法

transport.import_from_server( host text, port int, username text, password text, database text, local_password text, dry_run bool )

返回值

无。

参数

您可以在下表中找到 transport.import_from_server 函数参数说明。

参数 描述
host

源数据库实例的终端节点。

port 表示源数据库实例端口的整数。

PostgreSQL 数据库实例通常使用端口 5432。

username

源数据库实例的用户。该用户必须是 rds_superuser 角色的成员。

password

源数据库实例的用户密码。

database

源数据库实例中要传输的数据库的名称。

local_password

目标数据库实例的当前用户的本地密码。该用户必须是 rds_superuser 角色的成员。

dry_run

可选的布尔值,指定是否执行试运行。默认值为 false,这表示传输继续进行。

要确认源和目标数据库实例之间的兼容性而不执行实际传输,请将 dry_run 设置为 true

例如

有关示例,请参阅 使用 transport.import_from_server 函数传输 PostgreSQL 数据库

pg_transport 扩展的配置参数

可以使用以下参数配置 pg_transport 扩展行为。

SET pg_transport.num_workers = integer; SET pg_transport.work_mem = kilobytes; SET pg_transport.timing = Boolean;

您可以在下表中找到这些参数的说明。

参数 描述
pg_transport.num_workers

要用于物理传输的工作线程数。默认值为 3。有效值为 1-32。即使少于 8 个工作线程,大型传输通常也会达到最大吞吐量。

在传输期间,将在目标和源数据库实例上使用目标数据库实例中的 pg_transport.num_workers 设置。

一个相关的参数是 PostgreSQL max_worker_processes 参数。传输过程创建几个后台工作进程。因此,pg_transport.num_workers 参数设置可能要求您在源和目标数据库实例上将 max_worker_processes 参数设置为高得多的值。

我们建议您将源和目标数据库实例上的 max_worker_processes 设置为目标数据库实例的 pg_transport.num_workers 参数设置的至少三倍。再添加一些进程以提供非传输后台工作进程。

有关 max_worker_processes 参数的更多信息,请参阅有关异步行为的 PostgreSQL 文档。

pg_transport.timing

一个布尔值,指定是否在传输期间报告计时信息。默认为 true。有效值是 true(报告计时信息)和 false(禁止报告计时信息)。

我们建议您不要将该参数设置为 false。如果禁用 pg_transport.timing,则会大大降低您跟踪传输进度的能力。

pg_transport.work_mem

为每个工作线程分配的最大内存量。默认值为 131,072 千字节 (KB)。最小值为 64 兆字节 (65,536 KB)。有效值是以二进制单位表示的千字节 (KB),其中 1 KB = 1,024 字节。

传输使用的内存不能超过该参数中指定的值。即使每个工作线程的内存少于 256 MB (262,144 KB),大型传输通常也会达到最大吞吐量。