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

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

将 PostgreSQL 数据库作为 Amazon DMS 源

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

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

Amazon DMS 支持将 PostgreSQL 用于以下类型的数据库:

  •  本地数据库

  • Amazon EC2 实例上的数据库

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

  • 基于 Amazon 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

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

14.x

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

15.x

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

可以使用安全套接字层 (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 数据库作为 Amazon DMS 源启用 CDC

注意

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

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

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

  • 设置 wal_level = logical

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

    请根据您需要运行的任务数设置 max_replication_slots 值。例如,要运行五个任务,您需要设置至少五个时隙。在任务启动时时隙立即打开,即使任务不再运行仍保持打开。请务必手动删除空闲时隙。请注意,如果 DMS 创建了时隙,在删除任务后,DMS 会自动删除重复的时隙。

  • 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 用户账户作为 Amazon DMS 的 PostgreSQL 源端点的用户账户。建议不要使用主账户。该账户必须具有 rds_superuserrds_replication 角色。rds_replication 角色可授予管理逻辑时隙和使用逻辑时隙流式处理数据的权限。

    请务必使用您所用账户的主用户账户创建多个对象。有关创建这些项目的信息,请参阅不使用主用户账户迁移 Amazon RDS for PostgreSQL 数据库

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

注意

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

为与 Amazon DMS 配合使用的 Amazon 托管的 PostgreSQL 数据库实例启用 CDC

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

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

PostgreSQL 版本

Amazon DMS 完全加载支持

Amazon DMS CDC 支持

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

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

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

为 RDS PostgreSQL 数据库实例启用逻辑复制
  1. 将 PostgreSQL 数据库实例的 Amazon 主用户账户作为 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_workersmax_parallel_workers 的总组合值。大量后台工作进程可能会影响小型实例上的应用程序工作负载。因此,如果为 max_worker_processes 设置的值高于默认值,请监控数据库的性能。

不使用主用户账户迁移 Amazon RDS for PostgreSQL 数据库

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

注意

如果在源端点上将 captureDDLs 端点设置为 false,您不需要在源数据库上创建以下表和触发器。

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

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

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

  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 TABLEDROP TABLE 语句触发。

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

在 PostgreSQL 源的数据库迁移期间,您可以使用 PostgreSQL 的本机逻辑复制功能启用更改数据捕获 (CDC)。您可以将此功能与自管理 PostgreSQL 数据库实例以及 Amazon RDS for PostgreSQL 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 设置为非默认值,并且复制槽的 restart_lsn 落后于当前 LSN 的大小超过此大小,DMS 任务会因为删除了所需的 WAL 文件而失败。

配置 pglogical 插件

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

PostgreSQL 源

支持 pglogical

自管理 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.3.x 或更高版本

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

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

在使用 Amazon DMS 的 PostgreSQL 源数据库上使用 pglogical 插件进行逻辑复制
  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 源时的端点设置和额外连接属性 (ECA)

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

使用本机 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_lsnconfirmed_flush_lsn 值:

    select * from pg_replication_slots where slot_name like 'replication_slot_name';

    请注意,在复制槽之后创建的 CDC 任务的本机 CDC 开始位置不能早于 confirmed_flush_lsn 值。

    有关 restart_lsnconfirmed_flush_lsn 值的信息,请参阅 pg_replication_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 数据库导入 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: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 插件。这样做可确保 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 源时的端点设置和额外连接属性 (ECA)

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

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

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

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

使用 P MapBooleanAsBoolean ostgreSQL 端点设置

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

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

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

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

使用 PostgreSQL 作为 DMS 源时的端点设置和额外连接属性 (ECA)

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

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

属性名称 描述

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

有效值:false/true

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

DdlArtifactsSchema

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

默认值:public

有效值:字符串

例如:--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

有效值:字符串

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

MapJsonbAsClob

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

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

MapLongVarcharAs

默认情况下,Amazon DMS 将 VARCHAR 映射到 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 及更高版本支持使用此参数

注意

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

在 CDC 期间,在源 PostgreSQL 端点上使用 MapUnboundedNumericAsString 会将精度限制在 28 以内。在目标端点上使用 MapUnboundedNumericAsString 时,使用精度 28、小数位数 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 的更多信息,请参阅 Amazon Database Migration Service API 参考中的 CreateReplicationTaskStartReplicationTaskModifyReplicationTask API 操作的文档。

有效值:字符串

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

unboundedVarcharMaxSize

此额外连接属性 (ECA) 定义了定义为 VarChar 没有最大长度说明符的类型的数据列的最大大小。默认值为 8000 字节。最大值为 10485760 字节。

将 PostgreSQL 数据库作为 DMS 源的限制

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

  • Amazon DMS 不适合作为源或目标与 Amazon RDS for PostgreSQL 10.4 或 Amazon Aurora PostgreSQL 10.4 一起使用。

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

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

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

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

  • Amazon DMS 不复制由于分区或子分区操作(ADDDROPTRUNCATE)而导致的更改。

  • 复制多个同名但名称具有不同大小写的表(例如,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 contrib 包中找到此插件。有关测试解码插件的更多信息,请参阅 PostgreSQL 文档

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

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

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

    在 Aurora PostgreSQL 版本 13 及更高版本中,您可以调整logical_decoding_work_mem参数以控制 DMS 何时将更改数据溢出到磁盘。有关更多信息,请参见 在 Aurora PostgreSQL 中泄露文件

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

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

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

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

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

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

  • 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 模式时,源表和相应的目标表必须具有相同的主键。如果其中一个表没有主键,DELETE 和 UPDATE 记录操作的结果将不可预测。

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

  • Amazon DMS 不支持延迟约束。

  • Amazon DMS 3.4.7 版本支持使用 PostgreSQL 14.x 作为源,但存在以下限制:

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

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

  • Amazon DMS 不支持将适用于 PostgreSQL 的 Amazon RDS 代理作为源来执行 CDC。

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

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

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

PostgreSQL 的源数据类型

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

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

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

DATETIME

DATE

DATE

TIME

TIME

带时区的时间

TIME

INTERVAL

STRING (128) – 1 YEAR、2 MONTHS、3 DAYS、4 HOURS、5 MINUTES、6 SECONDS

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。