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

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

将 PostgreSQL 数据库作为Amazon DMS资源

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

  • 本地数据库

  • Amazon EC2 实例上的数据库

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

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

PostgreSQL 源版本

要使用的 Amazon DMS 版本

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

使用任何可用 Amazon DMS 版本。

13.x

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

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

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

将 PostgreSQL 数据库配置为Amazon DMS执行以下操作:

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

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

将自管理 PostgreSQL 数据库用作的先决条件Amazon DMS资源

在从自管理 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 DMS资源

注意

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

将自管理 PostgreSQL 数据库作为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参数会结束处于不活动状态的时间超过指定毫秒数的复制连接。默认值为 60000 毫秒(60 秒)。将该值设置为 0(零)将禁用超时机制,并且是 DMS 的有效设置。

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

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

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

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

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

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

迁移数据之前Amazon管理 PostgreSQL 源数据库,执行以下操作:

  • 使用AmazonPostgreSQL 数据库实例的主用户账户,作为的 PostgreSQL 源终端节点的用户账户。Amazon DMS. 主用户账户具有允许它设置 CDC 所需的角色。如果您使用主用户账户之外的账户,该账户必须具有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 时,请勿结束空闲事务。

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

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

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

Aurora PostgreSQL 版本

Amazon DMS支持完全加载

Amazon DMSCDC 支持

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

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

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

  1. 使用AmazonPostgreSQL 数据库实例的主用户账户,作为 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参数会结束处于不活动状态的时间超过指定毫秒数的复制连接。默认值为 60000 毫秒(60 秒)。将该值设置为 0(零)将禁用超时机制,并且是 DMS 的有效设置。

    设置时wal_sender_timeout为非零值,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 数据库实例。在这些情况下,您可以创建多个对象来捕获数据定义语言 (DL) 事件。您可以在主用户账户之外的账户中创建这些对象,然后在主用户账户中创建触发器。

注意

如果在源终端节点上将 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 的 Amazon RDS 实例结合使用。这种方法可减少停机时间并有助于确保目标数据库与源 PostgreSQL 数据库同步。

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

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

注意

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

配置 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.3.x 或更高版本

支持

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

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

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

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

    1. 设置正确的参数:

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

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

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

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

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

    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('test_slot', false, true, true, false);

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

注意

如果你没有在 PostgreSQL 源数据库上启用 pglogic,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. 使用创建新的仅 CDC 任务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.

在 pglogical 插件中使用本机 CDC 起点并且您想要使用新的复制槽时,请在创建 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 目标,则可以使用 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 公元前'。
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在 PostgreSQL 版本 9.4 中,您可以控制写入预写日志 (WALS) 的信息。特别是,对于标识已更新或删除的行的 WALS,它会这样做。REPLICATE IDENTITY FULL记录行中所有列的旧值。使用REPLICATE IDENTITY FULL仔细对于每个表FULL生成可能不需要的额外数量的 WALS。

将 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

有效值:布尔值

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

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

默认值:false

有效值:false/true

示例:mapUnboundedNumericAsString=true;

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

注意

只能使用mapUnboundedNumericAsString在 PostgreSQL 源和目标终端节点中一起使用。

使用mapUnboundedNumericAsString在源代码上,PostgreSQL 端点在 CDC 期间将精度限制在 28。使用mapUnboundedNumericAsString在目标端点上,使用 Precision 28 Scale 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将 PostgreSQL 源中的数据类型迁移到 SQL Server 目标,bit值不一致的数据类型。作为解决办法,请使用VARCHAR(1)列的数据类型(或有AmazonDMS 创建表)。然后,让下游处理将“F”视为 False,将“T”视为 True。

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

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

  • 如果您的源是本地或 Amazon EC2 实例上的 PostgreSQL 数据库,请确保源终端节点上已安装 test_decoding 输出插件。您可以在 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不支持复制具有使用 coalesce 函数创建的唯一索引的表。

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

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

  • 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。