PostgreSQL:支持的数据类型、对象和操作
Oracle GoldenGate for PostgreSQL 支持捕获和交付受支持的 PostgreSQL 数据库版本的初始加载和事务处理数据。
除非本文档另有说明,否则 Oracle GoldenGate for PostgreSQL 支持对源数据进行映射、筛选和转换,以及将来自 Oracle GoldenGate 支持的其他源数据库的数据复制到 PostgreSQL 数据库。
支持的数据库
以下是 Oracle GoldenGate for PostgreSQL 支持的数据库和限制:
-
仅支持用户数据库进行捕获和传送。
-
Oracle GoldenGate 不支持从归档日志捕获。
-
副本和备用数据库不支持交付。
-
还支持从副本和备用数据库捕获。
-
高可用性。有关详细信息,请参见 High Availability Considerations 。
高可用性注意事项
Oracle GoldenGate 支持从 PostgreSQL 高可用性配置中捕获更改数据。此功能仅在 PostgreSQL 数据库版本 16 及更高版本中可用。更改数据捕获可以在主服务器上配置,也可以在高可用性设置中的任何只读备用服务器上配置。为了避免在故障转移时可能发生数据丢失和手动干预,Oracle GoldenGate 建议使用同步复制配置高可用性设置。
有关可能的数据丢失和手动干预方案的更多详细信息,请参阅 Oracle GoldenGate 过程中的 PostgreSQL 高可用性故障转移文档 ID 2818379.1 。
要从 PostgreSQL 高可用性设置配置 CDC 提取,请执行以下任务:1。提取可以配置为从主服务器或高可用性设置中的只读备用服务器捕获数据。
-
在一个节点(主节点或备用节点)上配置提取时,应在启动数据捕获之前,同时在高可用性设置中的所有其他节点上创建同名的复制插槽。
-
使用
REGISTER EXTRACT命令在一个服务器上创建复制插槽(其中配置了提取),如以下示例所示:REGISTER EXTRACT exte -
注册提取后,立即创建同名的复制插槽。必须在高可用性设置中的所有其他节点上显式使用相同的复制插槽名称。
postgres=# select pg_create_logical_replication_slot('exte_ac6b520cab2871b7', 'test_decoding'); pg_create_logical_replication_slot ------------------------------------ (exte_ac6b520cab2871b7,0/8169E00) (1 row)2025-01-20T06:58:22Z INFO OGG-25355 Successfully created replication slot 'exte_ac6b520cab2871b7' for Extract group 'EXTE' in database 'postgres'. -
连接到相应的数据库,然后从 PSQL 执行
pg_create_logical_replication_slot语句。注:重要说明 FOR REPLICATION SLOT CREATION ON STANDBY :在只读备用服务器上(使用REGISTER EXTRACT命令或pg_create_logical_replication_slot语句)尝试创建复制插槽时,仅当在高可用性设置中对主服务器上的任何表执行某些 DML(可以是任何随机 DML)后,该操作才会完成。或者,可以在主服务器上启用心跳功能(这可能导致主服务器上所需的 DML 活动),以在备用服务器上完成复制插槽的创建。
-
-
PostgreSQL 高可用性设置中的任何只读备用服务器都不支持
ADD TRANDATA或DELETE TRANDATA命令。只读备用服务器上任何表的REPLICA IDENTITY设置将与主服务器上相应表的REPLICA IDENTITY设置相同。 -
要在只读备用服务器上配置数据捕获时使用心跳功能,应在主服务器上启用心跳功能。
-
在故障转移的情况下,应修改提取参数文件以连接到所需的节点(主节点/备用节点,根据要求),以便在故障转移后继续数据捕获。
示例
考虑以下情况:PostgreSQL 高可用性群集中有三个节点,具有相应的连接别名:
Node1(当前主节点),具有相应的连接别名:
node1Node2(备用),具有相应的连接别名:
node2Node3(备用),具有相应的连接别名:
node3在故障转移之前,如果提取配置为从其中一个节点(例如
node2)捕获数据,则提取参数文件将包含类似于以下内容的条目:USERIDALIAS node2如果发生故障转移,则主节点 (
node1) 将关闭,辅助节点 (node2) 将成为新的主节点,因此有两种可能:-
要继续从同一
node2获取数据,请执行以下操作:-
“提取”参数文件中不需要进行更改。
-
重新启动提取。
-
-
要始终从其他节点捕获数据,请执行以下操作:
-
更改提取参数文件以连接到所需的节点,例如 Node3。
USERIDALIAS node3 -
重新启动提取。
-
-
支持的 PostgreSQL 数据类型
以下是 Oracle GoldenGate 支持的 PostgreSQL 数据类型以及此支持的限制。
-
array -
bigint -
bigserial -
bit(n) -
bit varying(n) -
boolean -
bytea -
char (n) -
cidr -
citext -
date -
decimal -
double precision -
Enumerated Types -
inet -
integer -
interval -
json -
jsonb -
macaddr -
macaddr8 -
money -
numeric -
pgvector extension -
real -
serial -
smallint -
smallserial -
text -
time,带/不带时区 -
timestamp,带/不带时区 -
tsquery -
tsvector -
uuid -
varchar(n) -
varbit -
xml
处理数组数据类型
PostgreSQL 支持各种内置和 UDT 类型的 array。从 Oracle GoldenGate 发行版 26ai 开始,Oracle GoldenGate Extract and Replicat 支持以下类型的 PostgreSQL array 数据类型:
-
boolean -
bigint -
bit -
char -
date -
double precision -
enum -
int -
interval -
numeric -
money -
real -
smallint -
timestamp,timestampz,time,timetz -
varbit -
varchar -
text -
tsvector -
tsquery
real、double、numeric 数据类型支持 NaN 和 Infinity/-Infinity 特殊数值。
有关按支持特殊值的数据库列出的数据类型的详情,请参阅数据库数据类型支持的特殊值。
初始装入和 CDC 提取都支持这些数组类型。
注:初始加载提取不支持 time 数据类型的 PostgreSQL array。
支持的限制
-
如果
char、varchar、text或bytea数据类型的列是主键或唯一键的一部分,则这些列的最大单个长度不能超过 8191 字节。 -
提取无法处理
bytea列大小超过 512 MB 的记录。 -
属于主键的数据类型为
CITEXT的列大小最多支持 8000 字节。不支持大于 8000 字节且属于主键的CITEXT列。 -
提取无法处理
bytea列大小超过 512 MB 的记录。 -
不支持
decimal: NaN输入值。 -
以下限制适用于
bit/varbit数据类型:-
它们的长度最多支持 4k。对于大于 4k 的长度,将截断数据,仅捕获较低的 4k 位。
-
源位 (n) 列只能应用于非 PostgreSQL 目标上的字符类型列,并且可以应用于
char类型或 PostgreSQL 目标上的bit/varbit列。
-
-
以下限制适用于带时区的
timestamp和不带时区的timestamp:-
不支持数据中包含 BC 或 AD 标记的
timestamp数据。 -
不支持早于 1883-11-18 12:00:00 的
timestamp数据。 -
不支持 YEAR 组件中超过 4 位数的
timestamp数据。 -
不支持
timestamp列的Infinity/-Infinity输入字符串。
-
-
下面是使用
interval时的限制:- 不支持从
interval类型列捕获混合符号interval数据。您可以在提取参数文件中使用DBOPTIONSALLOWNONSTANDARDINTERVALDATA来捕获混合符号interval数据(或 Oracle GoldenGate 不支持的任何其他格式的interval数据)作为字符串(而不是标准interval数据)。
以下是在提取参数文件中使用
DBOPTIONSALLOWNONSTANDARDINTERVALDATA时写入线索文件的数据的几个示例:-
+1026-9 +0 +0:0: 22.000000被解释为 1026 年、9 个月、0 天、0 小时、0 分钟、22 秒。 -
-0-0 -0 -8解释为 0 年、0 个月、0 天、-8 小时。 -
+1-3 +0 +3:20解释为 1 年 3 个月 0 天 3 小时 20 分钟。
- 不支持从
-
复制:如果使用
DBOPTIONSALLOWNONSTANDARDINTERVALDATA捕获源间隔数据并将其作为字符串写入线索,则允许将相应的源列映射到目标上的char或binary类型列。 -
date限制如下:-
不支持数据中包含 BC 或 AD 标记的
date数据。 -
不支持
date列的Infinity/-Infinity输入字符串。
-
-
text、json、xml、bytea、char (>8191)、varchar (>8191)列被视为 LOB 列,并具有以下限制:-
使用
GETUPDATEBEFORES时,从不记录 LOB 列的以前映像。 -
使用
NOCOMPRESSUPDATES时,仅当修改了LOB列时,才会将其记录在后面的映像中。
-
-
浮点数对范围和精度的支持取决于主机。一般来说,精度精确到 16 位有效数字,但应查看数据库文档以确定预期的近似值。Oracle GoldenGate 舍入或截断超过支持精度的值。
不支持的 PostgreSQL 数据类型
Oracle GoldenGate for PostgreSQL 不支持以下数据类型:
-
box -
bpchar -
circle -
Composite Types -
Domain Types -
line -
lseq -
Object Identifiers Types -
path -
pg_lsn -
pg_snapshot -
point -
polygon -
Pseudo-Types -
Range Types -
User-defined Types (UDTs) -
Oracle GoldenGate 不支持 https://www.postgresql.org/docs/current/contrib.html 上列出的扩展和附加提供的模块,除非在支持的 PostgreSQL 数据类型下明确列出。注:如果提取参数文件包含的数据类型不受支持的表,则提取将停止并显示错误消息。要恢复复制,请从提取文件中删除该表,或从数据类型为不受支持的表中删除该列。
PostgreSQL 支持的对象和操作
-
Oracle GoldenGate for PostgreSQL 仅支持 DML 操作(插入/更新/删除)。不支持 DDL 复制。
-
Oracle GoldenGate for PostgreSQL 支持从 PostgreSQL 11 及更高版本开始复制截断操作,并且需要在提取和复制中提供
GETTRUNCATES参数。 -
仅
pgoutput plugin支持多个截断操作。 -
Case-Sensitive/Insensitive names(区分大小写/不区分大小写的名称)使用方法:
-
无引号的名称不区分大小写,并且隐式为小写。例如,
CREATE TABLE MixedCaseTable和SELECT * FROM mixedcasetable等效。 -
带引号的表名和列名区分大小写,需要在提取和复制以及 Oracle GoldenGate 命令中正确列出。
例如,需要使用
TABLE appschema."MixedCaseTable"和ADD TRANDATA appschema."MixedCaseTable"来支持区分大小写的表名。 -
表、视图和实体化视图
要包括在捕获和传送中的表必须满足以下要求,并且只能包括支持的 PostgreSQL 数据类型下列出的数据类型。
-
Oracle GoldenGate for PostgreSQL 支持从用户表捕获事务性 DML,并交付到用户表。
-
Oracle GoldenGate for PostgreSQL,版本 21.14.0.0.0 及更高版本,支持捕获和传送到基本分区表。要从 PostgreSQL 分区表捕获数据,所有分区的 "Replica Identity"(副本标识)设置必须与基本分区表的 "Replica Identity"(副本标识)设置相匹配。这也适用于多级别分区表。
您可以选择以下方式之一来设置此配置:
-
对基分区表的所有分区或所需的分区运行
ADD TRANDATA命令:ADD TRANDATA *partition-name* ALLCOLS -
对基本分区表的所有分区或必需的分区运行
ALTER TABLE命令:ALTER TABLE *partition-name* REPLICA IDENTITY *replica-identity-setting*
-
-
对象名称(表 /schema/database/column 名称)和列数据支持全球化。
-
支持实体化视图的捕获和交付。
-
提取流程支持实体化视图,实体化视图必须具有唯一的索引,并且必须同时刷新。
-
实体化视图的副本标识必须设置为
FULL,以便支持CDR, UNIFIED FORMAT RECORD和NOCOMPRESSDELETES, GETUPDATEBEFORES。此外,实体化视图需要使用副本标识FULL设置来处理WAL DELETE记录。如果实体化视图的副本标识未设置为FULL,则提取不会处理DELETE记录。要将副本标识设置为 FULL,请使用以下命令:
add trandata *schema.materialized_view*, ALLCOLS -
UPDATE或PK UPDATE的统计信息将记录为DELETE,后跟INSERT。虽然这在提取统计信息中显示异常,但在比较源和目标实体化视图数据时,数据同步是正确的。 -
PK UPDATE将生成DELETE,后跟INSERT,因此提取统计信息将显示的方式与数据库行计数不同。您必须依靠数据比较工具来检查包含实体化视图记录的源数据与目标数据之间的数据完整性。 -
复制进程无法将线索中的数据应用于实体化视图。您可以改为将实体化视图数据从线索映射到任何其他表。
限制
-
Oracle GoldenGate for PostgreSQL 不支持捕获和交付视图。
-
Oracle GoldenGate for PostgreSQL 不支持从分区表的单个分区捕获。
序列和标识列
-
对于单向、双向和多方向实现,源表和目标表都支持序列。
-
使用
GENERATED BY DEFAULT AS IDENTITY子句创建的身份列在源表和目标表上受支持,可用于单向、双向和多方向实施。 -
使用
GENERATED ALWAYS AS IDENTITY子句创建的身份列在目标数据库表中不受支持,并且应从目标表中删除身份属性或将其更改为GENERATED BY DEFAULT AS IDENTITY。 -
对于双向和多向实施,请定义 Identity 列和序列,其
INCREMENT BY值等于配置中的服务器数,每个列和序列的MINVALUE不同。例如,双向双数据库配置的
MINVALUE/INCREMENT BY值如下所示:Database1,将
MINVALUE设置为 1,将INCREMENT BY设置为 2。Database2,将
MINVALUE设置为 2,将INCREMENT BY设置为 2。例如,多方向三数据库配置的
MINVALUE/INCREMENT BY值如下所示:Database1,将
MINVALUE设置为 1,将INCREMENT BY设置为 3。Database2,将
MINVALUE设置为 2,将INCREMENT BY设置为 3。Database3,将
MINVALUE设置为 3,将INCREMENT BY 设置为 3。