

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

# 使用 PostgreSQL 数据库作为源 AWS DMS
<a name="CHAP_Source.PostgreSQL"></a>

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

有关支持作为源代码的 PostgreSQL 版本的信息 AWS DMS ，请参阅。[的来源 AWS DMS](CHAP_Introduction.Sources.md)

AWS DMS 对于以下类型的数据库，支持 PostgreSQL：
+  本地数据库
+ Amazon EC2 实例上的数据库
+ Amazon RDS 数据库实例上的数据库
+ 基于 Amazon Aurora PostgreSQL 兼容版的数据库实例上的数据库
+ 基于 Amazon Aurora PostgreSQL 兼容无服务器版的数据库实例上的数据库

**注意**  
DMS 仅支持将 Amazon Aurora PostgreSQL – Serverless V1 作为完全加载的源。但您可以使用 Amazon Aurora PostgreSQL – Serverless V2 作为完全加载、完全加载 \$1 CDC 和仅限 CDC 的任务的源。

可以使用安全套接字层（SSL）加密 PostgreSQL 端点与复制实例之间的连接。有关将 SSL 用于 PostgreSQL 终端节点的更多信息，请参阅[将 SSL 与 AWS Database Migration Service](CHAP_Security.SSL.md)。

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

要将 PostgreSQL 数据库配置为 AWS DMS 源端点，请执行以下操作：
+ 创建具有相应权限的 PostgreSQL 用户，以 AWS DMS 提供对您的 PostgreSQL 源数据库的访问权限。
**注意**  
如果您的 PostgreSQL 源数据库是自管理数据库，请参阅[使用自我管理的 PostgreSQL 数据库作为源代码 AWS DMS](#CHAP_Source.PostgreSQL.Prerequisites)了解更多信息。
如果您的 PostgreSQL 源数据库由 Amazon RDS 管理，请参阅[使用 AWS托管的 PostgreSQL 数据库作为 DMS 源](#CHAP_Source.PostgreSQL.RDSPostgreSQL)了解更多信息。
+ 创建符合所选 PostgreSQL 数据库配置的 PostgreSQL 源端点。
+ 创建一项或一组任务来迁移您的表。

  要创建 full-load-only任务，无需进一步配置端点。

  在创建更改数据捕获任务（仅 CDC，或者完全加载和 CDC 任务）之前，请参阅[使用自我管理的 PostgreSQL 数据库作为源启用 CDC AWS DMS](#CHAP_Source.PostgreSQL.Prerequisites.CDC)或[使用 AWS托管的 PostgreSQL 数据库实例启用 CDC AWS DMS](#CHAP_Source.PostgreSQL.RDSPostgreSQL.CDC)。

**Topics**
+ [使用自我管理的 PostgreSQL 数据库作为源代码 AWS DMS](#CHAP_Source.PostgreSQL.Prerequisites)
+ [使用 AWS托管的 PostgreSQL 数据库作为 DMS 源](#CHAP_Source.PostgreSQL.RDSPostgreSQL)
+ [使用逻辑复制启用更改数据捕获（CDC）](#CHAP_Source.PostgreSQL.Security)
+ [使用本机 CDC 开始点设置 PostgreSQL 源的 CDC 加载](#CHAP_Source.PostgreSQL.v10)
+ [使用从 PostgreSQL 迁移到 PostgreSQL AWS DMS](#CHAP_Source.PostgreSQL.Homogeneous)
+ [使用 Babelfish 为亚马逊 Aurora PostgreSQL 迁移 AWS DMS](#CHAP_Source.PostgreSQL.Babelfish)
+ [从 PostgreSQL 源数据库中移除 AWS DMS 构件](#CHAP_Source.PostgreSQL.CleanUp)
+ [将 PostgreSQL 数据库作为 DMS 源时的额外配置设置](#CHAP_Source.PostgreSQL.Advanced)
+ [只读副本作为 PostgreSQL 的源](#CHAP_Source.PostgreSQL.ReadReplica)
+ [使用 `MapBooleanAsBoolean` PostgreSQL 端点设置](#CHAP_Source.PostgreSQL.ConnectionAttrib.Endpointsetting)
+ [使用 PostgreSQL 作为 DMS 源时的端点设置和额外连接属性 (ECAs)](#CHAP_Source.PostgreSQL.ConnectionAttrib)
+ [将 PostgreSQL 数据库作为 DMS 源的限制](#CHAP_Source.PostgreSQL.Limitations)
+ [PostgreSQL 的源数据类型](#CHAP_Source-PostgreSQL-DataTypes)

## 使用自我管理的 PostgreSQL 数据库作为源代码 AWS DMS
<a name="CHAP_Source.PostgreSQL.Prerequisites"></a>

使用自管理的 PostgreSQL 数据库作为源，您可以将数据迁移到另一个 PostgreSQL 数据库，也可以将数据迁移到支持的其他目标数据库。 AWS DMS数据库源可以是在 Amazon EC2 实例上运行的本地数据库，也可以是自管理引擎。您可以将数据库实例用于完全加载任务，也可以用于更改数据捕获（CDC）任务。

### 使用自行管理的 PostgreSQL 数据库作为源的先决条件 AWS DMS
<a name="CHAP_Source.PostgreSQL.Prerequisites.SelfManaged"></a>

在从自管理 PostgreSQL 源数据库迁移数据之前，请执行以下操作：
+ 请确保使用版本为 9.4.x 或更高版本的 PostgreSQL 数据库。
+ 对于完全加载加上 CDC 任务或仅限 CDC 任务，请向为 PostgreSQL 源数据库指定的用户账户授予超级用户权限。该用户账户访问源中特定于复制的函数需要超级用户权限。DMS 用户账户需要所有列的 SELECT 权限才能成功迁移表。如果缺少对列的权限，DMS 会使用常规 DMS 数据类型映射创建目标表，这会导致元数据差异和任务失败。
+ 将 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 代表基于主机的身份验证。） 文件通常存储在数据库集群的数据目录中。
+ 如果您要使用将数据库配置为逻辑复制源， AWS DMS 请参阅 [使用自我管理的 PostgreSQL 数据库作为源启用 CDC AWS DMS](#CHAP_Source.PostgreSQL.Prerequisites.CDC)

**注意**  
有些 AWS DMS 事务会闲置一段时间，然后才会让 DMS 引擎再次使用它们。在 PostgreSQL 版本 9.6 及更高版本中使用参数 `idle_in_transaction_session_timeout`，能够导致空闲事务超时并失败。当您使用 AWS DMS时，请勿结束空闲事务。

### 使用自我管理的 PostgreSQL 数据库作为源启用 CDC AWS DMS
<a name="CHAP_Source.PostgreSQL.Prerequisites.CDC"></a>

AWS 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 文档](https://www.postgresql.org/docs/current/intro-whatis.html)。

有关启用 CDC 的更多信息，请参阅[使用逻辑复制启用更改数据捕获（CDC）](#CHAP_Source.PostgreSQL.Security)。

## 使用 AWS托管的 PostgreSQL 数据库作为 DMS 源
<a name="CHAP_Source.PostgreSQL.RDSPostgreSQL"></a>

您可以使用 AWS托管的 PostgreSQL 数据库实例作为源。 AWS DMS您可以使用 AWS托管的 PostgreSQL 源执行完全加载任务和更改数据捕获（CDC）任务。

### 使用 AWS托管的 PostgreSQL 数据库作为 DMS 源的先决条件
<a name="CHAP_Source.PostgreSQL.RDSPostgreSQL.Prerequisites"></a>

从 AWS托管的 PostgreSQL 源数据库迁移数据之前，请执行以下操作：
+ 我们建议您使用具有 PostgreSQL 数据库实例所需最低权限的 AWS 用户账户作为 PostgreSQL 源终端节点的用户账户。 AWS DMS建议不要使用主账户。该账户必须具有 `rds_superuser` 和 `rds_replication` 角色。`rds_replication` 角色可授予管理逻辑时隙和使用逻辑时隙流式处理数据的权限。

  请务必使用您所用账户的主用户账户创建多个对象。有关创建这些项目的信息，请参阅[不使用主用户账户迁移 Amazon RDS for PostgreSQL 数据库](#CHAP_Source.PostgreSQL.RDSPostgreSQL.NonMasterUser)。
+ 如果源数据库位于虚拟私有云（VPC）中，请选择一个 VPC 安全组，该安全组提供对数据库所在的数据库实例的访问权限。这是 DMS 复制实例成功连接到源数据库实例所必需的。当数据库和 DMS 复制实例位于同一 VPC 中时，将相应的安全组添加到其自己的入站规则中。

**注意**  
有些 AWS DMS 事务会闲置一段时间，然后才会让 DMS 引擎再次使用它们。在 PostgreSQL 版本 9.6 及更高版本中使用参数 `idle_in_transaction_session_timeout`，能够导致空闲事务超时并失败。当您使用 AWS DMS时，请勿结束空闲事务。

### 使用 AWS托管的 PostgreSQL 数据库实例启用 CDC AWS DMS
<a name="CHAP_Source.PostgreSQL.RDSPostgreSQL.CDC"></a>

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


|  PostgreSQL 版本  |  AWS DMS 满载支持   |  AWS 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. 使用 Po AWS stgreSQL 数据库实例的主用户账户作为 PostgreSQL 源终端节点的用户账户。主用户账户具有允许它设置 CDC 所需的角色。

   如果您使用主用户账户之外的账户，请确保从要使用的账户的主账户创建多个对象。有关更多信息，请参阅 [不使用主用户账户迁移 Amazon RDS for PostgreSQL 数据库](#CHAP_Source.PostgreSQL.RDSPostgreSQL.NonMasterUser)。

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

1. `wal_sender_timeout` 参数会终止处于不活动状态的时间超过指定毫秒数的复制连接。 AWS由托管的 PostgreSQL 数据库的默认值为 30000 毫秒（30 秒）。将此值设置为 0（零）会禁用超时机制，这是 DMS 的有效设置。

   将 `wal_sender_timeout` 设置为非零值时，执行 CDC 的 DMS 任务至少需要 10000 毫秒（10 秒），如果此值介于 0 和 10000 之间，则会失败。将此值保持至少 5 分钟，以免在 DMS 复制实例执行多可用区失效转移期间造成延迟。

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

1.  使用 Aurora PostgreSQL 作为 CDC 的源时，请将 `synchronous_commit` 设置为 `ON`。

**将 PostgreSQL 多可用区数据库集群只读副本用于 CDC（正在进行的复制）**

1. 在数据库集群参数组中将 `rds.logical_replication` 和 `sync_replication_slots` 参数设置为 1。此静态参数要求重启数据库实例才能生效。

1. 运行以下命令在 Writer 上创建 `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
   );
   ```

1. 运行以下命令以创建 `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;
   $$;
   ```

1. 运行以下命令以创建 `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;
   ```

1. 在 Writer 上创建复制槽位：

   ```
   SELECT * FROM pg_create_logical_replication_slot('dms_read_replica_slot', 'test_decoding', false, true);
   ```

1. 确保 Reader 上的复制槽位可用：

   ```
   select * from pg_catalog.pg_replication_slots where slot_name = 'dms_read_replica_slot';
   
   slot_name            |plugin       |slot_type|datoid|database|temporary|active|active_pid|xmin|catalog_xmin|restart_lsn|confirmed_flush_lsn|wal_status|safe_wal_size|two_phase|inactive_since               |conflicting|invalidation_reason|failover|synced|
   ---------------------+-------------+---------+------+--------+---------+------+----------+----+------------+-----------+-------------------+----------+-------------+---------+-----------------------------+-----------+-------------------+--------+------+
   dms_read_replica_slot|test_decoding|logical  |     5|postgres|false    |false |          |    |3559        |0/180011B8 |0/180011F0         |reserved  |             |true     |2025-02-10 15:45:04.083 +0100|false      |                   |false   |false |
   ```

1. 为只读副本创建 DMS 源端点并通过额外连接属性设置逻辑复制槽位名称：

   ```
   slotName=dms_read_replica_slot;
   ```

1. 创建并启动 CDC/FL\$1CDC 任务。
**注意**  
对于 CDC/FL\$1CDC 迁移，DMS 将任务开始时间视为 CDC 起始位置。复制槽 LSNs 中的所有较旧版本都将被忽略。

### 不使用主用户账户迁移 Amazon RDS for PostgreSQL 数据库
<a name="CHAP_Source.PostgreSQL.RDSPostgreSQL.NonMasterUser"></a>

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

**注意**  
如果在源端点上将 `CaptureDdls` 端点设置为 `false`，您不需要在源数据库上创建以下表和触发器。

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

**创建对象**

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

1. 使用除主账户之外的用户账户（此处为 `OtherThanMaster` 账户）登录 PostgreSQL 数据库实例。

1. 运行以下命令以创建表 `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
   );
   ```

1. 运行以下命令以创建函数 `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;
   $$;
   ```

1. 注销 `OtherThanMaster` 账户并使用分配了 `rds_superuser` 角色的账户登录。

1. 运行以下命令以创建事件触发器 `awsdms_intercept_ddl`。

   ```
   CREATE EVENT TRIGGER awsdms_intercept_ddl ON ddl_command_end 
   EXECUTE PROCEDURE objects_schema.awsdms_intercept_ddl();
   ```

1. 确保访问这些事件的所有用户和角色都具有必要的 DDL 权限。例如：

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

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

**注意**  
这些事件由 `CREATE TABLE`、`ALTER TABLE` 和 `DROP TABLE` 语句触发。

## 使用逻辑复制启用更改数据捕获（CDC）
<a name="CHAP_Source.PostgreSQL.Security"></a>

在 PostgreSQL 源的数据库迁移期间，您可以使用 PostgreSQL 的本机逻辑复制功能启用更改数据捕获（CDC）。您可以将此功能与自管理 PostgreSQL 数据库实例以及 Amazon RDS for PostgreSQL SQL 数据库实例一起使用。这种方法可减少停机时间，并确保目标数据库与源 PostgreSQL 数据库同步。

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

**注意**  
逻辑解码插件支持 REPLICA IDENTITY FULL，但 pglogical 插件不支持。有关更多信息，请参阅 [pglogical 文档](https://github.com/2ndQuadrant/pglogical#primary-key-or-replica-identity-required)。

对于满载任务以及仅限 CDC 和 CDC 的任务， AWS DMS 使用逻辑复制槽保留 WAL 日志以进行复制，直到日志被解码。对于完全加载和 CDC 任务或仅限 CDC 的任务，在重启（而非恢复）时，系统会重新创建复制槽。

**注意**  
对于逻辑解码，DMS 使用 test\$1decoding 或 pglogical 插件。如果 pglogical 插件在源 PostgreSQL 数据库上可用，DMS 会使用 pglogical 创建复制插槽，否则使用 test\$1decoding 插件。有关 test\$1decoding 插件的更多信息，请参阅 [PostgreSQL 文档](https://www.postgresql.org/docs/9.4/test-decoding.html)。  
如果将数据库参数 `max_slot_wal_keep_size` 设置为非默认值，并且复制槽的 `restart_lsn` 落后于当前 LSN 的大小超过此大小，DMS 任务会因为删除了所需的 WAL 文件而失败。

### 配置 pglogical 插件
<a name="CHAP_Source.PostgreSQL.Security.Pglogical"></a>

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 或更高版本  |  是  | 

在配置 pglogical 以与一起使用之前 AWS DMS，请先在 PostgreSQL 源数据库上启用更改数据捕获 (CDC) 的逻辑复制。
+ 有关在*自管理* PostgreSQL 源数据库上为 CDC 启用逻辑复制的信息，请参阅[使用自我管理的 PostgreSQL 数据库作为源启用 CDC AWS DMS](#CHAP_Source.PostgreSQL.Prerequisites.CDC)。
+ 有关在 *AWS托管的* PostgreSQL 源数据库上为 CDC 启用逻辑复制的信息，请参阅[使用 AWS托管的 PostgreSQL 数据库实例启用 CDC AWS DMS](#CHAP_Source.PostgreSQL.RDSPostgreSQL.CDC)。

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

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

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

   1. 设置正确的参数：
      + 对于自管理 PostgreSQL 数据库，请设置数据库参数 `shared_preload_libraries= 'pglogical'`。
      + 对于 Amazon RDS 上的 PostgreSQL 和 Amazon Aurora PostgreSQL 兼容版数据库，请在同一个 RDS 参数组中将参数 `shared_preload_libraries` 设置为 `pglogical`。

   1. 重启您的 PostgreSQL 源数据库。

   1. 在 PostgreSQL 数据库上，运行此命令 `create extension pglogical;`。

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

   `select * FROM pg_catalog.pg_extension`

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

**注意**  
如果您未在 PostgreSQL 源数据库上启用 pglogical， AWS DMS 默认使用 `test_decoding` 插件。当启用 pglogical 进行逻辑解码时，默认情况下 AWS DMS 使用 pglogical。但是您可以设置额外连接属性，`PluginName` 会改用 `test_decoding` 插件。

## 使用本机 CDC 开始点设置 PostgreSQL 源的 CDC 加载
<a name="CHAP_Source.PostgreSQL.v10"></a>

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

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

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

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

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

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

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

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

   ```
   slotName=abc1d2efghijk_34567890_z0yx98w7_6v54_32ut_1srq_1a2b34c5d67ef;
   ```

1. 使用控制台 AWS CLI 或 AWS 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 本机开始点](CHAP_Task.CDC.md#CHAP_Task.CDC.StartPoint.Native)。

   要在使用控制 AWS DMS 台创建仅限 CDC 的新任务时启用自定义 CDC 启动模式，请执行以下操作：
   + 在**任务设置**部分，对于**源事务的 CDC 启动模式**，请选择**启用自定义 CDC 启动模式**。
   + 对于**源事务的自定义 CDC 开始点**，请选择**指定日志序列号**。指定系统更改号或选择**指定恢复检查点**，然后提供恢复检查点。

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

在 pglogical 插件中使用本机 CDC 开始点并且想要使用新的复制槽时，请在创建 CDC 任务之前完成以下设置步骤。

**使用以前未在另一个 DMS 任务中创建的新复制槽**

1. 创建复制槽，如下所示：

   ```
   SELECT * FROM pg_create_logical_replication_slot('replication_slot_name', 'pglogical');
   ```

1. 数据库创建复制槽后，将获取并记下此槽的 **restart\$1lsn** 和 **confirmed\$1flush\$1lsn** 值：

   ```
   select * from pg_replication_slots where slot_name like 'replication_slot_name';
   ```

   请注意，在复制槽之后创建的 CDC 任务的本机 CDC 开始位置不能早于 **confirmed\$1flush\$1lsn** 值。

   有关 **restart\$1lsn** 和 **confirmed\$1flush\$1lsn** 值的信息，请参阅 [pg\$1replication\$1slots](https://www.postgresql.org/docs/14/view-pg-replication-slots.html) 

1. 创建一个 pglogical 节点。

   ```
   SELECT pglogical.create_node(node_name := 'node_name', dsn := 'your_dsn_name');
   ```

1. 使用 `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);
   ```

1. 向复制集添加表。

   ```
   SELECT pglogical.replication_set_add_table('replication_slot_name', 'schemaname.tablename', true);
   SELECT pglogical.replication_set_add_table('ireplication_slot_name', 'schemaname.tablename', true);
   ```

1. 创建源端点时，请设置以下额外连接属性（ECA）。

   ```
   PluginName=PGLOGICAL;slotName=slot_name;
   ```

现在，您可以使用新的复制槽创建具有 PostgreSQL 本机开始点的仅限 CDC 的任务。有关 pglogical 插件的更多信息，请参阅 [pglogical 3.7 文档](https://www.enterprisedb.com/docs/pgd/3.7/pglogical/)。

## 使用从 PostgreSQL 迁移到 PostgreSQL AWS DMS
<a name="CHAP_Source.PostgreSQL.Homogeneous"></a>

当你从 PostgreSQL 以外的数据库引擎迁移到 PostgreSQL 数据库时 AWS DMS ，几乎总是最好的迁移工具。但是，当您从 PostgreSQL 数据库迁移到 PostgreSQL 数据库时，PostgreSQL 工具的效率更高。

### 使用 PostgreSQL 本机工具迁移数据
<a name="CHAP_Source.PostgreSQL.Homogeneous.Native"></a>

我们建议您在以下条件下使用 PostgreSQL 数据库迁移工具（例如 `pg_dump`）：
+ 您有一个从源 PostgreSQL 数据库向目标 PostgreSQL 数据库的同构迁移。
+ 您正在迁移整个数据库。
+ 利用这些本机工具，可以在迁移您的数据时最大程度地减少停机时间。

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

如果您要将数据从在 EC2 上运行的 PostgreSQL 源数据库迁移到 Amazon RDS for PostgreSQL 目标，则可以使用 pglogical 插件。

有关将 PostgreSQL 数据库导入 Amazon RDS for PostgreSQL 或 Amazon Aurora PostgreSQL 兼容版的更多信息，请参阅[https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/PostgreSQL.Procedural.Importing.html](https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/PostgreSQL.Procedural.Importing.html)。

### 使用 DMS 将数据从 PostgreSQL 迁移到 PostgreSQL
<a name="CHAP_Source.PostgreSQL.Homogeneous.DMS"></a>

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

**注意**  
将分区表从 PostgreSQL 源复制到 PostgreSQL 目标时，您无需在 DMS 任务的选择标准中提及父表。提及父表会导致目标上子表中的数据重复，这可能造成 PK 违规。在表映射选择标准中单独选择子表，即会自动填充父表。

源数据库支持但目标数据库不支持的数据类型可能无法成功迁移。 AWS 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 空间数据类型
<a name="CHAP_Source.PostgreSQL.DataTypes.Spatial"></a>

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

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

对于 PostgreSQL 到 PostgreSQL 的同构 AWS DMS 迁移，支持 PostGIS 几何和地理（大地坐标）数据对象类型和子类型的迁移，例如：
+  POINT 
+  LINESTRING 
+  POLYGON 
+  MULTIPOINT 
+  MULTILINESTRING 
+  MULTIPOLYGON 
+  GEOMETRYCOLLECTION 

## 使用 Babelfish 为亚马逊 Aurora PostgreSQL 迁移 AWS DMS
<a name="CHAP_Source.PostgreSQL.Babelfish"></a>

你可以使用将 Babelfish for Aurora PostgreSQL 源表迁移到任何支持的目标终端节点。 AWS DMS

在使用 DMS 控制台、API 或 CLI 命令创建 AWS DMS 源终端节点时，将源设置为 **Amazon Aurora PostgreSQL**，将数据库名称设置为。**babelfish\$1db**在 **“端点设置”** 部分中，确保设置**DatabaseMode**为 **Babelfish**，并将其**BabelfishDatabaseName**设置为源 Babelfish T-SQL 数据库的名称。使用 Aurora PostgreSQL TCP 端口 **5432**，而不使用 Babelfish TCP 端口 **1433**。

迁移数据之前必须先创建表，以确保 DMS 使用正确的数据类型和表元数据。如果您在运行迁移之前未在目标上创建表，DMS 可能会使用不正确的数据类型和权限创建表。

### 向迁移任务添加转换规则
<a name="CHAP_Source.PostgreSQL.Babelfish.Transform"></a>

在为 Babelfish 源创建迁移任务时，需要包含转换规则，以确保 DMS 使用预先创建的目标表。

如果您在定义 Babelfish for PostgreSQL 集群时设置了多数据库迁移模式，请添加将架构名称重命名为 T-SQL 架构的转换规则。例如，如果 T-SQL 架构名称为 `dbo`，而您的 Babelfish for PostgreSQL 架构名称为 `mydb_dbo`，则使用转换规则将架构重命名为 `dbo`。要查找 PostgreSQL 架构名称，请参阅《Amazon Aurora 用户指南》**中的 [Babelfish 架构](https://docs.aws.amazon.com/AmazonRDS/latest/AuroraUserGuide/babelfish-architecture.html)。

如果您使用单数据库模式，则无需使用转换规则即可重命名数据库架构。PostgreSQL 架构名称与 T-SQL 数据库中的架构名称存在映射。 one-to-one

以下转换规则示例显示了如何将架构名称从 `mydb_dbo` 重命名回 `dbo`：

```
{
    "rules": [
        {
            "rule-type": "transformation",
            "rule-id": "566251737",
            "rule-name": "566251737",
            "rule-target": "schema",
            "object-locator": {
                "schema-name": "mydb_dbo"
            },
            "rule-action": "rename",
            "value": "dbo",
            "old-value": null
        },
        {
            "rule-type": "selection",
            "rule-id": "566111704",
            "rule-name": "566111704",
            "object-locator": {
                "schema-name": "mydb_dbo",
                "table-name": "%"
            },
            "rule-action": "include",
            "filters": []
        }
    ]
}
```

### 使用包含 Babelfish 表的 PostgreSQL 源端点的限制
<a name="CHAP_Source.PostgreSQL.Babelfish.Limitations"></a>

使用包含 Babelfish 表的 PostgreSQL 源端点时，存在以下限制：
+ DMS 仅支持从 Babelfish 版本 16.2/15.6 及更高版本以及 DMS 版本 3.5.3 及更高版本迁移。
+ DMS 不会将 Babelfish 表定义更改复制到目标端点。解决此限制的一种方法是先将表定义更改应用于目标，然后在 Babelfish 源上更改表定义。
+ 当您创建数据类型为 BYTEA 的 Babelfish 表时，DMS 会在迁移到作为目标的 SQL Server 时将这些表转换为 `varbinary(max)` 数据类型。
+ DMS 不支持对二进制数据类型使用完整 LOB 模式，而是对二进制数据类型使用受限 LOB 模式。
+ 当 Babelfish 作为源时，DMS 不支持数据验证。
+ 对于**目标表准备模式**任务设置，仅使用**不执行任何操作**或**截断**模式。不要使用**删除目标中的表**模式。使用**删除目标中的表**时，DMS 可能会使用不正确的数据类型创建表。
+ 使用持续复制（CDC 或完全加载和 CDC）时，请将 `PluginName` 额外连接属性（ECA）设置为 `TEST_DECODING`。
+ 当 Babelfish 作为源时，DMS 不支持复制（CDC 或完全加载和 CDC）分区表。

## 从 PostgreSQL 源数据库中移除 AWS DMS 构件
<a name="CHAP_Source.PostgreSQL.CleanUp"></a>

要捕获 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 数据库作为 DMS 源时的额外配置设置
<a name="CHAP_Source.PostgreSQL.Advanced"></a>

在从 PostgreSQL 数据库迁移数据时，您可以使用两种方法来添加额外配置设置：
+ 您可以将值添加到额外连接属性来捕获 DDL 事件，以及指定在其中创建操作 DDL 数据库项目的架构。有关更多信息，请参阅 [使用 PostgreSQL 作为 DMS 源时的端点设置和额外连接属性 (ECAs)](#CHAP_Source.PostgreSQL.ConnectionAttrib)。
+ 您可以覆盖连接字符串参数。选择此选项可执行以下任一操作：
  + 指定内部 AWS DMS 参数。此类参数很少需要，因此不在用户界面中公开。
  + 为特定数据库客户端指定直通（直通）值。 AWS DMS 在传递给数据库客户端的连接 sting 中包含直通参数。
+ 通过在 `REPLICA IDENTITY` PostgreSQL 9.4 及更高版本中使用表级参数，您可以控制写入预写日志 () 的信息。WALs特别是，它这样做是为了 WALs 识别已更新或删除的行。 `REPLICA IDENTITY FULL`记录该行中所有列的旧值。请`REPLICA IDENTITY FULL`谨慎使用每张表，因为 WALs可能不需要`FULL`生成额外的数字。有关更多信息，请参阅 [ALTER TABLE-REPLICA IDENTITY](https://www.postgresql.org/docs/devel/sql-altertable.html)。

## 只读副本作为 PostgreSQL 的源
<a name="CHAP_Source.PostgreSQL.ReadReplica"></a>

使用 PostgreSQL 只读副本作为 CDC 源以减少主数据库 AWS DMS 的负载。此功能可从 PostgreSQL 16.x 中获得， AWS DMS 需要版本 3.6.1 或更高版本。使用只读副本进行 CDC 处理可以降低对主数据库的操作影响。

**注意**  
Amazon RDS PostgreSQL 版本 16.x 对三可用区（TAZ）配置中的只读副本逻辑复制有限制。要在 TAZ 部署中获得完整的只读副本逻辑复制支持，必须使用 PostgreSQL 版本 17.x 或更高版本。

### 先决条件
<a name="CHAP_Source.PostgreSQL.ReadReplica.prereq"></a>

在使用只读副本作为 CDC 源之前 AWS DMS，您必须在主数据库实例及其只读副本上启用逻辑复制，以便在只读副本上创建逻辑解码。执行以下操作：
+ 在主数据库实例及其只读副本以及所有其他必需的数据库参数上启用逻辑复制。有关更多信息，请参阅[使用 AWS托管的 PostgreSQL 数据库作为 DMS](https://docs.aws.amazon.com/dms/latest/userguide/CHAP_Source.PostgreSQL.html#CHAP_Source.PostgreSQL.RDSPostgreSQL) 源。
+ 对于仅限 CDC 的任务，请在主（写入器）实例上创建一个复制槽位。有关更多信息，请参阅[使用本机 CDC 开始点设置 PostgreSQL 源的 CDC 加载](https://docs.aws.amazon.com/dms/latest/userguide/CHAP_Source.PostgreSQL.html#CHAP_Source.PostgreSQL.v10)。此操作是必要的，因为只读副本不支持创建复制槽位。
+ 对于 PostgreSQL 版本 16，必须在只读副本上手动创建槽位。
+ 对于 PostgreSQL 版本 17 及更高版本，必须在主实例上创建复制槽位，并自动将其同步到只读副本。
+ 使用 Full Load \$1 CDC 或仅限 CDC 的任务时， AWS DMS 可以自动管理主实例上的逻辑复制槽，但不能自动管理只读副本上的逻辑复制槽。对于 PostgreSQL 版本 16 只读副本，在重新启动任务（而不是恢复）之前，必须手动删除并重新创建复制槽位。跳过此步骤可能会导致任务失败或 CDC 起始位置不正确。从 PostgreSQL 版本 17 起，主实例的逻辑槽位同步将自动执行此过程。

完成先决条件后，您可以在终端节点设置中通过复制`SlotName`只读副本源来设置源终端节点，并使用本地 CDC 起点配置 AWS DMS 任务。 AWS DMS 有关更多信息，请参阅[使用 PostgreSQL 作为 DMS 源时的端点设置和额外连接属性 (ECAs) 和使用本地 CDC 起点设置 PostgreSQL](https://docs.aws.amazon.com/dms/latest/userguide/CHAP_Source.PostgreSQL.html#CHAP_Source.PostgreSQL.ConnectionAttrib) [源的 CDC 负载](https://docs.aws.amazon.com/dms/latest/userguide/CHAP_Source.PostgreSQL.html#CHAP_Source.PostgreSQL.v10)。

## 使用 `MapBooleanAsBoolean` PostgreSQL 端点设置
<a name="CHAP_Source.PostgreSQL.ConnectionAttrib.Endpointsetting"></a>

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

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

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

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

## 使用 PostgreSQL 作为 DMS 源时的端点设置和额外连接属性 (ECAs)
<a name="CHAP_Source.PostgreSQL.ConnectionAttrib"></a>

您可以使用端点设置和额外的连接属性 (ECAs) 来配置您的 PostgreSQL 源数据库。在使用 AWS DMS 控制台创建源终端节点时，您可以指定终端节点设置，或者使用中带有 `--postgre-sql-settings '{"EndpointSetting": "value", ...}'` JSON 语法的`create-endpoint`[AWS CLI](https://docs.aws.amazon.com/cli/latest/reference/dms/index.html)命令来指定终端节点设置。

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

[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/dms/latest/userguide/CHAP_Source.PostgreSQL.html)

## 将 PostgreSQL 数据库作为 DMS 源的限制
<a name="CHAP_Source.PostgreSQL.Limitations"></a>

将 PostgreSQL 作为 AWS DMS的源时，以下限制适用：
+ AWS DMS 不适用于亚马逊 RDS for PostgreSQL 10.4 或 Amazon Aurora PostgreSQL 10.4 作为源或目标。
+ 捕获的表必须具有一个主键。如果表没有主键，则 AWS DMS 忽略该表的 DELETE 和 UPDATE 记录操作。有关解决方法，请参阅[使用逻辑复制启用更改数据捕获（CDC）](#CHAP_Source.PostgreSQL.Security)。

  **注意：**我们不建议在没有主 Key/Unique 索引的情况下进行迁移，否则会有其他限制，例如 “否” Batch 应用功能、完整 LOB 功能、数据验证以及无法高效地复制到 Redshift 目标。
+ AWS DMS 忽略更新主键段的尝试。在这些情况下，目标会将更新标识为未更新任何行的更新。但是，由于更新 PostgreSQL 中的主键的结果是不可预测的，不会将任何记录写入异常表。
+ AWS DMS 不支持 “**从时间戳开始处理更改**” 运行选项。
+ AWS DMS 不会复制因分区或子分区操作（`ADD``DROP`、或`TRUNCATE`）而产生的更改。
+ 复制多个具有相同名称且每个名称大小写不同的表（例如 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` 数据类型迁移到 SQL Server 目标。解决方法是，使用列`VARCHAR(1)`的数据类型预先创建表（或者 AWS DMS 创建表）。然后，让下游处理将“F”视为 False，将“T”视为 True。
+ AWS DMS 不支持 TRUNCATE 操作的更改处理。
+ OID LOB 数据类型不会迁移到目标。
+ AWS DMS 仅支持同构迁移的 PostGIS 数据类型。
+ 如果您的源是本地或 Amazon EC2 实例上的 PostgreSQL 数据库，请确保将 test\$1decoding 输出插件安装到源端点上。您可以在 PostgreSQL contrib 包中找到此插件。有关测试解码插件的更多信息，请参阅 [PostgreSQL 文档](https://www.postgresql.org/docs/10/static/test-decoding.html)。
+ AWS DMS 不支持更改处理以设置和取消设置列的默认值（在 ALTER TABLE 语句上使用 ALTER COLUMN SET DEFAULT 子句）。
+ AWS DMS 不支持通过更改处理来设置列的空性（在 ALTER TABLE 语句上使用 ALTER COLUMN [SET\$1DROP] NOT NULL 子句）。
+ 启用逻辑复制后，每个事务在内存中保留的最大更改数为 4MB。之后，更改会溢出到磁盘。因此，`ReplicationSlotDiskUsage` 会增加，并且在事务完成/停止并且回滚完成之前，`restart_lsn` 不会有进展。因为这是一个长时间运行的事务，可能需要花费较长时间回滚。因此，在启用逻辑复制时，请避免长时间运行的事务或许多子事务。请改为将事务分成几个较小的事务。

  在 Aurora PostgreSQL 版本 13 及更高版本中，您可以调整 `logical_decoding_work_mem` 参数以控制 DMS 何时将更改数据溢出到磁盘。有关更多信息，请参阅 [Aurora PostgreSQL 中的溢出文件](CHAP_Troubleshooting_Latency_Source_PostgreSQL.md#CHAP_Troubleshooting_Latency_Source_PostgreSQL_Spill)。
+ 数据类型为 ARRAY 的表必须具有主键。缺少主键的 ARRAY 数据类型的表在完全加载期间会暂停。
+ AWS DMS 不支持迁移与表分区或表[继承相关的表](https://www.postgresql.org/docs/15/ddl-inherit.html)元数据。当 AWS DMS 遇到分区表或使用继承的表时，会观察到以下行为：
  + AWS DMS 标识并报告源数据库上分区或继承所涉及的父表和子表。
  + **在目标数据库上创建表**：在目标数据库上，将表 AWS DMS 创建为标准（非分区、非继承）表，保留所选表的结构和属性，但不保留分区或继承逻辑。
  + **继承表中的记录差异**：对于使用继承的表，在填充父表时 AWS DMS 不区分属于子表的记录。因此，它不使用带有诸如 `SELECT * FROM ONLY parent_table_name` 之类的语法的 SQL 查询。
+ 要将分区表从 PostgreSQL 源复制到 PostgreSQL 目标，请先在目标上手动创建父表和子表。然后，定义单独的任务来向这些表进行复制。在这种情况下，请将任务配置设置为 **Truncate before loading**。
+ PostgreSQL `NUMERIC` 数据类型不是固定大小。当传输的数据属于 `NUMERIC` 数据类型，但没有精度和小数位数时，默认情况下，DMS 使用 `NUMERIC(28,6)`（精度为 28，小数位数为 6）。例如，源中的值 0.611111104488373 在 PostgreSQL 目标中将转换为 0.611111。
+ AWS DMS 仅支持 Aurora PostgreSQL Serverless V1 作为满载任务的来源。 AWS DMS 支持 Aurora PostgreSQL Serverless V2 作为满载、满载和 CDC 以及仅限 CDC 的任务的来源。
+ AWS DMS 不支持复制使用合并函数创建的具有唯一索引的表。
+ 如果源和目标上的主键定义不匹配，则复制的结果可能无法预测。
+ 使用并行加载功能时，不支持根据分区或子分区对表进行分段。有关并行加载的更多信息，请参阅[对所选表、视图和集合使用并行加载](CHAP_Tasks.CustomizingTasks.TableMapping.SelectionTransformation.Tablesettings.md#CHAP_Tasks.CustomizingTasks.TableMapping.SelectionTransformation.Tablesettings.ParallelLoad)。
+ AWS DMS 不支持延迟约束。
+ AWS DMS 版本 3.4.7 支持 PostgreSQL 14.x 作为源代码，但有以下限制：
  + AWS DMS 不支持对两阶段提交的更改处理。
  + AWS DMS 不支持逻辑复制以流式传输正在进行的长时间事务。
+ AWS DMS 不支持 CDC for Amazon RDS Proxy for PostgreSQL 作为来源。
+ 使用不包含主键列的[源过滤器](CHAP_Tasks.CustomizingTasks.Filters.md)时，不会捕获 `DELETE` 操作。
+ 如果您的源数据库也是另一个第三方复制系统的目标，DDL 更改可能不会在 CDC 期间迁移。因为这种情况可能会防止触发 `awsdms_intercept_ddl` 事件触发器。要解决这种情况，请在源数据库上修改此触发器，如下所示：

  ```
  alter event trigger awsdms_intercept_ddl enable always;
  ```
+ AWS DMS 不支持复制对源数据库中主键定义所做的更改。如果在执行活动复制任务期间更改了主键结构，则随后对受影响表所做的更改不会复制到目标。
+ 在作为脚本一部分的 DDL 复制中，每个脚本的 DDL 命令总数上限为 8192，每个脚本的总行数上限为 8192 行。
+ AWS DMS 不支持实体化视图。
+ 对于使用只读副本作为源的满载和 CDC 任务， AWS DMS 无法在只读副本上创建复制槽。

## PostgreSQL 的源数据类型
<a name="CHAP_Source-PostgreSQL-DataTypes"></a>

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

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

有关 AWS DMS 数据类型的更多信息，请参见[AWS Database Migration Service 的数据类型](CHAP_Reference.DataTypes.md)。


|  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  | 
|  CITEXT  |  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  | 
|  INT4射程  |  STRING (255)  | 
|  INT8射程  |  STRING (255)  | 
|  NUMRANGE  |  STRING (255)  | 
|  STRRANGE  |  STRING (255)  | 

### 使用 PostgreSQL 的 LOB 源数据类型
<a name="CHAP_Source-PostgreSQL-DataTypes-LOBs"></a>

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