本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。
将 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 源数据库是自管理数据库,请参阅使用自管理 PostgreSQL 数据库作为 Amazon DMS 的源了解更多信息。
-
如果您的 PostgreSQL 源数据库由 Amazon RDS 管理,请参阅使用 Amazon 托管的 PostgreSQL 数据库作为 DMS 源了解更多信息。
-
-
创建符合所选 PostgreSQL 数据库配置的 PostgreSQL 源端点。
-
创建一项或一组任务来迁移您的表。
要创建 full-load-only 任务,无需进一步配置端点。
在创建更改数据捕获任务(仅 CDC,或者完全加载和 CDC 任务)之前,请参阅使用自管理 PostgreSQL 数据库作为 Amazon DMS 源启用 CDC或为与 Amazon DMS 配合使用的 Amazon 托管的 PostgreSQL 数据库实例启用 CDC。
主题
- 使用自管理 PostgreSQL 数据库作为 Amazon DMS 的源
- 使用 Amazon 托管的 PostgreSQL 数据库作为 DMS 源
- 使用逻辑复制启用更改数据捕获 (CDC)
- 使用本机 CDC 开始点设置 PostgreSQL 源的 CDC 加载
- 使用 Amazon DMS 从 PostgreSQL 迁移到 PostgreSQL。
- 从 PostgreSQL 源数据库中删除 Amazon DMS 项目
- 将 PostgreSQL 数据库作为 DMS 源时的额外配置设置
- 使用 P MapBooleanAsBoolean ostgreSQL 端点设置
- 使用 PostgreSQL 作为 DMS 源时的端点设置和额外连接属性 (ECA)
- 将 PostgreSQL 数据库作为 DMS 源的限制
- PostgreSQL 的源数据类型
使用自管理 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_superuser
和rds_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 数据库实例启用逻辑复制
-
将 PostgreSQL 数据库实例的 Amazon 主用户账户作为 PostgreSQL 源端点的用户账户。主用户账户具有允许它设置 CDC 所需的角色。
如果您使用主用户账户之外的账户,请确保从要使用的账户的主账户创建多个对象。有关更多信息,请参见 不使用主用户账户迁移 Amazon RDS for PostgreSQL 数据库。
-
在数据库集群参数组中将
rds.logical_replication
参数设置为 1。此静态参数要求重启数据库实例才能生效。在应用该参数期间,Amazon DMS 设置wal_level
、max_wal_senders
、max_replication_slots
和max_connections
参数。这些参数更改可以增加预写日志 (WAL) 生成,因此,只有在您使用逻辑复制槽时才设置rds.logical_replication
。 -
wal_sender_timeout
参数会终止处于不活动状态的时间超过指定毫秒数的复制连接。Amazon 托管的 PostgreSQL 数据库的默认值为 30000 毫秒(30 秒)。将此值设置为 0(零)会禁用超时机制,这是 DMS 的有效设置。将
wal_sender_timeout
设置为非零值时,执行 CDC 的 DMS 任务至少需要 10000 毫秒(10 秒),如果此值介于 0 和 10000 之间,则会失败。将此值保持至少 5 分钟,以免在 DMS 复制实例执行多可用区失效转移期间造成延迟。 -
确保数据库集群参数组中
max_worker_processes
参数的值大于或等于max_logical_replication_workers
、autovacuum_max_workers
和max_parallel_workers
的总组合值。大量后台工作进程可能会影响小型实例上的应用程序工作负载。因此,如果为max_worker_processes
设置的值高于默认值,请监控数据库的性能。
不使用主用户账户迁移 Amazon RDS for PostgreSQL 数据库
在某些情况下,您可能不会将主用户账户用于将作为源的 Amazon RDS PostgreSQL 数据库实例。在这些情况下,您需要创建多个对象来捕获数据定义语言 (DDL) 事件。您可以在主用户账户之外的账户中创建这些对象,然后在主用户账户中创建触发器。
注意
如果在源端点上将 captureDDLs
端点设置为 false
,您不需要在源数据库上创建以下表和触发器。
使用以下过程创建这些对象。
创建对象
-
选择要在其中创建对象的架构。默认架构为
public
。确保架构存在并且可由
账户访问。OtherThanMaster
-
使用除主账户之外的用户账户(此处为
账户)登录 PostgreSQL 数据库实例。OtherThanMaster
-
运行以下命令以创建表
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 ); -
运行以下命令以创建函数
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 intoobjects_schema
.awsdms_ddl_audit values ( default,current_timestamp,current_user,cast(TXID_CURRENT()as varchar(16)),tg_tag,0,'',current_schema,_qry ); delete fromobjects_schema
.awsdms_ddl_audit; end if; END; $$; -
注销
账户并使用分配了OtherThanMaster
rds_superuser
角色的账户登录。 -
运行以下命令以创建事件触发器
awsdms_intercept_ddl
。CREATE EVENT TRIGGER awsdms_intercept_ddl ON ddl_command_end EXECUTE PROCEDURE
objects_schema
.awsdms_intercept_ddl(); -
确保访问这些事件的所有用户和角色都具有必要的 DDL 权限。例如:
grant all on public.awsdms_ddl_audit to public; grant all on public.awsdms_ddl_audit_c_key_seq to public;
在完成前面的过程后,可以使用
账户创建 Amazon DMS 源终端节点。OtherThanMaster
注意
这些事件由 CREATE TABLE
、ALTER
TABLE
和 DROP 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 源数据库上为 CDC 启用逻辑复制的信息,请参阅使用自管理 PostgreSQL 数据库作为 Amazon DMS 源启用 CDC。
-
有关在 Amazon 托管的 PostgreSQL 源数据库上为 CDC 启用逻辑复制的信息,请参阅为与 Amazon DMS 配合使用的 Amazon 托管的 PostgreSQL 数据库实例启用 CDC。
在 PostgreSQL 源数据库上启用逻辑复制后,请使用以下步骤配置用于 DMS 的 pglogical。
在使用 Amazon DMS 的 PostgreSQL 源数据库上使用 pglogical 插件进行逻辑复制
-
在 PostgreSQL 源数据库上创建一个 pglogical 扩展:
-
设置正确的参数:
-
对于自管理 PostgreSQL 数据库,请设置数据库参数
shared_preload_libraries= 'pglogical'
。 -
对于 Amazon RDS 上的 PostgreSQL 和 Amazon Aurora PostgreSQL 兼容版数据库,请在同一个 RDS 参数组中将参数
shared_preload_libraries
设置为pglogical
。
-
-
重启您的 PostgreSQL 源数据库。
-
在 PostgreSQL 数据库上,运行此命令
create extension pglogical;
。
-
-
运行以下命令验证是否已成功安装 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 加载
-
确定您要用作开始点的更早复制任务(父任务)所使用的逻辑复制槽。然后,查询源数据库上的
pg_replication_slots
视图,以确保此槽没有任何活动的连接。如果有,请先予以解决并关闭它们,然后再继续。对于以下步骤,假定您的逻辑复制槽为
abc1d2efghijk_34567890_z0yx98w7_6v54_32ut_1srq_1a2b34c5d67ef
。 -
创建一个新的源终端节点,其中包含以下额外连接属性设置。
slotName=abc1d2efghijk_34567890_z0yx98w7_6v54_32ut_1srq_1a2b34c5d67ef;
-
使用 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-mappings
和replication-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 任务中创建的新复制槽
-
创建复制槽,如下所示:
SELECT * FROM pg_create_logical_replication_slot('
replication_slot_name
', 'pglogical'); -
数据库创建复制槽后,将获取并记下此槽的 restart_lsn 和 confirmed_flush_lsn 值:
select * from pg_replication_slots where slot_name like 'replication_slot_name';
请注意,在复制槽之后创建的 CDC 任务的本机 CDC 开始位置不能早于 confirmed_flush_lsn 值。
有关 restart_lsn 和 confirmed_flush_lsn 值的信息,请参阅 pg_replication_slots
-
创建一个 pglogical 节点。
SELECT pglogical.create_node(node_name := '
node_name
', dsn := 'your_dsn_name
'); -
使用
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); -
向复制集添加表。
SELECT pglogical.replication_set_add_table('
replication_slot_name
', 'schemaname.tablename', true); SELECT pglogical.replication_set_add_table('ireplication_slot_name
', 'schemaname.tablename', true); -
创建源端点时,请设置以下额外连接属性 (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 '{"
JSON 语法的EndpointSetting"
:
"value"
, ...
}'create-endpoint
Amazon CLI命令来指定终端节点设置。
下表显示了可以将 PostgreSQL 用作源的端点设置和 ECA。
属性名称 | 描述 |
---|---|
|
为捕获 DDL 事件,在任务开始时,Amazon DMS 会在 PostgreSQL 数据库中创建各种项目。稍后可以删除这些项目,如从 PostgreSQL 源数据库中删除 Amazon DMS 项目中所述。 如果此值设置为 false,您无需在源数据库上创建表或触发器。 捕获流式处理的 DDL 事件。 默认值: 有效值:true/false 例如: |
|
用于控制如何复制具有重复日志序列号 (LSN) 的整体事务。当此参数为 默认值: 有效值:false/true 例如: |
|
设置在其中创建操作 DDL 数据库项目的架构。 默认值:public 有效值:字符串 例如: |
|
设置 PostgreSQL 实例的客户端语句超时 (以秒为单位)。默认值为 60 秒。 例如: |
|
在设置为 如果任务设置为“受限 LOB 模式”并且该选项设置为 true,任务将失败,而不是截断 LOB 数据。 默认值:false 有效值:布尔值 例如: |
|
此额外连接属性 (ECA) 用于设置光标在完全加载操作期间将提取的行数。根据复制实例中可用的资源,您可以将此值调高或调低。 默认值: 有效值:数字 ECA 示例: |
|
设置 WAL 检测信号频率(以分钟为单位)。 默认值: 有效值:数字 例如: |
|
设置在其中创建检测信号构件的架构。 默认值: 有效值:字符串 例如: |
|
默认情况下,Amazon DMS 将 JSONB 映射到 NCLOB。你可以指定 例如: |
|
默认情况下,Amazon DMS 将 VARCHAR 映射到 WSTRING。您可以指定
例如: |
|
此参数将具有无界 NUMERIC 数据类型的列视为 STRING,以便在不损失数值精度的前提下成功迁移。此参数仅用于从 PostgreSQL 源复制到 PostgreSQL 目标或与 PostgreSQL 兼容的数据库。 默认值: 有效值: 例如: 使用此参数可能会导致某些复制性能下降,因为需要从数字转换为字符串,然后再转换回数字。DMS 版本 3.4.4 及更高版本支持使用此参数 注意只能同时在 PostgreSQL 源端点和目标端点中使用 在 CDC 期间,在源 PostgreSQL 端点上使用 请勿将 |
|
指定用于创建副本槽的插件。 有效值: 例如: |
|
为 PostgreSQL 源实例的 CDC 加载设置先前创建的逻辑复制槽的名称。 与 Amazon DMS API 有关设置 有效值:字符串 例如: |
|
此额外连接属性 (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 不复制由于分区或子分区操作(
ADD
、DROP
或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 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。