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

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

使用 Postgre SQL 数据库作为源 Amazon DMS

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

有关 Amazon DMS 支持作为源代码的 Post SQL gre 版本的信息,请参阅的来源 Amazon DMS

Amazon DMS 支持 Postgre SQL 用于以下类型的数据库:

  •  本地数据库

  • Amazon EC2 实例上的数据库

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

  • 基于亚马逊 Aurora Postgre SQL 兼容版的数据库实例上的数据库

  • 基于亚马逊 Aurora Postgre SQL 兼容无服务器版的数据库实例上的数据库

注意

DMS仅支持 Amazon Aurora Postgre SQL —Serverless V1 作为全负荷源。但是你可以使用 Amazon Aurora Postgre SQL —Serverless V2 作为满载、满载 + CDC 和仅限任务的来源。CDC

Postgre SQL 源版本

Amazon DMS 要使用的版本

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

使用任何可用的 Amazon DMS 版本。

13.x

使用 3.4.3 及更高 Amazon DMS 版本。

14.x

使用 3.4.7 及更高 Amazon DMS 版本。

15.x

使用 3.5.1 及更高 Amazon DMS 版本。

16.x

使用 3.5.3 及更高 Amazon DMS 版本。

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

在使用 Postgre SQL 作为源时,作为额外的安全要求,指定的用户帐户必须是 Postgre SQL 数据库中的注册用户。

要将 Postgre SQL 数据库配置为 Amazon DMS 源端点,请执行以下操作:

使用自行管理的 Postgre SQL 数据库作为来源 Amazon DMS

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

使用自行管理的 Postgre SQL 数据库作为源的先决条件 Amazon DMS

在从自行管理的 Postgre SQL 源数据库迁移数据之前,请执行以下操作:

  • 请务必使用版本为 9.4.x 或更高版本的 Postgre SQL 数据库。

  • 对于满载增强CDC型CDC任务或仅限运行的任务,请为为 Post SQL gre 源数据库指定的用户帐户授予超级用户权限。该用户账户访问源中特定于复制的函数需要超级用户权限。对于仅限满载的任务,用户帐户需要表的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

    Postgre SQL 的pg_hba.conf配置文件控制客户端身份验证。(HBA代表基于主机的身份验证。) 文件通常存储在数据库集群的数据目录中。

  • 如果您要使用将数据库配置为逻辑复制源, Amazon DMS 请参阅 启用CDC使用自行管理的 Postgre SQL 数据库作为源 Amazon DMS

注意

有些 Amazon DMS 事务会闲置一段时间,然后DMS引擎才会再次使用它们。通过idle_in_transaction_session_timeout在 Postgre 9.6 及更高SQL版本中使用该参数,可以导致空闲事务超时并失败。当您使用 Amazon DMS时,请勿结束空闲事务。

启用CDC使用自行管理的 Postgre SQL 数据库作为源 Amazon DMS

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

  • 设置 wal_level = logical

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

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

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

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

  • wal_sender_timeout 参数会终止处于不活动状态的时间超过指定毫秒数的复制连接。本地 Postgre SQL 数据库的默认值为 60000 毫秒(60 秒)。将该值设置为 0(零)会禁用超时机制,并且是的有效设置。DMS

    设置wal_sender_timeout为非零值时,具有的DMS任务至少CDC需要 10000 毫秒(10 秒),如果该值小于 10000,则会失败。将该值保持在 5 分钟以内,以免在DMS复制实例的多可用区故障转移期间造成延迟。

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

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

使用 Amazon托管的 Postgre SQL 数据库作为源 DMS

您可以使用 Amazon托管的 Postgre SQL 数据库实例作为源。 Amazon DMS您可以使用 Amazon托管的 Post SQL gre 源执行满载任务和更改数据捕获 (CDC) 任务。

使用 Amazon托管的 Postgre SQL 数据库作为源的先决条件 DMS

从 Amazon托管的 Postgre SQL 源数据库迁移数据之前,请执行以下操作:

  • 我们建议您使用具有 Postgre SQL 数据库实例所需最低权限的 Amazon 用户账户作为 Postgre SQL 源终端节点的用户账户。 Amazon DMS建议不要使用主账户。该账户必须具有 rds_superuserrds_replication 角色。rds_replication 角色可授予管理逻辑时隙和使用逻辑时隙流式处理数据的权限。

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

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

注意

有些 Amazon DMS 事务会闲置一段时间,然后DMS引擎才会再次使用它们。通过idle_in_transaction_session_timeout在 Postgre 9.6 及更高SQL版本中使用该参数,可以导致空闲事务超时并失败。当您使用 Amazon DMS时,请勿结束空闲事务。

CDC使用 Amazon托管的 Postgre SQL 数据库实例启用 Amazon DMS

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

您不能使用 RDS Postgre 只SQL读副本进行CDC(持续复制)。

Postgre 版本 SQL

Amazon DMS 满载支持

Amazon DMS CDC支持

兼容 Postgre SQL 10.5 的 Aurora Postgre SQL 版本 2.1(或更低版本)

兼容 Postgre SQL 10.6 的 Aurora Postgre SQL 版本 2.2(或更高版本)

RDS适用于兼容 Postgr SQL e SQL 10.21(或更高版本)的 Postgre

为 RDS Postgre SQL 数据库实例启用逻辑复制
  1. 使用 Po Amazon stgre SQL 数据库实例的主用户账户作为 Postgre SQL 源端点的用户账户。主用户账户具有允许其设置的必需角色CDC。

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

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

  3. wal_sender_timeout 参数会终止处于不活动状态的时间超过指定毫秒数的复制连接。 Amazon由托管的 Postgre SQL 数据库的默认值为 30000 毫秒(30 秒)。将该值设置为 0(零)会禁用超时机制,并且是的有效设置。DMS

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

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

  5. 使用 Aurora Postgre SQL 作为源时CDC,synchronous_commit请将其设置为。ON

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

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

注意

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

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

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

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

  3. 运行以下命令以创建表 awsdms_ddl_audit,并将以下代码中的 objects_schema 替换为要使用的架构名称。

    CREATE TABLE objects_schema.awsdms_ddl_audit ( c_key bigserial primary key, c_time timestamp, -- Informational c_user varchar(64), -- Informational: current_user c_txn varchar(16), -- Informational: current transaction c_tag varchar(24), -- Either 'CREATE TABLE' or 'ALTER TABLE' or 'DROP TABLE' c_oid integer, -- For future use - TG_OBJECTID c_name varchar(64), -- For future use - TG_OBJECTNAME c_schema varchar(64), -- For future use - TG_SCHEMANAME. For now - holds current_schema c_ddlqry text -- The DDL query associated with the current DDL event );
  4. 运行以下命令以创建函数 awsdms_intercept_ddl,并将以下代码中的 objects_schema 替换为要使用的架构名称。

    CREATE OR REPLACE FUNCTION objects_schema.awsdms_intercept_ddl() RETURNS event_trigger LANGUAGE plpgsql SECURITY DEFINER AS $$ declare _qry text; BEGIN if (tg_tag='CREATE TABLE' or tg_tag='ALTER TABLE' or tg_tag='DROP TABLE' or tg_tag = 'CREATE TABLE AS') then SELECT current_query() into _qry; insert into objects_schema.awsdms_ddl_audit values ( default,current_timestamp,current_user,cast(TXID_CURRENT()as varchar(16)),tg_tag,0,'',current_schema,_qry ); delete from objects_schema.awsdms_ddl_audit; end if; END; $$;
  5. 注销 OtherThanMaster 账户并使用分配了 rds_superuser 角色的账户登录。

  6. 运行以下命令以创建事件触发器 awsdms_intercept_ddl

    CREATE EVENT TRIGGER awsdms_intercept_ddl ON ddl_command_end EXECUTE PROCEDURE objects_schema.awsdms_intercept_ddl();
  7. 确保访问这些事件的所有用户和角色都具有必要的DDL权限。例如:

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

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

注意

这些事件由 CREATE TABLEALTER TABLEDROP TABLE 语句触发。

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

在数据库迁移期间,您可以使用 Postgre SQL 的本机逻辑复制功能为 Postgre SQL 源启用更改数据捕获 (CDC)。您可以将此功能与自我管理的 Postgre 数据库实例SQL以及亚马逊版 Postgre RDS SQL SQL 数据库实例一起使用。这种方法可以减少停机时间,并有助于确保目标数据库与源 Postgre SQL 数据库同步。

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

注意

REPLICAIDENTITYFULL逻辑解码插件支持,但 pglogical 插件不支持。有关更多信息,请参阅 pglogical 文档

对于满负荷CDC且CDC仅限任务, Amazon DMS 使用逻辑复制槽保留WAL日志以进行复制,直到日志被解码。在满负荷和CDC任务或任务的重启(不是恢复)时,会重新创建复制槽。CDC

注意

要进行逻辑解码,请DMS使用 test_decoding 或 pglogical 插件。如果 pglogical 插件在源 Postgre SQL 数据库上可用,则使用 pglogic DMS al 创建一个复制槽,否则将使用 test_decoding 插件。有关 test_decoding 插件的更多信息,请参阅 Postgre 文档。SQL

如果将数据库参数设置max_slot_wal_keep_size为非默认值,并且复制槽落后于当前LSN位置的大小超过此大小,则由于删除了所需的WAL文件,该DMS任务将失败。restart_lsn

配置 pglogical 插件

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

Postgre 来源 SQL

支持 pglogical

自行管理 Postgre SQL 9.4 或更高版本

亚马逊 RDS Postgre SQL 9.5 或更低版本

亚马逊 RDS Postgre SQL 9.6 或更高版本

Aurora Postgre SQL 1.x 到 2.5.x

Aurora Postgre SQL 2.6.x 或更高版本

Aurora Postgre SQL 3.3.x 或更高版本

在配置 pglogical 以与一起使用之前 Amazon DMS,请先在 Postgr SQL e 源数据库上为更改数据捕获 (CDC) 启用逻辑复制。

在 Postgre SQL 源数据库上启用逻辑复制后,使用以下步骤配置 pglogical 以供使用。DMS

使用 pglogical 插件在 Postgr SQL e 源数据库上进行逻辑复制 Amazon DMS
  1. 在你的源 Postgre 数据库上创建一个 pglo SQL gical 扩展:

    1. 设置正确的参数:

      • 对于自建的 Postgre SQL 数据库,请设置数据库参数。shared_preload_libraries= 'pglogical'

      • 对于亚马逊SQL上的 Postgre RDS 和亚马逊 Aurora Postgre SQL 兼容版数据库,在同一RDS参数组pglogicalshared_preload_libraries将参数设置为。

    2. 重新启动你的 Postgre SQL 源数据库。

    3. 在 Postgre SQL 数据库上,运行以下命令 create extension pglogical;

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

    select * FROM pg_catalog.pg_extension

现在,您可以创建一个 Amazon DMS 任务,为 Postgre SQL 源数据库端点执行更改数据捕获。

注意

如果您未在 Postgre SQL 源数据库上启用 pglogical,则默认 Amazon DMS 使用该test_decoding插件。当启用 pglogical 进行逻辑解码时,默认情况下 Amazon DMS 使用 pglogical。但是您可以设置额外连接属性,PluginName 会改用 test_decoding 插件。

使用原生CDC起点设置 Postgre SQL 源的CDC负载

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

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

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

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

使用本机CDC起点设置 Postgre SQL 源端点的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 DMS API。例如,使用CLI可以运行以下create-replication-task命令。

    aws dms create-replication-task --replication-task-identifier postgresql-slot-name-test --source-endpoint-arn arn:aws:dms:us-west-2:012345678901:endpoint:ABCD1EFGHIJK2LMNOPQRST3UV4 --target-endpoint-arn arn:aws:dms:us-west-2:012345678901:endpoint:ZYX9WVUTSRQONM8LKJIHGF7ED6 --replication-instance-arn arn:aws:dms:us-west-2:012345678901:rep:AAAAAAAAAAA5BB4CCC3DDDD2EE --migration-type cdc --table-mappings "file://mappings.json" --cdc-start-position "4AF/B00000D0" --replication-task-settings "file://task-pg.json"

    在前面的命令中,设置了以下选项:

    • source-endpoint-arn 选项设置为您在步骤 2 中创建的新值。

    • replication-instance-arn 选项设置为与步骤 1 中的父任务相同的值。

    • table-mappingsreplication-task-settings 选项设置为与步骤 1 中的父任务相同的值。

    • cdc-start-position 选项设置为起始位置值。要查找此起始位置,请查询源数据库上的 pg_replication_slots 视图,或查看步骤 1 中父任务的控制台详细信息。有关更多信息,请参阅 确定 CDC 本机开始点

    要在使用 Amazon DMS 控制台创建新的CDC仅限任务时启用自定义CDC启动模式,请执行以下操作:

    • 任务设置部分中,对于源事务的CDC启动模式,选择启用自定义CDC启动模式

    • 对于源事务的自定义CDC起点,请选择指定日志序列号。指定系统更改号或选择指定恢复检查点,然后提供恢复检查点。

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

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

使用以前未创建的新复制槽作为其他DMS任务的一部分
  1. 创建复制槽,如下所示:

    SELECT * FROM pg_create_logical_replication_slot('replication_slot_name', 'pglogical');
  2. 数据库创建复制槽后,将获取并记下此槽的 restart_lsnconfirmed_flush_lsn 值:

    select * from pg_replication_slots where slot_name like 'replication_slot_name';

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

    有关 restart_lsnconfirmed_flush_lsn 值的信息,请参阅 pg_replication_slots

  3. 创建一个 pglogical 节点。

    SELECT pglogical.create_node(node_name := 'node_name', dsn := 'your_dsn_name');
  4. 使用 pglogical.create_replication_set 函数创建两个复制集。第一个复制集跟踪有主键的表的更新和删除。第二个复制集仅跟踪插入,其名称与第一个复制集相同,只是添加了前缀“i”。

    SELECT pglogical.create_replication_set('replication_slot_name', false, true, true, false); SELECT pglogical.create_replication_set('ireplication_slot_name', true, false, false, true);
  5. 向复制集添加表。

    SELECT pglogical.replication_set_add_table('replication_slot_name', 'schemaname.tablename', true); SELECT pglogical.replication_set_add_table('ireplication_slot_name', 'schemaname.tablename', true);
  6. 创建源端点时,请设置以下额外连接属性 (ECA)。

    PluginName=PGLOGICAL;slotName=slot_name;

现在,您可以使用新的复制槽创建CDC唯一具有 Postgre SQL 本机起点的任务。有关 pglogical 插件的更多信息,请参阅 pglogical 3.7 文档

使用从 Postgre SQL 迁移到 Post SQL gre Amazon DMS

当你从 Postgre 以外的数据库引擎迁移SQL到 Postgre SQL 数据库 Amazon DMS 时,几乎总是最好的迁移工具。但是,当你从 Postgre SQL 数据库迁移到 Postgre SQL 数据库时,Postgre SQL 工具可能会更有效。

使用 Postgre SQL 原生工具迁移数据

我们建议您在以下条件pg_dump下使用 Postgre SQL 数据库迁移工具:

  • 您正在进行同构迁移,即从源 Postgre SQL 数据库迁移到目标 Postgre 数据库。SQL

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

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

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

如果您要将数据从运行的 Postgre SQL 源数据库迁移到 Amazon RDS fo EC2 r Postgre SQL 目标上,则可以使用 pglogical 插件。

有关将 Postgre SQL 数据库导入亚马逊 Postgre 版SQL或亚马逊 A RDS urora Postgre SQL 兼容版的更多信息,请参阅。https://docs.amazonaws.cn/AmazonRDS/latest/UserGuide/PostgreSQL.Procedural.Importing.html

DMS用于将数据从 Postgre 迁移到 Postgre SQL SQL

Amazon DMS 例如,可以将数据从本地源 Postgre SQL 数据库迁移到目标 Amazon RDS for Postgre 或 A SQL urora Postgre 实例。SQL核心或基本 Postgre SQL 数据类型最常成功迁移。

注意

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

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

执行数据类型迁移时,需要注意以下事项:

  • 在某些情况下,Postgre SQL NUMERIC (p, s) 数据类型不指定任何精度和比例。对于 3.4.2 及更早DMS版本,默认DMS使用精度为 28,小数位数为 6,NUMERIC(28,6)。例如,在 Postgre 目标上,来自源的值 0.611111104488373 会转换为 0.611111。SQL

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

下表显示了源 Postgre SQL 数据类型以及它们能否成功迁移。

数据类型 成功迁移 部分迁移 不迁移 注释
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 WITH TIME ZONE X
DATE X
TIME X
TIME WITH TIME ZONE X
INTERVAL X
BOOLEAN X
ENUM X
CIDR X
INET X
MACADDR X
TSVECTOR X
TSQUERY X
XML X
POINT X 后GIS空间数据类型
LINE X
LSEG X
BOX X
PATH X
POLYGON X 后GIS空间数据类型
CIRCLE X
JSON X
ARRAY X 需要主键
COMPOSITE X
RANGE X
LINESTRING X 后GIS空间数据类型
MULTIPOINT X 后GIS空间数据类型
MULTILINESTRING X 后GIS空间数据类型
MULTIPOLYGON X 后GIS空间数据类型
GEOMETRYCOLLECTION X 后GIS空间数据类型

迁移 Pos GIS t 空间数据类型

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

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

对于 Postgre SQL 到 Postgre 的SQL同构迁移, Amazon DMS 支持迁移后GIS几何和地理(大地坐标)数据对象类型和子类型,例如:

  • POINT

  • LINESTRING

  • POLYGON

  • MULTIPOINT

  • MULTILINESTRING

  • MULTIPOLYGON

  • GEOMETRYCOLLECTION

使用 Babelfish 为亚马逊 Aurora Postgre 迁移 SQL Amazon DMS

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

使用DMS控制台、或CLI命令创建 Amazon DMS 源终端节点时API,将源设置为 Amazon Aurora Postgre SQL,将babelfish_db数据库名称设置为。在 “端点设置” 部分中,确保设置DatabaseModeBabelfish,并设置BabelfishDatabaseName为源 Babelfish T-数据库的名称。SQL与其使用 Babelfish TCP 端口1433,不如使用 Aurora Post SQL TCP gre 端口。5432

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

向迁移任务添加转换规则

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

如果您在定义 Babelfish for Postgre SQL 集群时设置了多数据库迁移模式,请添加一条转换规则,将架构名称重命名为 T 架构。SQL例如,如果 T SQL 架构名称为dbo,而你的 Babelfish for Postgre SQL 架构名称为mydb_dbo,则dbo使用转换规则将架构重命名为。要查找 Postgre SQL 架构名称,请参阅亚马逊 Aurora 用户指南中的 Babelfish 架构

如果您使用单数据库模式,则无需使用转换规则来重命名数据库架构。Postgre SQL 架构名称与 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 表中使用 Postgre SQL 源端点的限制

在 Babelfish 表中使用 Postgre SQL 源端点时,存在以下限制:

  • DMS仅支持从 Babelfish 版本 16.2/15.6 及更高版本以及 3.5.3 及更高版本迁移。DMS

  • DMS不会将 Babelfish 表定义更改复制到目标端点。解决此限制的一种解决方法是先将表定义更改应用于目标,然后在 Babelfish 源代码上更改表定义。

  • 使用该BYTEA数据类型创建 Babelfish 表时,在迁移到SQL服务器作为目标时,会将其DMS转换为varbinary(max)数据类型。

  • DMS不支持二进制数据类型的完整LOB模式。改为对二进制数据类型使用受限LOB模式。

  • DMS不支持将 Babelfish 作为数据源进行数据验证。

  • 对于 “目标表格准备模式” 任务设置,请仅使用 “什么都不做” 或 “截断” 模式。不要使用删除目标中的表模式。在目标上使用 Drop table s 时,DMS可能会使用不正确的数据类型创建表。

  • 使用持续复制(CDC或满载和CDC)时,将PluginName额外的连接属性 (ECA) 设置为TEST_DECODING

  • DMS不支持 Babelfish 的分区表复制(CDC或满载和CDC)作为源。

从 Postgre SQL 源数据库中移除 Amazon DMS 构件

要捕获DDL事件,请在迁移任务启动时在 Postgre SQL 数据库中 Amazon DMS 创建各种构件。完成任务后,您可能需要删除这些项目。

要删除项目,请发布以下语句(按显示顺序),{AmazonRDSMigration} 是在其中创建项目的架构:在删除架构时应尤为谨慎。请勿删除正在使用的架构,特别是非公有的操作架构。

drop event trigger awsdms_intercept_ddl;

事件触发器不属于特定架构。

drop function {AmazonRDSMigration}.awsdms_intercept_ddl() drop table {AmazonRDSMigration}.awsdms_ddl_audit drop schema {AmazonRDSMigration}

使用 Postgre SQL 数据库作为DMS源时的其他配置设置

从 Postgre SQL 数据库迁移数据时,可以通过两种方式添加其他配置设置:

  • 您可以向额外连接属性添加值以捕获DDL事件并指定在其中创建操作DDL数据库对象的架构。有关更多信息,请参阅 使用 Postgre SQL 作为源时的端点设置和额外连接属性 (ECAs) DMS

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

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

    • 为特定数据库客户端指定直通(直通)值。 Amazon DMS 在传递给数据库客户端的连接 sting 中包含直通参数。

  • 通过在 Postgre 9.4 及更高SQL版本REPLICA IDENTITY中使用表级参数,您可以控制写入预写日志()的信息。WALs特别是,它这样做是为了WALs标识已更新或删除的行。 REPLICA IDENTITY FULL记录该行中所有列的旧值。请REPLICA IDENTITY FULL谨慎使用每张表,因为WALs可能不需要FULL生成额外的数字。有关更多信息,请参阅 ALTERTABLE-REPLICA IDENTITY

使用 P MapBooleanAsBoolean ostgre SQL 端点设置

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

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

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

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

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

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

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

属性名称 描述

CaptureDdls

要捕获DDL事件,请在任务开始时在 Postgre SQL 数据库中 Amazon DMS 创建各种构件。稍后可以删除这些项目,如从 Postgre SQL 源数据库中移除 Amazon DMS 构件中所述。

如果此值设置为 false,您无需在源数据库上创建表或触发器。

已捕捉直播DDL的事件。

默认值:true

有效值:true/false

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

ConsumeMonotonicEvents

用于控制如何复制具有重复日志序列号 (LSNs) 的整体事务。当此参数为时false,具有重复LSNs的事件将在目标上使用和复制。当此参数为时true,仅复制第一个事件,而目标上LSNs不会使用或复制具有重复的事件。

默认值:false

有效值:false/true

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

DdlArtifactsSchema

设置创建操作DDL数据库对象的架构。

默认值:public

有效值:字符串

例如:--postgre-sql-settings '{"DdlArtifactsSchema": "xyzddlschema"}'

ExecuteTimeout

设置 Postgre SQL 实例的客户端语句超时时间,以秒为单位。默认值为 60 秒。

例如:--postgre-sql-settings '{"ExecuteTimeout": 100}'

FailTasksOnLobTruncation

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

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

默认值:false

有效值:布尔值

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

fetchCacheSize

这个额外的连接属性 (ECA) 设置了游标在满载操作期间将读取的行数。根据复制实例中可用的资源,您可以将此值调高或调低。

默认值:10000

有效值:数字

ECA示例:fetchCacheSize=10000;

HeartbeatEnable

WAL心跳功能模仿虚拟事务,因此空闲的逻辑复制槽不会保留导致源存储空间已满的旧WAL日志。该检测信号将 restart_lsn 保持运行状态,并防止出现存储已满情况。

默认值:false

有效值:true/false

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

HeartbeatFrequency

设置WAL心跳频率(以分钟为单位)。

默认值:5

有效值:数字

例如:--postgre-sql-settings '{"HeartbeatFrequency": 1}'

HeartbeatSchema

设置在其中创建检测信号构件的架构。

默认值:public

有效值:字符串

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

MapJsonbAsClob

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

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

MapLongVarcharAs

默认情况下, Amazon DMS 映射VARCHAR到WSTRING。你可以指定MapLongVarcharAs让 Postgre SQL 将 VARCHAR (N) 类型(其中 N 大于 16387)迁移到以下类型:

  • WSTRING

  • CLOB

  • NCLOB

例如:--postgre-sql-settings='{"MapLongVarcharAs": "CLOB"}'

MapUnboundedNumericAsString

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

默认值:false

有效值:false/true

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

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

注意

只能同时MapUnboundedNumericAsString在 Postgre SQL 源端点和目标端点中使用。

在此期间,MapUnboundedNumericAsString在源端使用 Postgre SQL 端点会将精度限制为 28。CDC在目标端点上使用 MapUnboundedNumericAsString 时,使用精度 28、小数位数 6 迁移数据。

请勿MapUnboundedNumericAsString与非 PostGRE 目标SQL一起使用。

PluginName

指定用于创建副本槽的插件。

有效值:pglogicaltest_decoding

例如:--postgre-sql-settings '{"PluginName": "test_decoding"}'

SlotName

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

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

有关设置 CdcStartPosition 请求参数的更多信息,请参阅 确定 CDC 本机开始点。有关使用的更多信息CdcStartPosition,请参阅《Amazon Database Migration Service API参考资料》中有关CreateReplicationTaskStartReplicationTask、和ModifyReplicationTaskAPI操作的文档。

有效值:字符串

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

unboundedVarcharMaxSize

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

使用 Postgre SQL 数据库作为DMS源的限制

使用 Postgre SQL 作为来源时,以下限制适用: Amazon DMS

  • Amazon DMS 不RDS适用于亚马逊 Postgre SQL 10.4 或亚马逊 Aurora Postgre 10 SQL .4 作为来源或目标。

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

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

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

  • Amazon DMS 不支持 “从时间戳开始处理更改” 运行选项。

  • Amazon DMS 不会复制因分区或子分区操作(ADDDROP、或TRUNCATE)而产生的更改。

  • 复制多个具有相同名称且每个名称大小写不同的表(例如 table1 和 Table1)可能会导致不可预测的行为。TABLE1由于这个问题, Amazon DMS 不支持这种类型的复制。

  • 在大多数情况下, Amazon DMS 支持表的CREATEALTER、和DROPDDL语句的变更处理。 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; $$;
  • 当前,Postgre SQL 源中的boolean数据类型作为值不一致bit的数据类型迁移到SQL服务器目标。解决方法是,使用列VARCHAR(1)的数据类型预先创建表(或者 Amazon DMS创建表)。然后,让下游处理将“F”视为 False,将“T”视为 True。

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

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

  • Amazon DMS 仅支持同构迁移的 Post GIS 数据类型。

  • 如果您的源是本地或亚马逊EC2实例上的 Postgre SQL 数据库,请确保您的源终端节点上安装了 test_decoding 输出插件。你可以在 Postgre SQL contrib 软件包中找到这个插件。有关测试解码插件的更多信息,请参阅 P ost SQL gre 文档。

  • Amazon DMS 不支持更改处理以设置和取消设置列默认值(使用语ALTERCOLUMNSETDEFAULT句上的子ALTERTABLE句)。

  • Amazon DMS 不支持通过更改处理来设置列可为空性(在ALTERTABLE语NOTNULL句上使用 ALTER COLUMN [SET|DROP] 子句)。

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

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

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

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

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

    • Amazon DMS 将目标表创建为常规表,其属性与所选表相同。

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

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

  • Postgre SQL NUMERIC 数据类型的大小不是固定的。传输的数据类型为NUMERIC数据类型但没有精度和小数位数时,默认DMS使用NUMERIC(28,6)(精度为 28,小数位数为 6)。例如,在 Postgre 目标上,来自源的值 0.611111104488373 被转换为 0.611111。SQL

  • Amazon DMS 仅支持 Aurora Postgre SQL Serverless V1 作为满载任务的来源。 Amazon DMS 支持 Aurora Postgre SQL Serverless V2 作为满载、满载和仅限任务CDC的来源。CDC

  • Amazon DMS 不支持复制使用合并函数创建的具有唯一索引的表。

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

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

  • Amazon DMS 不支持延迟约束。

  • Amazon DMS 版本 3.4.7 支持 Postgre SQL 14.x 作为源代码,但有以下限制:

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

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

  • Amazon DMS 不支持 CDC Postgre 的亚马逊RDS代理SQL作为来源。

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

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

    alter event trigger awsdms_intercept_ddl enable always;
  • Amazon DMS 不支持CDC将 Postgre 的 Amazon RDS 多可用区数据库集群SQL作为源,因为RDS对于 Postgre,SQL多可用区数据库集群不支持逻辑复制。

Postgre 的源数据类型 SQL

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

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

有关 Amazon DMS 数据类型的更多信息,请参见Amazon Database Migration Service 的数据类型

Postgre SQL 数据类型

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服务器FLOAT中映射到。

CHAR

WSTRING(1)

CHAR(N)

WSTRING(n)

VARCHAR(N)

WSTRING(n)

TEXT

NCLOB

CITEXT

NCLOB

BYTEA

BLOB

TIMESTAMP

DATETIME

TIMESTAMP WITH TIME ZONE

DATETIME

DATE

DATE

TIME

TIME

TIME WITH TIME ZONE

TIME

INTERVAL

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

BOOLEAN

CHAR(5) 错误或真实

ENUM

STRING(64)

CIDR

STRING(50)

INET

STRING(50)

MACADDR

STRING(18)

BIT(n)

STRING(n)

BITVARYING(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))”

PATH

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)

使用 Postgre 的LOB源数据类型 SQL

Postgre SQL 列的大小会影响 Postgre 数据类型向SQLLOB Amazon DMS 数据类型的转换。为此,请对以下 Amazon DMS 数据类型执行下列步骤:

  • BLOB— 在创建任务时将 “限制LOBLOB大小” 设置为最大大小 (KB) 值。

  • CLOB— 复制将每个角色作为一个UTF8角色处理。因此,找到列中最长字符文本的长度,此处显示为 max_num_chars_text。使用此长度指定 “将LOB大小限制为” 的值。如果数据包含 4 字节字符,则乘以 2 以指定 “将LOB大小限制为值”,以字节为单位。在这种情况下,将LOB大小限制为等于max_num_chars_text乘以 2。

  • NCLOB— 复制将每个字符作为双字节字符处理。因此,找到列中最长字符文本的长度(max_num_chars_text)并乘以 2。这样做是为了指定 “将LOB大小限制为” 的值。在这种情况下,将LOB大小限制为等于max_num_chars_text乘以 2。如果数据包含 4 字节字符,请再次乘以 2。在这种情况下,将LOB大小限制为等于max_num_chars_text乘以 4。