将 PostgreSQL 数据库作为 Amazon Database Migration Service 的目标 - Amazon Database Migration Service
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅中国的 Amazon Web Services 服务入门

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

将 PostgreSQL 数据库作为 Amazon Database Migration Service 的目标

您可以使用将数据迁移到 PostgreSQL 数据库Amazon DMS,可以从另一个 PostgreSQL 数据库或者从其他支持的数据库之一进行。Amazon DMS支持将 PostgreSQL 9.4 版及更高版本(对于版本 9.x)、10.x、11.x、12.x 和 13.x(仅供预览版)数据库作为目标。

  • 本地数据库

  • EC2 实例上的数据库

  • Amazon RDS 数据库实例上的数据库

  • 与 PostgreSQL 兼容的 Amazon Aurora 数据库实例上的数据库

PostgreSQL 目标版本 要使用的 Amazon DMS 版本

9.x、10.x、11.x

使用任何可用 Amazon DMS 版本。

12.x

使用任何可用 Amazon DMS 版本。

13.x(预览版)

使用Amazon DMS版本 3.4.3 及更高版本。

Amazon DMS支持 PostgreSQL 13.x 作为仅供预览使用的目标终端节点。使用 DMS 3.4.3 及更高版本来对数据迁移到 PostgreSQL 13.x 端点进行原型化和测试。我们不建议在生产环境中使用 PostgreSQL 13.x 作为目标终端节点。

注意
  • Amazon Aurora 无服务器可作为 Amazon Aurora 的目标与 PostgreSQL 版本 10.12 兼容性。有关 Amazon Aurora Serverless 的更多信息,请参阅使用 Amazon Aurora 无服务器中的Amazon Aurora 用户指南.

  • Aurora 无服务器数据库集群只能从 Amazon VPC 访问,不能使用公有 IP 地址. 因此,如果您打算在不同于 Aurora PostgreSQL 无服务器的区域中有一个复制实例,则必须配置VPC 对等. 否则,请检查 Aurora PostgreSQL 无服务器的可用性区域,并决定将其中一个区域用于 Aurora PostgreSQL 无服务器实例和复制实例。

在完全加载阶段将数据从源迁移到目标时,Amazon DMS 将使用逐表加载方法。无法在完全加载阶段保证表顺序。在完全加载阶段以及应用各个表的缓存事务时,表将不同步。因此,活动引用完整性约束可能会导致任务在完全加载阶段失败。

在 PostgreSQL 中,将使用触发器实施外键 (引用完整性约束)。在完全加载阶段,Amazon DMS 每次加载一个表。强烈建议您在完全加载期间使用以下方法之一禁用外键约束:

  • 从实例中临时禁用所有触发器并完成完全加载。

  • 在 PostgreSQL 中使用 session_replication_role 参数。

在任何给定时间,触发器可能处于以下状态之一:originreplicaalwaysdisabled。在将 session_replication_role 参数设置为 replica 时,只有处于 replica 状态的触发器是活动触发器,并且它们在被调用时触发。否则,触发器保持非活动状态。

PostgreSQL 具有故障保护机制以防止截断表,即使设置了 session_replication_role。您可以将该机制作为禁用触发器的替代方法,以帮助完成完全加载运行。为此,请将目标表准备模式设置为 DO_NOTHING。否则,在具有外键约束时,DROP 和 TRUNCATE 操作将失败。

在 Amazon RDS 中,您可以使用参数组控制该参数的设置。对于 Amazon EC2 上运行的 PostgreSQL 实例,您可以直接设置该参数。

有关将 PostgreSQL 数据库作为 Amazon DMS 目标的其他详细信息,请参阅以下章节:

将 PostgreSQL 作为 Amazon Database Migration Service 目标的限制

将 PostgreSQL 数据库作为 Amazon DMS 的目标时,存在以下限制:

  • JSON 数据类型转换为本机 CLOB 数据类型。

  • 在 Oracle 到 PostgreSQL 迁移中,如果 Oracle 中的一列包含 NULL 字符(十六进制值 U+0000),Amazon DMS 会将这些 NULL 字符转换为空格(十六进制值 U+0020)。这是出于 PostgreSQL 限制的原因。

  • Amazon DMS不支持复制到具有使用 coalesce 函数创建的唯一索引的表。

将 PostgreSQL 数据库作为 Amazon Database Migration Service 目标时的安全要求

出于安全目的,用于数据迁移的用户账户,必须是您作为目标的任意 PostgreSQL 数据库中的注册用户。

您的 PostgreSQL 目标终端节点需要最低用户权限才能运行Amazon DMS迁移,请参阅以下示例。

CREATE USER newuser WITH PASSWORD 'your-password'; ALTER SCHEMA schema_name OWNER TO newuser;

或者,

GRANT USAGE ON SCHEMA schema_name TO myuser; GRANT CONNECT ON DATABASE postgres to myuser; GRANT CREATE ON DATABASE postgres TO myuser; GRANT CREATE ON SCHEMA schema_name TO myuser; GRANT UPDATE, INSERT, SELECT, DELETE, TRUNCATE ON ALL TABLES IN SCHEMA schema_name TO myuser; GRANT TRUNCATE ON schema_name."BasicFeed" TO myuser;

将 PostgreSQL 作为 Amazon DMS 目标时的额外连接属性

您可以使用额外的连接属性配置 PostgreSQL 目标。在创建目标终端节点时,您可以指定这些设置。如果您具有多个连接属性设置,请用分号将它们彼此分开,并且不需要额外的空格。

下表列出了可用于将 PostgreSQL 配置为 Amazon DMS 目标的额外连接属性:

名称 描述

maxFileSize

指定用于将数据传输到 PostgreSQL 的任何 .csv 文件的最大大小(以 KB 为单位)。

默认值:32,768 千 B (32 毫巴)

有效值:1—1,048576 KB (最大限度为 1.1 GB)

示例:maxFileSize=512

executeTimeout

设置 PostgreSQL 实例的客户端语句超时 (以秒为单位)。默认值为 60 秒。

示例:executeTimeout=100

afterConnectScript=SET session_replication_role='replica'

为了仅与更改数据捕获 (CDC) 一起使用,此属性让 Amazon DMS 绕过外键和用户触发器,以减少批量加载数据所需的时间。

注意

此属性仅在更改数据捕获模式下有效。

mapUnboundedNumericAsString

此参数将具有无界 NUMERY 数据类型的列视为字符串,以便在不失去数值精度的情况下成功迁移。此参数仅用于从 PostgreSQL 源到 PostgreSQL 目标或具有 PostgreSQL 兼容性的数据库的复制。

默认值:false

有效值:false /true

示例:mapUnboundedNumericAsString=true;

使用此参数可能会导致一些复制性能下降,因为从数字转换为字符串,然后返回到数字。DMS 版本 3.4.4 及更高版本支持此参数使用

注意

仅使用mapUnboundedNumericAsString在 PostgreSQL 源和目标终端节点中使用。

使用mapUnboundedNumericAsString在源 PostgreSQL 终端节点上将精度限制为 28。使用mapUnboundedNumericAsString,则使用精度 28 比例 6 迁移数据。

请勿使用mapUnboundedNumericAsString与非 PostgreSQL 目标一起使用。

PostgreSQL 的目标数据类型

Amazon DMS 的 PostgreSQL 数据库终端节点支持大多数 PostgreSQL 数据库数据类型。下表显示了使用 Amazon DMS 时支持的 PostgreSQL 数据库目标数据类型以及来自 Amazon DMS 数据类型的默认映射。该表的后面列出了不受支持的数据类型。

有关 Amazon DMS 数据类型的其他信息,请参阅的数据类型AmazonDatabase Migration Service

Amazon DMS 数据类型

PostgreSQL 数据类型

BOOLEAN

BOOLEAN

BYTES

BYTEA

DATE

DATE

TIME

TIME

DATETIME

如果小数位数介于 0 和 6 之间,请使用 TIMESTAMP。

如果小数位数介于 7 和 9 之间,请使用 VARCHAR (37)。

INT1

SMALLINT

INT2

SMALLINT

INT4

INTEGER

INT8

BIGINT

NUMERIC

DECIMAL (P,S)

REAL4

FLOAT4

REAL8

FLOAT8

STRING

如果长度介于 1 和 21845 之间,请使用 VARCHAR (以字节为单位的长度)。

如果长度介于 21846 和 2147483647 之间,请使用 VARCHAR (65535)。

UINT1

SMALLINT

UINT2

INTEGER

UINT4

BIGINT

UINT8

BIGINT

WSTRING

如果长度介于 1 和 21845 之间,请使用 VARCHAR (以字节为单位的长度)。

如果长度介于 21846 和 2147483647 之间,请使用 VARCHAR (65535)。

NCLOB

TEXT

CLOB

TEXT

注意

在从 PostgreSQL 源复制时,Amazon DMS 将为所有列(带用户定义的数据类型的列除外)创建带相同数据类型的目标表。在此类情况下,在目标中创建数据类型作为“可变字符”。