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

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

将 PostgreSQL 数据库作为Amazon DMSsource

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

  • 本地数据库

  • Amazon EC2 实例上的数据库

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

  • 基于 Amazon Aurora PostgreSQL 兼容版的数据库实例上的数据库

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 作为目标终端节点。

可以使用安全套接字层 (SSL) 加密 PostgreSQL 终端节点与复制实例之间的连接。有关将 SSL 用于 PostgreSQL 终端节点的更多信息,请参阅将 SSL 与 Amazon Database Migration Service 配合使用

将 PostgreSQL 作为源时的额外安全要求,指定的用户帐户必须是 PostgreSQL 数据库中的注册用户。

将 PostgreSQL 数据库配置为Amazon DMS源终端节点,请执行以下操作:

将自我管理的 PostgreSQL 数据库作为Amazon DMS

将 PostgreSQL 数据库作为源时,可以将数据迁移到另一个 PostgreSQL 数据库或Amazon DMS. 数据库源可以是本地数据库,也可以是 Amazon EC2 实例上运行的自管理引擎。您可以将数据库实例用于满载任务,也可以将其用于更改数据捕获 (CDC) 任务。

将自管理 PostgreSQL 数据库作为Amazon DMSsource

在从自管理 PostgreSQL 源数据库迁移数据之前,请执行以下操作:

  • 请确保您使用 PostgreSQL 数据库版本 9.4.x 或更高版本。

  • 对于完全负载加上 CDC 任务或仅 CDC 任务,请向为 PostgreSQL 源数据库指定的用户帐户授予超级用户权限。用户账户需要超级用户权限才能访问源中特定于复制的函数。对于仅完全加载任务,用户账户需要表的 SELECT 权限以迁移它们。

  • 将 Amazon DMS 复制服务器的 IP 地址添加到 pg_hba.conf 配置文件中,并启用复制和套接字连接。下面是一个示例。

    # Replication Instance host all all 12.3.4.56/00 md5 # Allow replication connections from localhost, by a user with the # replication privilege. host replication dms 12.3.4.56/00 md5

    PostgreSQL 的 pg_hba.conf 配置文件控制客户端身份验证。(HBA 代表基于主机的身份验证。) 文件通常存储在数据库集群的数据目录中。

  • 如果要将数据库配置为逻辑复制的源Amazon DMS请参阅将自管理 PostgreSQL 数据库作为的Amazon DMSsource

注意

一段时间Amazon DMS事务在 DMS 引擎再次使用之前会空闲一段时间。通过使用参数idle_in_transaction_session_timeout在 PostgreSQL 版本 9.6 和更高版本中,您可以导致空闲事务超时并失败。当您使用 Amazon DMS 时,请勿结束空闲事务。

将自管理 PostgreSQL 数据库作为的Amazon DMSsource

Amazon DMS支持使用逻辑复制的更改数据捕获 (CDC)。要启用自我管理的 PostgreSQL 源数据库的逻辑复制,请在postgresql.conf配置文件:

  • 设置 wal_level = logical

  • max_replication_slots 设置为一个大于 1 的值。

    设置max_replication_slots值,取决于您要运行的任务数。例如,要运行五个任务,您至少设置五个时隙。在任务启动时时隙立即打开,即使任务不再运行仍保持打开。请确保手动删除打开的时隙。

  • max_wal_senders 设置为一个大于 1 的值。

    max_wal_senders 参数用于设置可以运行的并发任务数。

  • 设置 wal_sender_timeout =0

    这些区域有:wal_sender_timeout参数将终止处于不活动状态的时间超过指定毫秒数的复制连接。虽然默认值为 60 秒,但我们建议您将此参数设置为零。这样做会关闭超时机制。

某些参数是静态的,您只能在服务器启动时设置它们。在重新启动服务器之前,对配置文件(对于自管理数据库)或数据库参数组(对于 for PostgreSQL 数据库的 RDS)或数据库参数组(对于 RDS for PostgreSQL 数据库)中的任何更改都将被忽略。有关更多信息,请参阅 。PostgreSQL 文档.

有关启用 CDC 的更多信息,请参阅。使用逻辑复制启用更改数据捕获 (CDC).

使用Amazon作为 DMS 源管理的 PostgreSQL 数据库

您可以使用Amazon管理 PostgreSQL 数据库实例作为源Amazon DMS. 您可以使用Amazon管理的 PostgreSQL 源代码。

使用的先决条件Amazon将 PostgreSQL 数据库作为 DMS 源

在将数据从Amazon管理 PostgreSQL 源数据库,请执行以下操作:

  • 使用AmazonPostgreSQL 数据库实例的主用户账户作为的 PostgreSQL 源终端节点的用户账户。Amazon DMS. 主用户账户具有允许它设置 CDC 所需的角色。如果您使用主用户账户之外的账户,该账户必须具有的是rds_superuser角色和rds_replication角色。这些区域有:rds_replication角色授予管理逻辑槽并使用逻辑槽流式处理数据的权限。

    如果您没有为数据库实例使用主用户账户,请确保从主用户账户为您要使用的账户创建多个对象。有关创建这些信息,请参阅。在不使用主用户账户的情况下迁移 Amazon RDS 以适用于 PostgreSQL 数据库.

  • 如果源数据库位于虚拟私有云 (VPC) 中,请选择一个 VPC 安全组,该安全组提供对数据库所在的数据库实例的访问权限。DMS 复制实例要成功连接到源数据库实例,需要这样做。当数据库和 DMS 复制实例位于同一 VPC 中时,请将相应的安全组添加到其自己的入站规则中。

注意

一段时间Amazon DMS事务在 DMS 引擎再次使用之前会空闲一段时间。通过使用参数idle_in_transaction_session_timeout在 PostgreSQL 版本 9.6 和更高版本中,您可以导致空闲事务超时并失败。当您使用 Amazon DMS 时,请勿结束空闲事务。

启用 CDCAmazon托管 PostgreSQL 数据库实例Amazon DMS

Amazon DMS在数据库实例配置为使用逻辑复制时,在 Amazon RDS PostgreSQL 数据库上支持 CDC。下表总结了每个Amazon托管的 PostgreSQL 版本。

不能将 RDS PostgreSQL 只读副本用于 CDC (持续复制)。

Aurora PostgreSQL version

Amazon DMS支持完全加载

Amazon DMSCDC 支持

Aurora PostgreSQL 2.1 版与 PostgreSQL 10.5 兼容性(或更低版本)

Aurora PostgreSQL 版本 2.2 与 PostgreSQL 10.6 兼容性(或更高版本)直到版本 3.3 与 PostgreSQL 11.8 兼容性

为 RDS PostgreSQL 数据库实例启用逻辑复制

  1. 使用Amazon将 PostgreSQL 数据库实例的主用户账户作为 PostgreSQL 源终端节点的用户账户。主用户账户具有允许它设置 CDC 所需的角色。

    如果您使用主用户账户之外的账户,请确保从主账户为您使用的账户创建多个对象。有关更多信息,请参阅在不使用主用户账户的情况下迁移 Amazon RDS 以适用于 PostgreSQL 数据库

  2. 设置rds.logical_replication参数设置为 1。此静态参数要求重启数据库实例才能生效。在应用该参数期间,Amazon DMS 设置 wal_levelmax_wal_sendersmax_replication_slotsmax_connections 参数。这些参数更改可以增加预写日志 (WAL) 生成,因此,只有在您使用逻辑复制槽时才设置 rds.logical_replication

  3. 作为最佳做法,请将 wal_sender_timeout 参数设置为 0。将该参数设置为 0 可防止 PostgreSQL 终止处于不活动状态超过指定超时时间的复制连接。当 Amazon DMS 迁移数据时,复制连接的持续时间需要能够超过指定的超时时间。

在不使用主用户账户的情况下迁移 Amazon RDS 以适用于 PostgreSQL 数据库

在某些情况下,您可能不会将主用户账户用于将用作源的 Amazon RDS PostgreSQL 数据库实例。在这些情况下,您可以创建多个对象以捕获数据定义语言 (DDL) 事件。您可以在主用户账户之外的账户中创建这些对象,然后在主用户账户中创建触发器。

注意

如果在源终端节点上将 captureDDLs 额外的连接属性设置为 N,您不需要在源数据库上创建以下表和触发器。

使用以下过程创建这些对象。

创建对象

  1. 选择要在其中创建对象的架构。默认架构为 public。确保架构存在并且可由 NoPriv 账户访问。

  2. 使用主账户以外的用户账户登录 PostgreSQL 数据库实例,在这里NoPrivaccount.

  3. 创建表awsdms_ddl_audit通过运行以下命令,将objects_schema在以下代码中,并将要使用的架构名称。

    create table objects_schema.awsdms_ddl_audit ( c_key bigserial primary key, c_time timestamp, -- Informational c_user varchar(64), -- Informational: current_user c_txn varchar(16), -- Informational: current transaction c_tag varchar(24), -- Either 'CREATE TABLE' or 'ALTER TABLE' or 'DROP TABLE' c_oid integer, -- For future use - TG_OBJECTID c_name varchar(64), -- For future use - TG_OBJECTNAME c_schema varchar(64), -- For future use - TG_SCHEMANAME. For now - holds current_schema c_ddlqry text -- The DDL query associated with the current DDL event )
  4. 运行以下命令以创建函数 awsdms_intercept_ddl,并将以下代码中的 objects_schema 替换为要使用的架构名称。

    CREATE OR REPLACE FUNCTION objects_schema.awsdms_intercept_ddl() RETURNS event_trigger LANGUAGE plpgsql SECURITY DEFINER AS $$ declare _qry text; BEGIN if (tg_tag='CREATE TABLE' or tg_tag='ALTER TABLE' or tg_tag='DROP TABLE') then SELECT current_query() into _qry; insert into objects_schema.awsdms_ddl_audit values ( default,current_timestamp,current_user,cast(TXID_CURRENT()as varchar(16)),tg_tag,0,'',current_schema,_qry ); delete from objects_schema.awsdms_ddl_audit; end if; END; $$;
  5. 注销 NoPriv 账户并使用分配了 rds_superuser 角色的账户登录。

  6. 运行以下命令以创建事件触发器 awsdms_intercept_ddl

    CREATE EVENT TRIGGER awsdms_intercept_ddl ON ddl_command_end EXECUTE PROCEDURE objects_schema.awsdms_intercept_ddl();

在完成前面的过程后,可以使用 NoPriv 账户创建 Amazon DMS 源终端节点。

注意

这些事件由CREATE TABLEALTER TABLE, 和DROP TABLE语句。

请确保访问这些事件的所有用户和角色都具有必要的 DDL 权限。例如:

grant all on public.awsdms_ddl_audit to public; grant all on public.awsdms_ddl_audit_c_key_seq to public;

使用逻辑复制启用更改数据捕获 (CDC)

在 PostgreSQL 源的数据库迁移期间,您可以使用 PostgreSQL 的本机逻辑复制功能启用更改数据捕获 (CDC)。您可以将此功能与自我管理的 PostgreSQL 以及适用于 PostgreSQL SQL 数据库实例的亚马逊 RDS 结合使用。此方法可减少停机时间,并有助于确保目标数据库与源 PostgreSQL 数据库同步。

Amazon DMS支持具有主键的 PostgreSQL 表的 CDC。如果某个表没有主键,提前写入日志 (WAL) 将不包含数据库行的前映像。在此示例中,DMS 将不能更新表。在这里,您可以使用其他配置设置并使用表副本身份作为解决方法。但是,此方法可能会生成额外日志。我们建议您仅在仔细测试后才使用表副本标识作为解决方法。有关更多信息,请参阅将 PostgreSQL 数据库作为 DMS 源时的额外配置设置

对于仅满载和 CDC 和 CDC 任务,Amazon DMS使用逻辑复制插槽保留 WAL 日志进行复制,直到对日志进行解码。对于完全负载和 CDC 任务或 CDC 任务重新启动(不恢复)时,将重新创建复制插槽。

注意

对于逻辑解码,DMS 使用测试解码或 pglogy 插件。如果 pglogy 插件在源 PostgreSQL 数据库上可用,DMS 会使用 pglogy 创建一个复制插槽,否则将使用 test_解码插件。

配置 pglogical 插件

pglogical 插件作为 PostgreSQL 扩展实现,是一个逻辑复制系统和模型,用于选择性数据复制。下表标识了支持 pglogy 插件的源 PostgreSQL 数据库版本。

PostgreSQL 源

支持 pgLogRogRog

自管理 PostgreSQL 9.4 或更高版本

Amazon RDS PostgreSQL 9.5 或更低版本

Amazon RDS PostgreSQL 9.6 或更高版本

Aurora PostgreSQL 1.x 到 2.5.x

Aurora PostgreSQL 2.6.x 或更高版本

Aurora PostgreSQL 3.x 或更高版本 3.x

支持

在配置 pglogy 以便与Amazon DMS,首先在 PostgreSQL 源数据库上启用逻辑复制以便更改数据捕获 (CDC)。

在 PostgreSQL 源数据库上启用逻辑复制后,请使用以下步骤配置 pglogy 以便与 DMS 一起使用。

若要在 PostgreSQL 源数据库上使用 pglogy 插件进行逻辑复制Amazon DMS

  1. 在源 PostgreSQL 数据库上创建一个扩展名:

    1. 设置正确的参数:

      • 对于自我管理的 PostgreSQL 数据库,请设置数据库参数shared_preload_libraries= 'pglogical'.

      • 对于 Amazon RDS 上的 PostgreSQL 和 Amazon Aurora PostgreSQL 兼容版本数据库,请设置参数shared_preload_librariespglogical在同一 RDS 参数组中。

    2. 重新启动 PostgreSQL 源数据库。

    3. 在 PostgreSQL 数据库上,运行create extension pglogical;

  2. 运行以下命令验证是否已成功安装 pglogy:

    select * FROM pg_catalog.pg_extension

  3. 启用 CDC 任务以使用本机起点,如下所示:

    1. 创建复制插槽,如下所示:

      SELECT * FROM pg_create_logical_replication_slot('replication_slot_name', 'pglogical');
    2. 创建两个复制集,如下所示:

      select pglogical.create_replication_set('replication_slot_name', true, false, false, true); select pglogical.create_replication_set('replication_slot_name', false, true, true, false);

    下面是一个示例。

    SELECT * FROM pg_create_logical_replication_slot('test_slot', 'pglogical'); select pglogical.create_replication_set('itest_slot', true, false, false, true); select pglogical.create_replication_set('test_slot', false, true, true, false);

您现在可以创建Amazon DMS任务,该任务为 PostgreSQL 源数据库终端节点执行更改数据捕获。

注意

如果您不在 PostgreSQL 源数据库上启用 pglogy,请Amazon DMS使用test_decoding插件。当启用 pglogy 进行逻辑解码时,Amazon DMS默认使用 pglogical。但是您可以将额外连接属性PluginName要使用的test_decoding插件。

使用本机 CDC 开始点设置 PostgreSQL 源的 CDC 加载

要使用 PostgreSQL 作为源启用本机 CDC 起始点,请将slotName当您创建终端节点时,将额外连接属性设置为现有逻辑复制位置的名称。此逻辑复制槽保留从创建终端节点时起持续进行的更改,因此它支持从前一个时间点进行复制。

PostgreSQL 将数据库更改写入 WAL 文件,这些文件只有在 Amazon DMS 成功读取逻辑复制槽中的更改后才会丢弃。使用逻辑复制槽可以防止记录的更改在它们被复制引擎使用之前删除。

但是,根据更改速率和消耗量,保留在逻辑复制槽中的更改可能会导致磁盘使用率提高。我们建议您在使用逻辑复制槽时,在源 PostgreSQL 实例中设置空间使用情况警报。有关设置 slotName 额外连接属性的更多信息,请参阅 将 PostgreSQL 作为 DMS 源时的额外连接属性

以下过程将更详细地演练这种方法。

使用本机 CDC 开始点设置 PostgreSQL 源终端节点的 CDC 加载

  1. 确定您要用作开始点的更早复制任务(父任务)所使用的逻辑复制槽。然后,查询源数据库上的 pg_replication_slots 视图,以确保此槽没有任何活动的连接。如果有,请先予以解决并关闭它们,然后再继续。

    对于以下步骤,假定您的逻辑复制槽为 abc1d2efghijk_34567890_z0yx98w7_6v54_32ut_1srq_1a2b34c5d67ef

  2. 创建一个新的源终端节点,其中包含以下额外连接属性设置。

    slotName=abc1d2efghijk_34567890_z0yx98w7_6v54_32ut_1srq_1a2b34c5d67ef;
  3. 使用Amazon CLI或者Amazon DMSAPI。例如,通过使用 CLI,您可以运行以下create-replication-task命令。

    Amazon DMS 当前不支持使用控制台创建具有本机开始点的 CDC 任务。

    aws dms create-replication-task --replication-task-identifier postgresql-slot-name-test --source-endpoint-arn arn:aws:dms:us-west-2:012345678901:endpoint:ABCD1EFGHIJK2LMNOPQRST3UV4 --target-endpoint-arn arn:aws:dms:us-west-2:012345678901:endpoint:ZYX9WVUTSRQONM8LKJIHGF7ED6 --replication-instance-arn arn:aws:dms:us-west-2:012345678901:rep:AAAAAAAAAAA5BB4CCC3DDDD2EE --migration-type cdc --table-mappings "file://mappings.json" --cdc-start-position "4AF/B00000D0" --replication-task-settings "file://task-pg.json"

    在前面的命令中,设置了以下选项:

    • 这些区域有:source-endpoint-arn选项设置为您在步骤 2 中创建的新值。

    • 这些区域有:replication-instance-arn选项设置为与步骤 1 中的父任务相同的值。

    • 这些区域有:table-mappingsreplication-task-settings选项设置为与步骤 1 中的父任务相同的值。

    • 这些区域有:cdc-start-position选项设置为起始位置值。要查找此起始位置,请查询源数据库上的 pg_replication_slots 视图,或查看步骤 1 中父任务的控制台详细信息。有关更多信息,请参阅确定 CDC 本机开始点

    当此 CDC 任务运行时,Amazon DMS如果指定的逻辑复制槽不存在,则会引发错误。如果未使用的有效设置创建任务,则会引发错误。cdc-start-position.

如果将本机 CDC 起始点与 pglogy 插件一起使用,并且您希望使用新的复制插槽,请在创建 CDC 任务之前完成以下设置步骤。

使用以前未创建的新复制插槽作为其他 DMS 任务的一部分

  1. 创建复制槽。

    SELECT * FROM pg_create_logical_replication_slot('replication_slot_name', 'pglogical');
  2. 创建一个 pglogical 节点。

    SELECT pglogical.create_node(node_name := 'node_name', dsn := 'your_dsn_name');
  3. 创建复制集。

    select pglogical.create_replication_set('replication_slot_name', false, true, true, false); select pglogical.create_replication_set('ireplication_slot_name', true, false, false, true);
  4. 将表添加到复制集。

    select pglogical.replication_set_add_table('replication_slot_name', 'schemaname.tablename', true); select pglogical.replication_set_add_table('ireplication_slot_name', 'schemaname.tablename', true);

    如以下示例所示。

    SELECT * FROM pg_create_logical_replication_slot('test_slot', 'pglogical'); SELECT pglogical.create_node(node_name := 'test_node', dsn := 'your_dsn_name'); select pglogical.create_replication_set('test_slot', false, true, true, false); select pglogical.create_replication_set('itest_slot', true, false, false, true); select pglogical.replication_set_add_table('test_slot', 'schemaname.tablename', true); select pglogical.replication_set_add_table('itest_slot', 'schemaname.tablename', true);
  5. 在创建源端点时,设置附加连接属性 (ECA)。

    PluginName=PGLOGICAL;slotName=slot_name;

现在,您可以使用新的复制槽创建具有 PostgreSQL 本机起始点的仅 CDC 任务。

使用 Amazon DMS 从 PostgreSQL 迁移到 PostgreSQL。

当您从 PostgreSQL 之外的数据库引擎迁移到 PostgreSQL 数据库时,Amazon DMS几乎总是最好的迁移工具。但是,当您从 PostgreSQL 数据库迁移到 PostgreSQL 数据库时,PostgreSQL 工具效率更高。

使用 PostgreSQL 本机工具迁移数据

我们建议您使用 PostgreSQL 数据库迁移工具(例如)pg_dump在以下条件下:

  • 您有一个从源 PostgreSQL 数据库向目标 PostgreSQL 数据库的同构迁移。

  • 您正在迁移整个数据库。

  • 利用这些本机工具,可以在迁移您的数据时最大程度地减少停机时间。

pg_dump 实用程序使用 COPY 命令创建 PostgreSQL 数据库的架构和数据转储。pg_dump 生成的转储脚本将数据加载到一个同名的数据库中,然后重新创建表、索引和外键。要将数据恢复到具有其他名称的数据库,请使用pg_restore命令和-d参数。

如果您要将数据从 EC2 上运行的 PostgreSQL 源数据库迁移到 Amazon RDS for PostgreSQL 目标,则可以使用 pglogy 插件。

有关将 PostgreSQL 数据库导入 Amazon RDS for PostgreSQL 或 Amazon Aurora PostgreSQL 兼容版本的更多信息,请参阅https://docs.amazonaws.cn/AmazonRDS/latest/UserGuide/PostgreSQL.Procedural.Importing.html.

使用 DMS 将数据从 PostgreSQL 迁移到 PostgreSQL

Amazon DMS举例而言,可以将数据从本地的源 PostgreSQL 数据库迁移到目标 Amazon RDS for PostgreSQL 或 Aurora PostgreSQL 实例。核心或基本 PostgreSQL 数据类型通常可以成功迁移。

注意

将分区表从 PostgreSQL 源复制到 PostgreSQL 目标时,您无需在 DMS 任务中提及父表作为选择条件的一部分。提及父表会导致数据在目标上的子表中复制,从而可能导致 PK 违规。通过在表映射选择条件中单独选择子表,父表将自动填充。

源数据库上支持但目标数据库上不支持的数据类型可能无法成功迁移。如果数据类型未知,Amazon DMS 会将一些数据类型作为字符串进行流式处理。对于某些数据类型(例如 XML 和 JSON),如果文件较小则可以成功迁移,但如果是较大的文档,迁移会失败。

在执行数据类型迁移时,请注意以下事项:

  • 在某些情况下,PostgreSQL NUMERIC (p, s) 数据类型未指定任何精度和小数位数。对于 DMS 3.4.2 及更早版本,DMS 默认情况下,使用 28 位精度和 6 位小数 NUMERIC (28,6)。例如,源中的值 0.611111104488373 在 PostgreSQL 目标中将转换为 0.611111。

  • 具有 ARRAY 数据类型的表必须具有一个主键。具有 ARRAY 数据类型缺少主键的表将在完全加载期间暂停。

下表显示了源 PostgreSQL 数据类型以及是否可以成功迁移这些数据类型。

数据类型 成功迁移 部分迁移 不迁移 注释
INTEGER X
SMALLINT X
BIGINT X
NUMERIC/DECIMAL(p,s) X 当 0<p<39 且 0<s 时
NUMERIC/DECIMAL X 其中 p>38 或 p=s=0
REAL X
DOUBLE X
SMALLSERIAL X
SERIAL X
BIGSERIAL X
MONEY X
CHAR X 未指定精度
CHAR (n) X
VARCHAR X 未指定精度
VARCHAR (n) X
TEXT X
BYTEA X
TIMESTAMP X 正无穷大值和负无穷大值分别被截断为 '9999-12-31 23:59' 和 '4713-01-01 00:00:00'。
TIMESTAMP(Z) X
DATE X
TIME X
TIME (z) X
INTERVAL X
BOOLEAN X
ENUM X
CIDR X
INET X
MACADDR X
TSVECTOR X
TSQUERY X
XML X
POINT X PostGIS 空间数据类型
LINE X
LSEG X
BOX X
路径 X
POLYGON X PostGIS 空间数据类型
CIRCLE X
JSON X
ARRAY X 需要主键
COMPOSITE X
RANGE X
LINESTRING X PostGIS 空间数据类型
MULTIPOINT X PostGIS 空间数据类型
MULTILINESTRING X PostGIS 空间数据类型
MULTIPOLYGON X PostGIS 空间数据类型
GEOMETRYCOLLECTION X PostGIS 空间数据类型

迁移 PostGIS 空间数据类型

空间数据 标识空间中对象或位置的几何信息。PostgreSQL 对象关系数据库支持 PostGIS 空间数据类型。

在迁移 PostgreSQL 空间数据对象之前,请确保在全局级别启用 PostGIS 插件。这样做可以确保Amazon DMS为 PostgreSQL 目标数据库实例创建精确的源空间数据列。

对于 PostgreSQL 到 PostgreSQL 的同构迁移,Amazon DMS 支持 PostGIS 几何和地理(大地测量坐标)数据对象类型和子类型的迁移,如下所示:

  • POINT

  • LINESTRING

  • POLYGON

  • MULTIPOINT

  • MULTILINESTRING

  • MULTIPOLYGON

  • GEOMETRYCOLLECTION

从 PostgreSQL 源数据库中删除 Amazon DMS 项目

要捕获 DDL 事件,在开始执行迁移任务时,Amazon DMS 在 PostgreSQL 数据库中创建各种不同的项目。完成任务后,您可能需要删除这些项目。

要删除项目,请发布以下语句(按显示顺序),其中{AmazonRDSMigration}是在其中创建工件的架构。删除架构时应尤为谨慎。请勿删除正在使用的架构,特别是非公有的操作架构。

drop event trigger awsdms_intercept_ddl;

事件触发器不属于特定架构。

drop function {AmazonRDSMigration}.awsdms_intercept_ddl() drop table {AmazonRDSMigration}.awsdms_ddl_audit drop schema {AmazonRDSMigration}

将 PostgreSQL 数据库作为 DMS 源时的额外配置设置

在从 PostgreSQL 数据库迁移数据时,您可以使用两种方法来添加额外配置设置:

  • 您可以将值添加到额外连接属性来捕获 DDL 事件,以及指定在其中创建操作 DDL 数据库项目的架构。有关更多信息,请参阅将 PostgreSQL 作为 DMS 源时的额外连接属性

  • 您可以覆盖连接字符串参数。选择此选项可执行以下任一操作:

    • 指定内部 Amazon DMS 参数。此类参数很少需要,因此不在用户界面中公开。

    • 为特定数据库客户端指定传递 (passthru) 值。Amazon DMS 在传递给数据库客户端的连接字符串中包括传递参数。

  • 通过使用表级参数REPLICATE IDENTITY,您可以控制写入预写日志 (WAPostgreSQL) 的信息。特别是,它为标识已更新或删除的行的 WAL 执行此操作。REPLICATE IDENTITY FULL记录行中所有列的旧值。使用REPLICATE IDENTITY FULL仔细将每个表作为FULL会生成额外数量的 WAL,这些 WAL 可能不是必需的。

将 PostgreSQL 作为 DMS 源时的额外连接属性

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

下表显示将 PostgreSQL 作为 Amazon DMS 的源时可以使用的额外连接属性。

属性名称 描述

captureDDLs

为捕获 DDL 事件,在任务开始时,Amazon DMS 会在 PostgreSQL 数据库中创建各种项目。稍后可以删除这些项目,如从 PostgreSQL 源数据库中删除 Amazon DMS 项目中所述。

如果此值设置为 N,您无需在源数据库上创建表或触发器。

捕获流式处理的 DDL 事件。

默认值:是

有效值:Y/N

示例:captureDDLs=Y;

ddlArtifactsSchema

设置在其中创建操作 DDL 数据库项目的架构。

默认值:public

有效值:字符串

示例:ddlArtifactsSchema=xyzddlschema;

failTasksOnLobTruncation

在设置为 true 时,如果 LOB 列的实际大小大于指定的 LobMaxSize,则此值将导致任务失败。

如果任务设置为“受限 LOB 模式”并且该选项设置为 true,任务将失败,而不是截断 LOB 数据。

默认值:false

有效值:Boolean

示例:failTasksOnLobTruncation=true;

executeTimeout

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

示例:executeTimeout=100;

pluginName

指定用于创建复制插槽的插件。

有效值:pglogicaltest_decoding

示例:pluginName=test_decoding;

slotName

为 PostgreSQL 源实例的 CDC 加载设置先前创建的逻辑复制槽的名称。

与 Amazon DMS API CdcStartPosition 请求参数一起使用时,此属性还支持使用本机 CDC 开始点。DMS 在启动 CDC 加载任务之前验证指定的逻辑复制槽是否存在。它还验证此任务是否使用有效的 CdcStartPosition 设置创建的。如果指定的槽不存在或任务没有有效的 CdcStartPosition 设置,DMS 将引发错误。

有关设置 CdcStartPosition 请求参数的更多信息,请参阅 确定 CDC 本机开始点。有关使用的更多信息CdcStartPosition,请参阅文档CreateReplicationTaskStartReplicationTask, 和ModifyReplicationTask中的 API 操作Amazon Database Migration ServiceAPI 参考.

有效值:字符串

示例:slotName=abc1d2efghijk_34567890_z0yx98w7_6v54_32ut_1srq_1a2b34c5d67ef;

heartbeatEnable

WAL 检测信号功能模拟虚拟事务,以便空闲逻辑复制槽不会保留旧 WAL 日志,以免在源上出现存储已满情况。该检测信号将 restart_lsn 保持运行状态,并防止出现存储已满情况。

默认值:false

有效值:true/false

示例:heartbeatEnable=true;

heartbeatFrequency

设置 WAL 心跳频率(分钟)。

默认值:5

有效值:数字

示例:heartbeatFrequency=1;

heartbeatSchema

设置在其中创建检测信号项目的架构。

默认值:public

有效值:字符串

示例:heartbeatSchema=xyzheartbeatschema

consumeMonotonicEvents

用于控制复制具有重复日志序列号 (LSN) 的单片事务的方式。当此参数为false,则在目标上使用并复制具有重复 LSN 的事件。当此参数为true,则只复制第一个事件,而具有重复 LSN 的事件不会在目标上使用或复制。

默认值:false

有效值:false /true

示例:consumeMonotonicEvents=true;

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 数据库作为 DMS 源的限制

将 PostgreSQL 作为 Amazon DMS 的源时,以下限制适用:

  • Amazon DMS不使用 Amazon RDS for PostgreSQL 10.4 或 Amazon Aurora PostgreSQL 10.4 作为源或目标。

  • 捕获的表必须具有一个主键。如果表没有主键,Amazon DMS 将忽略该表的 DELETE 和 UPDATE 记录操作。

  • Amazon DMS 忽略尝试更新主键段的操作。在这些情况下,目标会将更新标识为未更新任何行的更新。但是,由于更新 PostgreSQL 中的主键的结果是不可预测的,不会将任何记录写入异常表。

  • Amazon DMS 不支持 Start Process Changes from Timestamp 运行选项。

  • 复制多个同名但名称具有不同大小写的表(例如,table1、TABLE1 和 Table1)会导致无法预测的行为。因此,Amazon DMS 不支持此类复制。

  • 在大多数情况下,Amazon DMS 支持表的 CREATE、ALTER 和 DROP DDL 语句的更改处理。如果表保存在内部函数、过程正文块或其他嵌套结构中,则 Amazon DMS 不支持此更改处理。

    例如,不捕获以下更改。

    CREATE OR REPLACE FUNCTION attu.create_distributors1() RETURNS void LANGUAGE plpgsql AS $$ BEGIN create table attu.distributors1(did serial PRIMARY KEY,name varchar(40) NOT NULL); END; $$;
  • 目前,boolean数据类型迁移到 SQL Server 目标作为bit数据类型具有不一致的值。作为一种解决方法,请使用VARCHAR(1)数据类型(或者具有AmazonDMS 创建表)。然后,让下游处理将“F”视为 False,将“T”视为 True。

  • Amazon DMS不支持 PostgreSQL 版本 11.x 或更低版本的 TRUNCATE 操作的更改处理。

  • OID LOB 数据类型不会迁移到目标。

  • 如果您的源是本地或 Amazon EC2 实例上的 PostgreSQL 数据库,请确保源终端节点中已安装 test_解码输出插件。您可以在 Postgres contrib 包中找到此插件。有关测试解码插件的更多信息,请参阅 PostgreSQL 文档

  • Amazon DMS 不支持更改处理以设置和取消设置列默认值(在 ALTER TABLE 语句中使用 ALTER COLUMN SET DEFAULT 子句)。

  • Amazon DMS 不支持更改处理以设置列的可为 null 性(在 ALTER TABLE 语句中使用 ALTER COLUMN [SET|DROP] NOT NULL 子句)。

  • 启用逻辑复制后,每个事务在内存中保留的最大更改数为 4 MB。之后,更改将溢出到磁盘。因此ReplicationSlotDiskUsage增加,并restart_lsn在事务完成或停止并且回滚完成之前不会进行。由于它是一个很长的事务,因此可能需要很长时间才能完成回滚。因此,在启用逻辑复制时,避免长时间运行的事务。相反,将事务分解为几个较小的事务。

  • 具有 ARRAY 数据类型的表必须具有一个主键。具有 ARRAY 数据类型缺少主键的表将在完全加载期间暂停。

  • Amazon DMS 不支持复制分区表。检测到分区表时,将显示以下内容:

    • 终端节点报告列出父表和子表。

    • Amazon DMS 在目标上创建常规表,这些表具有与选定表相同的属性。

    • 如果源数据库中的父表具有与子表相同的主键值,则会产生“重复的键”错误。

  • 要将分区表从 PostgreSQL 源复制到 PostgreSQL 目标,请先在目标上手动创建父表和子表。然后,定义单独的任务来向这些表进行复制。在这种情况下,将任务配置设置为加载前截断.

  • PostgreSQL NUMERIC 数据类型不是固定大小。当传输的数据属于 NUMERIC 数据类型,但没有精度和小数位数时,默认情况下,DMS 使用 NUMERIC(28,6)(精度为 28,小数位数为 6)。例如,源中的值 0.611111104488373 在 PostgreSQL 目标中将转换为 0.611111。

  • Aurora PostgreSQL 无服务器不支持 CDC 作为源代码。

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

PostgreSQL 的源数据类型

下表列出了使用 Amazon DMS 时支持的 PostgreSQL 源数据类型以及与 Amazon DMS 数据类型的默认映射。

有关如何查看目标中映射的数据类型的信息,请参阅有关所使用的目标终端节点的部分。

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

PostgreSQL 数据类型

DMS 数据类型

INTEGER

INT4

SMALLINT

INT2

BIGINT

INT8

NUMERIC (p,s)

如果精度介于 0 和 38 之间,则使用 NUMERIC。

如果精度为 39 或更大的值,则使用 STRING。

DECIMAL(P,S)

如果精度介于 0 和 38 之间,则使用 NUMERIC。

如果精度为 39 或更大的值,则使用 STRING。

REAL

REAL4

DOUBLE

REAL8

SMALLSERIAL

INT2

SERIAL

INT4

BIGSERIAL

INT8

MONEY

NUMERIC(38,4)

MONEY 数据类型将映射到 SQL Server 中的 FLOAT。

CHAR

WSTRING (1)

CHAR(N)

WSTRING (n)

VARCHAR(N)

WSTRING (n)

TEXT

NCLOB

BYTEA

BLOB

TIMESTAMP

DATETIME

TIMESTAMP (z)

DATETIME

TIMESTAMP(有时区)

DATETIME

DATE

DATE

TIME

TIME

TIME (z)

TIME

INTERVAL

字符串 (128) — 1 年、2 个月、3 天、4 小时、5 分钟、6 秒

BOOLEAN

CHAR (5) false 或 true

ENUM

STRING (64)

CIDR

STRING (50)

INET

STRING (50)

MACADDR

STRING (18)

BIT (n)

STRING (n)

BIT VARYING (n)

STRING (n)

UUID

STRING

TSVECTOR

CLOB

TSQUERY

CLOB

XML

CLOB

POINT

STRING (255) "(x,y)"

LINE

STRING (255) "(x,y,z)"

LSEG

STRING (255) "((x1,y1),(x2,y2))"

BOX

STRING (255) "((x1,y1),(x2,y2))"

路径

CLOB "((x1,y1),(xn,yn))"

POLYGON

CLOB "((x1,y1),(xn,yn))"

CIRCLE

STRING (255) "(x,y),r"

JSON

NCLOB

JSONB

NCLOB

ARRAY

NCLOB

COMPOSITE

NCLOB

HSTORE

NCLOB

INT4RANGE

STRING (255)

INT8RANGE

STRING (255)

NUMRANGE

STRING (255)

STRRANGE

STRING (255)

使用 PostgreSQL 的 LOB 源数据类型

PostgreSQL 列大小将影响 PostgreSQL LOB 数据类型到 Amazon DMS 数据类型的转换。为此,请对以下 Amazon DMS 数据类型执行下列步骤:

  • BLOB — 设置将 LOB 大小限制为最大 LOB 大小 (KB)任务创建时的值。

  • CLOB — 复制将每个字符作为 UTF8 字符处理。因此,找到列中最长字符文本的长度,此处显示为max_num_chars_text. 使用此长度指定将 LOB 大小限制为. 如果数据包含 4 字节字符,请乘以 2 以指定 Limit LOB size to (将 LOB 大小限制为) 值(以字节为单位)。在此示例中,Limit LOB size to (将 LOB 大小限制为) 等于 max_num_chars_text 乘以 2。

  • NCLOB — 复制将每个字符作为双字节字符处理。因此,找到列中最长字符文本的长度 (max_num_chars_text)并乘以 2。您这样做是为指定将 LOB 大小限制为. 在此示例中,Limit LOB size to (将 LOB 大小限制为) 等于 max_num_chars_text 乘以 2。如果数据包含 4 字节字符,请再次乘以 2。在此示例中,Limit LOB size to (将 LOB 大小限制为) 等于 max_num_chars_text 乘以 4。