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

将 PostgreSQL 数据库作为 AWS DMS 源

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

  • 本地数据库

  • EC2 实例上的数据库

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

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

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

  • AWS DMS 版本 3.3.3 和更高版本中支持将 PostgreSQL 版本 12.x 作为源。

  • 仅 AWS DMS 版本 3.3.1 和更高版本中支持将 PostgreSQL 版本 11.x 作为源。在任意 DMS 版本中,您可以使用 PostgreSQL 版本 9.4 及更高版本(版本 9.x)和 10.x 作为源。

  • PostgreSQL 版本 10.x 包含对以前的版本中的函数名称和文件夹名称的大量更改。

    在某些情况下,您可以使用 PostgreSQL 10.x 版数据库作为源并使用早于 3.3.1 版的 AWS DMS。在这些情况下,有关为 AWS DMS 准备数据库作为源的信息,请参阅将 PostgreSQL 版本 10.x 作为 AWS DMS 的源

    注意

    如果您使用 PostgreSQL 10.x 数据库作为源并使用 AWS DMS 版本 3.3.1 或更高版本,请勿 为早期 AWS DMS 版本所需的源 10.x 数据库执行这些准备操作。

有关使用受支持 PostgreSQL 源版本的 AWS DMS 版本要求摘要, 请参阅下表。

PostgreSQL 源版本

要使用的 AWS DMS 版本

9.x

使用任何可用 AWS DMS 版本。

10.x

如果您使用早于 3.3.1 的 AWS DMS 版本,请使用将 PostgreSQL 版本 10.x 作为 AWS DMS 的源中介绍的包装函数准备 PostgreSQL 源。

如果您使用 AWS DMS 版本 3.3.1 或更高版本,请勿创建这些包装函数。您可以使用 PostgreSQL 源且无需任何额外的准备工作。

11.x

使用 AWS DMS 版本 3.3.1。

12.x

使用 AWS DMS 版本 3.3.3。

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

对于从 PostgreSQL 数据库到 AWS 上的 PostgreSQL 数据库的同构迁移,会出现以下情况:

  • 源上的 JSONB 列迁移到目标上的 JSONB 列。

  • JSON 列作为目标上的 JSON 列迁移。

  • HSTORE 列作为目标上的 HSTORE 列迁移。

对于将 PostgreSQL 作为源并将其他数据库引擎作为目标的异构迁移,情况有所不同。在这种情况下,JSONB、JSON 和 HSTORE 列将转换为 AWS DMS 中间类型的 NCLOB,然后转换为目标上的对应 NCLOB 列类型。这种情况下,AWS DMS 将 JSONB 数据视为 LOB 列。在阶段的完全加载阶段,目标列必须可为 null。

AWS DMS 对具有主键的 PostgreSQL 表支持更改数据捕获 (CDC)。如果某个表没有主键,提前写入日志 (WAL) 将不包含数据库行的前映像并且 AWS DMS 无法更新该表。

当数据库实例配置为使用逻辑复制时,AWS DMS 支持在 Amazon RDS PostgreSQL 数据库上执行 CDC。Amazon RDS 支持逻辑复制 PostgreSQL 数据库实例版本 9.4.9 及更高版本,以及 9.5.4 及更高版本。Amazon RDS 还支持逻辑复制兼容 PostgreSQL 10.6 的 Amazon Aurora 数据库实例版本 2.2.0 和 2.2.1。

有关使用 PostgreSQL 数据库和 AWS DMS 的其他详细信息,请参阅以下章节。

使用 AWS DMS 从 PostgreSQL 迁移到 PostgreSQL。

对于异构迁移,当您从 PostgreSQL 之外的数据库引擎迁移到 PostgreSQL 数据库时,AWS DMS 通常会是可以利用的最佳迁移工具。但是,对于同构迁移,当您从 PostgreSQL 数据库迁移到 PostgreSQL 数据库时,本机工具效率更高。

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

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

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

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

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

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

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

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

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

下表显示了源 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
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 空间数据类型
注意

如果 PostgreSQL NUMERIC(p,s) 数据类型未指定任何精度和小数位数,则默认情况下,AWS DMS 使用 28 位精度和 6 位小数 NUMERIC(28,6)。例如,源中的值 0.611111104488373 在 PostgreSQL 目标中将转换为 0.611111。

迁移 PostGIS 空间数据类型

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

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

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

  • POINT

  • LINESTRING

  • POLYGON

  • MULTIPOINT

  • MULTILINESTRING

  • MULTIPOLYGON

  • GEOMETRYCOLLECTION

将 PostgreSQL 数据库作为 AWS DMS 源的先决条件

要将 PostgreSQL 数据库作为 AWS DMS 源,请执行以下操作:

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

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

  • 将 AWS 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 代表基于主机的身份验证。) 文件通常存储在数据库集群的数据目录中。

  • postgresql.conf 配置文件中设置以下参数和值:

    • Set wal_level = logical

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

      max_replication_slots 值应根据您需要运行的任务数进行设置。例如,要运行五个任务,您需要设置至少五个时隙。在任务启动时时隙立即打开,即使任务不再运行仍保持打开。您需要手动删除打开的时隙。

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

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

    • Set wal_sender_timeout =0

      wal_sender_timeout 参数会终止处于不活动状态的时间超过指定毫秒数的复制连接。默认值为 60 秒,但我们建议您将该参数设置为零,这样会禁用超时机制。

    注意

    某些参数只能在服务器启动时设置;在重新启动服务器之前,对配置文件中的参数条目的任何更改都将被忽略。有关更多信息,请参阅 PostgreSQL 数据库文档。

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

将 PostgreSQL 数据库作为 AWS DMS 源时的安全要求

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

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

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

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

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

  • 不支持包含时区类型列的时间戳。

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

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

  • AWS DMS 在 Amazon RDS for PostgreSQL 上支持完全加载和更改处理。有关如何准备 PostgreSQL 数据库实例以及将其设置为使用 CDC 的信息,请参阅设置将 Amazon RDS PostgreSQL 数据库实例作为源

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

  • 在大多数情况下,AWS DMS 支持表的 CREATE、ALTER 和 DROP DDL 语句的更改处理。如果表保存在内部函数、过程正文块或其他嵌套结构中,则 AWS 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 数据类型迁移到 SQLServer 目标。作为一种解决方法,可以使用列的 VARCHAR(1) 数据类型预先创建该表(或者让 AWS DMS 创建该表),然后让下游处理将“F”视为 False 并将“T”视为 True。

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

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

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

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

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

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

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

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

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

注意

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

注意

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

设置将 Amazon RDS PostgreSQL 数据库实例作为源

您可以将 Amazon RDS for PostgreSQL 数据库实例或只读副本作为 AWS DMS 的源。您可以将数据库实例用于满载任务,也可以将其用于更改数据捕获 (CDC) 以进行持续复制。只读副本只能用于满载任务,而不能用于 CDC。

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

如果您没有为数据库实例使用主用户账户,则必须从主用户账户为您要使用的账户创建多个对象。有关创建所需对象的信息,请参阅在不使用主用户账户的情况下迁移 Amazon RDS for PostgreSQL 数据库

将 CDC 用于 RDS 的 PostgreSQL 数据库实例

在 Amazon RDS for PostgreSQL 数据库实例的数据库迁移期间,您可以使用 PostgreSQL 的本机逻辑复制功能启用 CDC。这种方法可减少停机时间,并确保目标数据库与源 PostgreSQL 数据库同步。Amazon RDS 支持 PostgreSQL 数据库实例版本 9.4.9 和更高版本,以及 9.5.4 和更高版本的逻辑复制。

注意

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

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

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

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

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

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

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

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

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

    注意

    在版本 AWS DMS 3.1.0 和更高版本中,可以将本机 CDC 起点与 PostgresQL 一起作为源。

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

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

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

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

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

    slotName=abc1d2efghijk_34567890_z0yx98w7_6v54_32ut_1srq_1a2b34c5d67ef;
  3. 使用 AWS DMS API 或 CLI 创建新的仅 CDC 任务。例如,通过使用 CLI,您可以运行以下 create-replication-task 命令。

    AWS 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 任务运行时,如果指定的逻辑复制槽不存在,或者未使用 cdc-start-position 的有效设置创建任务,则 AWS DMS 会引发错误。

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

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

注意

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

使用以下过程创建这些对象。在该过程中,主账户以外的用户账户称为 NoPriv 账户。

创建对象

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

  2. 使用 NoPriv 账户登录到 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') 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 账户创建 AWS DMS 源终端节点。

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

要捕获 DDL 事件,在开始执行迁移任务时,AWS 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 数据库作为 AWS DMS 源时的额外配置设置

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

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

  • 您可以覆盖连接字符串参数。如果您需要执行以下任一操作,请选择该选项:

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

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

  • 通过 PostgreSQL 版本 9.4 及更高版本中的表级参数 REPLICATE IDENTITY,您可以控制写入 WAL(提前写入日志)的信息,这些信息标识要更新或删除的行。REPLICATE IDENTITY FULL 记录行中所有列的旧值。将 REPLICATE IDENTITY FULL 用于每个表时请慎重,因为 FULL 会生成额外的 WAL 量(可能是不必要的)。

将 PostgreSQL 版本 10.x 作为 AWS DMS 的源

PostgreSQL 版本 10.x 数据库包含对以前的 PostgreSQL 版本中的函数名称和文件夹名称的大量更改。在使用早于 3.3.1 的 AWS DMS 版本时,这些更改使某些迁移操作无法向后兼容。

注意

如果您在 AWS DMS 3.3.1 或更高版本中使用 PostgreSQL 10.x 数据库作为源,请勿 执行下述准备操作。您可以使用 PostgreSQL 源且无需任何额外的准备工作。

由于大多数名称更改是表面的,因此,AWS DMS 已创建让 AWS DMS 与 PostgreSQL 版本 10.x 结合使用的包装函数。包装函数的优先级高于 pg_catalog 中的函数。此外,我们确保了现有架构的架构可见性不会更改,从而不会覆盖任何其他系统目录函数 (如用户定义的函数)。

要在执行任何迁移任务之前使用这些包装函数,请使用与创建源终端节点时所用相同的 AWS DMS 用户帐户 (user_name)。要定义这些包装函数并将其与此账户关联,请在源 PostgreSQL 数据库上运行以下 SQL 代码。

BEGIN; CREATE SCHEMA IF NOT EXISTS fnRenames; CREATE OR REPLACE FUNCTION fnRenames.pg_switch_xlog() RETURNS pg_lsn AS $$ SELECT pg_switch_wal(); $$ LANGUAGE SQL; CREATE OR REPLACE FUNCTION fnRenames.pg_xlog_replay_pause() RETURNS VOID AS $$ SELECT pg_wal_replay_pause(); $$ LANGUAGE SQL; CREATE OR REPLACE FUNCTION fnRenames.pg_xlog_replay_resume() RETURNS VOID AS $$ SELECT pg_wal_replay_resume(); $$ LANGUAGE SQL; CREATE OR REPLACE FUNCTION fnRenames.pg_current_xlog_location() RETURNS pg_lsn AS $$ SELECT pg_current_wal_lsn(); $$ LANGUAGE SQL; CREATE OR REPLACE FUNCTION fnRenames.pg_is_xlog_replay_paused() RETURNS boolean AS $$ SELECT pg_is_wal_replay_paused(); $$ LANGUAGE SQL; CREATE OR REPLACE FUNCTION fnRenames.pg_xlogfile_name(lsn pg_lsn) RETURNS TEXT AS $$ SELECT pg_walfile_name(lsn); $$ LANGUAGE SQL; CREATE OR REPLACE FUNCTION fnRenames.pg_last_xlog_replay_location() RETURNS pg_lsn AS $$ SELECT pg_last_wal_replay_lsn(); $$ LANGUAGE SQL; CREATE OR REPLACE FUNCTION fnRenames.pg_last_xlog_receive_location() RETURNS pg_lsn AS $$ SELECT pg_last_wal_receive_lsn(); $$ LANGUAGE SQL; CREATE OR REPLACE FUNCTION fnRenames.pg_current_xlog_flush_location() RETURNS pg_lsn AS $$ SELECT pg_current_wal_flush_lsn(); $$ LANGUAGE SQL; CREATE OR REPLACE FUNCTION fnRenames.pg_current_xlog_insert_location() RETURNS pg_lsn AS $$ SELECT pg_current_wal_insert_lsn(); $$ LANGUAGE SQL; CREATE OR REPLACE FUNCTION fnRenames.pg_xlog_location_diff(lsn1 pg_lsn, lsn2 pg_lsn) RETURNS NUMERIC AS $$ SELECT pg_wal_lsn_diff(lsn1, lsn2); $$ LANGUAGE SQL; CREATE OR REPLACE FUNCTION fnRenames.pg_xlogfile_name_offset(lsn pg_lsn, OUT TEXT, OUT INTEGER) AS $$ SELECT pg_walfile_name_offset(lsn); $$ LANGUAGE SQL; CREATE OR REPLACE FUNCTION fnRenames.pg_create_logical_replication_slot(slot_name name, plugin name, temporary BOOLEAN DEFAULT FALSE, OUT slot_name name, OUT xlog_position pg_lsn) RETURNS RECORD AS $$ SELECT slot_name::NAME, lsn::pg_lsn FROM pg_catalog.pg_create_logical_replication_slot(slot_name, plugin, temporary); $$ LANGUAGE SQL; ALTER USER user_name SET search_path = fnRenames, pg_catalog, "$user", public; -- DROP SCHEMA fnRenames CASCADE; -- ALTER USER PG_User SET search_path TO DEFAULT; COMMIT;
注意

对早于 3.3.1 的 AWS DMS 版本,如果您不在源 PostgreSQL 10.x 数据库上运行此准备代码,则会出现如下所示错误。

2018-10-29T02:57:50 [SOURCE_CAPTURE ]E: RetCode: SQL_ERROR SqlState: 42703 NativeError: 1 Message: ERROR: column "xlog_position" does not exist;, No query has been executed with that handle [1022502] (ar_odbc_stmt.c:3647)

将 AWS DMS 版本升级到 3.3.1 或更高版本后,请按照以下步骤操作:

  1. 从您用于设置源 PostgreSQL 10.x 配置搜索路径的 ALTER USER 语句中删除 fnRenames 引用。

  2. 从 PostgreSQL 数据库中删除 fnRenames 架构。

如果您在升级后未按照这些步骤操作,则在访问 fnRenames 架构时,日志中将出现以下错误:

RetCode: SQL_ERROR SqlState: 42703 NativeError: 1 Message: ERROR: column "lsn" does not exist;

如果 AWS DMS 对数据库使用非主用户账户,则您还需要设置特定权限以使用源 PostgreSQL 10.x 数据库访问这些包装函数。要设置这些权限,请执行以下 grant 语句:

GRANT USAGE ON SCHEMA fnRenames TO dms_superuser; GRANT EXECUTE ON ALL FUNCTIONS IN SCHEMA fnRenames TO dms_superuser;

有关将非主用户帐户与源 PostgreSQL 10.x 数据库结合使用的更多信息,请参阅在不使用主用户账户的情况下迁移 Amazon RDS for PostgreSQL 数据库

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

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

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

属性名称 描述

captureDDLs

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

如果此值设置为 N,您无需在源数据库上创建表或触发器。有关更多信息,请参阅 在不使用主用户账户的情况下迁移 Amazon RDS for PostgreSQL 数据库

捕获流式处理的 DDL 事件。

默认值:Y

有效值:Y/N

示例:captureDDLs=Y;

ddlArtifactsSchema

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

默认值:public

有效值:String

示例:ddlArtifactsSchema=xyzddlschema;

failTasksOnLobTruncation

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

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

默认值:false

有效值:布尔值

示例:failTasksOnLobTruncation=true;

executeTimeout

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

示例:executeTimeout=100;

slotName

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

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

有关 DMS 如何使用逻辑复制槽开始 PostgreSQL 的 CDC 加载的更多信息,请参阅 将 CDC 用于 RDS 的 PostgreSQL 数据库实例。有关设置 CdcStartPosition 请求参数的更多信息,请参阅 确定 CDC 本机开始点。有关使用 CdcStartPosition 的更多信息,请参阅 AWS Database Migration Service API Reference 中的 CreateReplicationTaskStartReplicationTaskModifyReplicationTask API 操作的文档。

有效值:String

示例:slotName=abc1d2efghijk_34567890_z0yx98w7_6v54_32ut_1srq_1a2b34c5d67ef;

PostgreSQL 的源数据类型

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

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

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

PostgreSQL 数据类型

AWS 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

TIMESTAMP

TIMESTAMP (z)

TIMESTAMP

TIMESTAMP(带时区)

不支持

DATE

DATE

TIME

TIME

TIME (z)

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 列大小将影响 PostgreSQL LOB 数据类型到 AWS DMS 数据类型的转换。为此,请对以下 AWS DMS 数据类型执行下列步骤:

  • BLOB – 在创建任务时,将 Limit LOB size to (将 LOB 大小限制为) 设置为 Maximum LOB size (KB) (最大 LOB 大小 (KB)) 值。

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

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