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

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

使用 PostgreSQL 数据库作为源 Amazon DMS

您可以使用 Amazon DMS 从一个或多个 PostgreSQL 数据库中迁移数据。使用 PostgreSQL 数据库作为源,您可以将数据迁移到另一个 PostgreSQL 数据库或其他受支持的数据库。

有关支持作为源代码的 PostgreSQL 版本的信息Amazon DMS,请参阅。Amazon DMS 的源

Amazon DMS对于以下类型的数据库,支持 PostgreSQL:

  • 本地数据库

  • 亚马逊 EC2 实例上的数据库

  • 亚马逊 RDS 数据库实例上的数据库

  • 基于亚马逊 Aurora PostgreSQL 兼容版本的数据库实例上的数据库

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

注意

DMS 仅支持 Amazon Aurora PostgreSQL — Serverless V1 作为完整负载的来源。但是你可以使用 Amazon Aurora PostgreSQL — Serverless V2 作为满载、满载 + CDC 和仅限 CDC 的任务的来源。

PostgreSQL 源版本

要使用的 Amazon DMS 版本

9.x、10.x、11.x、12.x

使用任何可用 Amazon DMS 版本。

13.x

使用 3.4.3 及更高Amazon DMS版本。

14.x

使用 3.4.7 及更高Amazon DMS版本。

15.x

使用 3.5.1 及更高Amazon DMS版本。

您可以使用安全套接字层 (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 DMS

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

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

  • 对于满载加上 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 数据库作为源启用 CDC Amazon DMS

注意

有些Amazon DMS事务会闲置一段时间,然后才会让 DMS 引擎再次使用它们。通过idle_in_transaction_session_timeout在 PostgreSQL 9.6 及更高版本中使用该参数,可以导致空闲事务超时并失败。当您使用 Amazon DMS 时,请勿结束空闲事务。

使用自我管理的 PostgreSQL 数据库作为源启用 CDC Amazon DMS

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参数结束非活动时间超过指定毫秒数的复制连接。本地 PostgreSQL 数据库的默认值为 60000 毫秒(60 秒)。将该值设置为 0(零)会禁用超时机制,这是 DMS 的有效设置。

    设置wal_sender_timeout为非零值时,带有 CDC 的 DMS 任务至少需要 10000 毫秒(10 秒),如果该值小于 10000,则会失败。将该值保持在 5 分钟以内,以免在 DMS 复制实例的多可用区故障转移期间造成延迟。

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

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

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

您可以使用Amazon托管的 PostgreSQL 数据库实例作为源。Amazon DMS您可以使用托管的 Amazon PostgreSQL 源执行满载任务和更改数据捕获 (CDC) 任务。

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

从Amazon托管的 PostgreSQL 源数据库迁移数据之前,请执行以下操作:

  • 我们建议您使用具有 PostgreSQL 数据库实例所需最低权限的Amazon用户账户作为 PostgreSQL 源终端节点的用户账户。Amazon DMS不建议使用主账户。该账户必须具有rds_superuser角色和rds_replication角色。该rds_replication角色授予管理逻辑槽和使用逻辑槽流式传输数据的权限。

    请务必使用主用户帐户为您使用的账户创建多个对象。有关创建这些内容的信息,请参阅在不使用主用户账户的情况下迁移 Amazon RDS for PostgreSQL 数据库

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

注意

有些Amazon DMS事务会闲置一段时间,然后才会让 DMS 引擎再次使用它们。通过idle_in_transaction_session_timeout在 PostgreSQL 9.6 及更高版本中使用该参数,可以导致空闲事务超时并失败。当您使用 Amazon DMS 时,请勿结束空闲事务。

使用Amazon托管的 PostgreSQL 数据库实例启用 CDC Amazon DMS

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

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

PostgreSQL 版本

Amazon DMS满载支持

Amazon DMS疾病预防控制中心支持

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

兼容 PostgreSQL 10.6 的 Aurora PostgreSQL 版本 2.2(或更高版本)

兼容 PostgreSQL 10.21(或更高版本)的 PostgreSQL 版 RDS

为 RDS PostgreSQL 数据库实例启用逻辑复制
  1. 使用 Po Amazon stgreSQL 数据库实例的主用户账户作为 PostgreSQL 源终端节点的用户账户。主用户账户具有允许它设置 CDC 所需的角色。

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

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

  3. wal_sender_timeout参数结束非活动时间超过指定毫秒数的复制连接。Amazon由托管的 PostgreSQL 数据库的默认值为 30000 毫秒(30 秒)。将该值设置为 0(零)会禁用超时机制,这是 DMS 的有效设置。

    设置wal_sender_timeout为非零值时,带有 CDC 的 DMS 任务至少需要 10000 毫秒(10 秒),如果该值介于 0 和 10000 之间,则会失败。将该值保持在 5 分钟以内,以免在 DMS 复制实例的多可用区故障转移期间造成延迟。

  4. 确保数据库集群max_worker_processes参数组中参数的值等于或大于max_logical_replication_workersautovacuum_max_workers、和的总组合值max_parallel_workers。大量的后台工作进程可能会影响小型实例上的应用程序工作负载。因此,如果设置的值max_worker_processes高于默认值,请监控数据库的性能。

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

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

注意

如果您在源captureDDLs终端节点false上将终端节点设置设置为,则无需创建下表并在源数据库上触发。

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

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

  2. 使用除主账户之外的用户账户(此处为账户)登录 PostgreSQL 数据库实例。OtherThanMaster

  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' or tg_tag = 'CREATE TABLE AS') 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. 注销 OtherThanMaster 账户并使用分配了 rds_superuser 角色的账户登录。

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

    CREATE EVENT TRIGGER awsdms_intercept_ddl ON ddl_command_end EXECUTE PROCEDURE objects_schema.awsdms_intercept_ddl();
  7. 确保访问这些事件的所有用户和角色都具有必要的 DDL 权限。例如:

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

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

注意

这些事件由CREATE TABLEALTER TABLE、和DROP TABLE语句触发。

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

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

Amazon DMS支持使用主键的 PostgreSQL 表的 CDC。如果表没有主键,则预写日志 (WAL) 不包含数据库行之前的图像。在这种情况下,DMS 无法更新表。在这里,您可以使用其他配置设置并使用表副本身份作为解决方法。但是,这种方法可能会生成额外的日志。我们建议您在仔细测试后才使用表副本身份作为解决方法。有关更多信息,请参阅使用 PostgreSQL 数据库作为 DMS 源时的其他配置设置

注意

逻辑解码插件支持 REPLICA IDENTITY FULL,但 pglogical 插件不支持。有关更多信息,请参阅 pglogical 文档。

对于满载任务以及仅限 CDC 和 CDC 的任务,Amazon DMS使用逻辑复制槽保留 WAL 日志以进行复制,直到日志被解码。对于满载和 CDC 任务或 CDC 任务,在重启(不是恢复)时,会重新创建复制槽。

注意

对于逻辑解码,DMS 使用 test_decoding 或 pglogical 插件。如果 pglogical 插件在源 PostgreSQL 数据库上可用,则 DMS 会使用 pglogical 创建一个复制槽,否则将使用 test_decoding 插件。有关 test_decoding 插件的更多信息,请参阅 PostgreSQL 文档。

如果将数据库参数设置max_slot_wal_keep_size为非默认值,并且复制槽落后于当前 LSN 的大小超过此大小,则由于删除了所需的 WAL 文件,DMS 任务将失败。restart_lsn

配置 pglogical 插件

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

PostgreSQL 源代码

支持 pglogical

自行管理 PostgreSQL 9.4 或更高版本

亚马逊 RDS PostgreSQL 9.5 或更低版本

亚马逊 RDS PostgreSQL 9.6 或更高版本

Aurora PostgreSQL 1.x 到 2.5.x

Aurora PostgreSQL 2.6.x 或更高版本

Aurora PostgreSQL 3.3.x 或更高版本

在配置 pglogical 以与一起使用之前Amazon DMS,请先在 PostgreSQL 源数据库上启用更改数据捕获 (CDC) 的逻辑复制。

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

使用 pglogical 插件在 PostgreSQL 源数据库上进行逻辑复制 Amazon DMS
  1. 在你的源 PostgreSQL 数据库上创建一个 pglogical 扩展:

    1. 设置正确的参数:

      • 对于自建的 PostgreSQL 数据库,请设置数据库参数。shared_preload_libraries= 'pglogical'

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

    2. 重启你的 PostgreSQL 源数据库。

    3. 在 PostgreSQL 数据库上,运行以下命令,create extension pglogical;

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

    select * FROM pg_catalog.pg_extension

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

注意

如果您未在 PostgreSQL 源数据库上启用 pglogical,Amazon DMS则默认使用该插件。test_decoding当启用 pglogical 进行逻辑解码时,默认情况下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 DMS API 创建仅限 CDC 的新任务。例如,使用 CLI 可以运行以下create-replication-task命令。

    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 本机开始点

    要在使用控制Amazon DMS台创建仅限 CDC 的新任务时启用自定义 CDC 启动模式,请执行以下操作:

    • 任务设置部分中,对于源交易的 CDC 启动模式,请选择启用自定义 CDC 启动模式

    • 对于源事务的自定义 CDC 起点,请选择指定日志序列号。指定系统更改编号或选择 “指定恢复检查点”,然后提供恢复检查点。

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

在 pglogical 插件中使用原生 CDC 起点并且想要使用新的复制槽时,请在创建 CDC 任务之前完成以下设置步骤。

使用以前未在另一个 DMS 任务中创建的新复制槽
  1. 创建复制槽,如下所示:

    SELECT * FROM pg_create_logical_replication_slot('replication_slot_name', 'pglogical');
  2. 数据库创建复制槽后,获取并记下该插槽的 restart_lsn 和 conf irmed _flush_lsn 值:

    select * from pg_replication_slots where slot_name like 'replication_slot_name';

    请注意,在复制时段之后创建的 CDC 任务的本地 CDC 起始位置不能早于 conf irmed_flush_lsn 值

    有关 restart_lsn 和 conf ir med_flush_lsn 值的信息,请参阅 pg_replicati on_slots

  3. 创建一个 pglogical 节点。

    SELECT pglogical.create_node(node_name := 'node_name', dsn := 'your_dsn_name');
  4. 使用pglogical.create_replication_set函数创建两个复制集。第一个复制集跟踪具有主键的表的更新和删除。第二个复制集仅跟踪插入,其名称与第一个复制集相同,并添加了前缀 “i”。

    SELECT pglogical.create_replication_set('replication_slot_name', false, true, true, false); SELECT pglogical.create_replication_set('ireplication_slot_name', true, false, false, true);
  5. 向复制集添加表。

    SELECT pglogical.replication_set_add_table('replication_slot_name', 'schemaname.tablename', true); SELECT pglogical.replication_set_add_table('ireplication_slot_name', 'schemaname.tablename', true);
  6. 创建源端点时,请设置以下额外连接属性 (ECA)。

    PluginName=PGLOGICAL;slotName=slot_name;

现在,您可以使用新的复制槽创建具有 PostgreSQL 本机起点的仅限 CDC 的任务。有关 pglogical 插件的更多信息,请参阅 pglogical 3.7 文档

使用 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 目标,则可以使用 pglogical 插件。

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

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

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

注意

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

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

执行数据类型迁移时,请注意以下几点:

  • 在某些情况下,PostgreSQL NUMERIC (p, s) 数据类型不指定任何精度和小数位数。对于 DMS 版本 3.4.2 及更早版本,DMS 默认使用精度为 28,小数位数为 6,即数字 (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:59” 和 “4713-01-01 00:00:00 BC”。
TIMESTAMP(有时区) X
DATE X
TIME X
带时区的时间 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 插件。这样做可以确保为 PostgreSQL 目标数据库实例Amazon DMS创建精确的源空间数据列。

对于 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 在传递给数据库客户端的连接字符串中包括传递参数。

  • 通过在 REPLICA IDENTITY PostgreSQL 9.4 及更高版本中使用表级参数,您可以控制写入预写日志 (WAL) 的信息。特别是,对于标识已更新或删除行的 WAL,它会这样做。 REPLICA IDENTITY FULL记录该行中所有列的旧值。请REPLICA IDENTITY FULL谨慎使用每个表,因为FULL会生成可能不需要的额外数量的 WAL。有关更多信息,请参阅更改表副本身份

使用 P MapBooleanAsBoolean ostgreSQL 端点设置

您可以使用 PostgreSQL 终端节点设置将布尔值作为布尔值从 PostgreSQL 源映射到亚马逊 Redshift 目标。默认情况下,布尔类型迁移为 varchar (5)。您可以指定MapBooleanAsBoolean让 PostgreSQL 将布尔类型迁移为布尔值,如以下示例所示。

--postgre-sql-settings '{"MapBooleanAsBoolean": true}'

请注意,您必须在源端点和目标端点上都设置此设置才能使其生效。

由于 MySQL 没有布尔类型,因此在将布尔数据迁移到 MySQL 时,请使用转换规则而不是此设置。

使用 PostgreSQL 作为 DMS 源时的端点设置

您可以使用端点设置来配置 PostgreSQL 源数据库,就像使用额外的连接属性一样。您可以在使用Amazon DMS控制台创建源端点时指定设置,或者使用中带有 --postgre-sql-settings '{"EndpointSetting": "value", ...}' JSON 语法的create-endpointAmazon CLI命令来指定设置。

下表显示了您可以将 PostgreSQL 用作源的端点设置。

属性名称 描述

CaptureDDLs

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

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

捕获流式处理的 DDL 事件。

默认值:true

有效值:true/false

示例:--postgre-sql-settings '{"CaptureDDLs": true}'

ConsumeMonotonicEvents

用于控制如何复制具有重复日志序列号 (LSN) 的整体事务。当此参数为时false,具有重复 LSN 的事件将在目标上使用和复制。当此参数为时true,仅复制第一个事件,而目标上不会使用或复制具有重复 LSN 的事件。

默认值:false

有效值:假/真

示例:--postgre-sql-settings '{"ConsumeMonotonicEvents": true}'

DdlArtifactsSchema

设置在其中创建可操作的 DDL 数据库对象的架构。

默认值:public

有效值:String

示例:--postgre-sql-settings '{"DdlArtifactsSchema": "xyzddlschema"}'

ExecuteTimeout

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

示例:--postgre-sql-settings '{"ExecuteTimeout": 100}'

FailTasksOnLobTruncation

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

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

默认值:false

有效值:布尔值

示例:--postgre-sql-settings '{"FailTasksOnLobTruncation": true}'

fetchCacheSize

此额外连接属性 (ECA) 用于设置游标在满载操作期间将读取的行数。根据复制实例中的可用资源,您可以调整更高或更低的值。

默认值:10000

有效值:数字

ECA 示例:fetchCacheSize=10000;

HeartbeatFrequency

设置 WAL 检测信号频率(以分钟为单位)。

默认值:5

有效值:数字

示例:--postgre-sql-settings '{"HeartbeatFrequency": 1}'

HeartbeatSchema

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

默认值:public

有效值:String

示例:--postgre-sql-settings '{"HeartbeatSchema": "xyzheartbeatschema"}'

MapJsonbAsClob

默认情况下,将 JSONB Amazon DMS 映射到 NCLOB。你可以指定让 PostgreSQL MapJsonbAsClob 将 JSONB 类型迁移为 CLOB。

示例:--postgre-sql-settings='{"MapJsonbAsClob": "true"}'

MapLongVarcharAs

默认情况下,将 VARCHAR Amazon DMS 映射到 WSTRING。你可以指定MapLongVarcharAs让 PostgreSQL 将 VARCHAR (N) 类型(其中 N 大于 16387)迁移到以下类型:

  • WSTRING

  • CLOB

  • NCLOB

示例:--postgre-sql-settings='{"MapLongVarcharAs": "CLOB"}'

MapUnboundedNumericAsString

此参数将具有无界 NUMERIC 数据类型的列视为 STRING,以便在不损失数值精度的前提下成功迁移。此参数仅用于从 PostgreSQL 源复制到 PostgreSQL 目标或与 PostgreSQL 兼容的数据库。

默认值:false

有效值:false/true

示例:--postgre-sql-settings '{"MapUnboundedNumericAsString": true}'

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

注意

只能同时MapUnboundedNumericAsString在 PostgreSQL 源端点和目标端点中使用。

在 CDC 期间,MapUnboundedNumericAsString在源代码上使用 PostgreSQL 端点会将精度限制在 28 以内。MapUnboundedNumericAsString在目标端点上使用,使用 Precision 28 Scale 6 迁移数据。

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

PluginName

指定用于创建副本槽的插件。

有效值:pglogicaltest_decoding

示例:--postgre-sql-settings '{"PluginName": "test_decoding"}'

SlotName

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

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

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

有效值:String

示例:--postgre-sql-settings '{"SlotName": "abc1d2efghijk_34567890_z0yx98w7_6v54_32ut_1srq_1a2b34c5d67ef"}'

使用 PostgreSQL 数据库作为 DMS 源的限制

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

  • Amazon DMS不适用于亚马逊 RDS for PostgreSQL 10.4 或 Amazon Aurora PostgreSQL 10.4 作为源或目标。

  • 捕获的表必须具有一个主键。如果表没有主键,Amazon DMS 将忽略该表的 DELETE 和 UPDATE 记录操作。要解决这个问题,请参阅使用逻辑复制启用变更数据捕获 (CDC)

    注意:我们不建议在没有主键/唯一索引的情况下进行迁移,否则会有其他限制,例如 “否” Batch 应用功能、完整 LOB 功能、数据验证以及无法高效地复制到 Redshift 目标。

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

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

  • Amazon DMS不会复制因分区或子分区操作(ADDDROP、或TRUNCATE)而产生的更改。

  • 复制多个同名但名称具有不同大小写的表(例如,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; $$;
  • 当前,PostgreSQL 源中的boolean数据类型bit作为值不一致的数据类型迁移到 SQL Server 目标。解决方法是,使用列VARCHAR(1)的数据类型预先创建表(或者让 Amazon DMS 创建表)。然后,让下游处理将“F”视为 False,将“T”视为 True。

  • Amazon DMS 不支持 TRUNCATE 操作的更改处理。

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

  • Amazon DMS仅支持同构迁移的 PostGIS 数据类型。

  • 如果您的源是本地或 Amazon EC2 实例上的 PostgreSQL 数据库,请确保您的源终端节点上安装了 test_decoding 输出插件。你可以在 PostgreSQL 配置包中找到这个插件。有关测试解码插件的更多信息,请参阅 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 目标,请先在目标系统上手动创建父表和子表。然后定义一个单独的任务来复制到这些表。在这种情况下,请在加载之前将任务配置设置为 Truncate。

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

  • Amazon DMS仅支持 Aurora PostgreSQL Serverless V1 作为满载任务的来源。 Amazon DMS支持 Aurora PostgreSQL Serverless V2 作为满载、满载和 CDC 以及仅限 CDC 的任务的来源。

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

  • 使用 LOB 模式时,源表和相应的目标表必须具有相同的主键。如果其中一个表没有主键,则删除和更新记录操作的结果将不可预测。

  • 使用并行加载功能时,不支持根据分区或子分区对表进行分段。有关并行加载的更多信息,请参见 对选定的表、视图和集合使用并行加载

  • Amazon DMS不支持延迟约束。

  • Amazon DMS版本 3.4.7 支持 PostgreSQL 14.x 作为源代码,但有以下限制:

    • Amazon DMS不支持对两阶段提交的更改处理。

    • Amazon DMS不支持逻辑复制以流式传输正在进行的长时间事务。

  • Amazon DMS不支持 CDC for Amazon RDS Proxy for PostgreSQL 作为来源。

  • 使用不包含主键列的源过滤器时,不会捕获DELETE操作。

  • 如果您的源数据库也是另一个第三方复制系统的目标,则 DDL 更改可能不会在 CDC 期间迁移。因为这种情况可能会阻止awsdms_intercept_ddl事件触发器触发。要解决这种情况,请在源数据库上修改该触发器,如下所示:

    alter event trigger awsdms_intercept_ddl enable always;
  • Amazon DMS不支持 CDC for Amazon RDS 多可用区数据库集群 PostgreSQL 作为源,因为适用于 PostgreSQL 的 RDS 多可用区数据库集群不支持逻辑复制。

PostgreSQL 的源数据类型

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

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

有关 Amazon DMS 数据类型的其他信息,请参阅Database MigratiAmazon on 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(有时区)

DATETIME

DATE

DATE

TIME

TIME

带时区的时间

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。