PostgreSQL:支援的資料類型、物件及作業
Oracle GoldenGate for PostgreSQL 支援為支援的 PostgreSQL 資料庫版本擷取及傳遞初始載入和交易資料。
Oracle GoldenGate for PostgreSQL 支援來源資料的對應、篩選及轉換,除非本文件中另有說明,以及將衍生自 Oracle GoldenGate 支援之其他來源資料庫的資料複製到 PostgreSQL 資料庫中。
支援的資料庫
以下是 Oracle GoldenGate for PostgreSQL 支援的資料庫和限制:
-
只支援擷取和傳遞使用者資料庫。
-
Oracle GoldenGate 不支援從存檔日誌擷取。
-
複本、待命資料庫不支援傳遞。
-
複本、待命資料庫也支援擷取。
-
高可用性。請參閱高可用性考量瞭解詳細資訊。
高可用性考量
Oracle GoldenGate 支援從 PostgreSQL 高可用性組態擷取變更資料。此功能僅適用於 PostgreSQL 資料庫版本 16 和更新版本。您可以在主要伺服器或「高可用性」設定中的任何唯讀待命伺服器上設定變更資料擷取。為了避免容錯移轉時可能發生的資料遺失和手動介入,Oracle GoldenGate 建議您使用同步複製設定「高可用性」設定。
請參閱 PostgreSQL 高可用性容錯移轉文件 ID 2818379.1 的 Oracle GoldenGate 程序,瞭解可能發生的資料遺失與手動介入情況的詳細資訊。
若要從「PostgreSQL 高可用性」設定「CDC 擷取」,請執行下列任務:1。您可以將 Extract 設定為從主要伺服器擷取資料,或在「高可用性」設定中擷取唯讀待命伺服器的資料。
-
在某個節點 (主要或待命) 上設定 Extract 時,必須同時在「高可用性」設定中的所有其他節點上建立相同名稱的複製槽,才能開始資料擷取。
-
使用
REGISTER EXTRACT命令在一個伺服器 (設定 Extract 的位置) 上建立複製槽位,如下列範例所示:REGISTER EXTRACT exte -
在註冊 Extract 之後,立即建立同名的複製槽位。您必須在「高可用性」設定中明確設定的所有其他節點上使用相同的複製槽位名稱。
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敘述句。注意:對於在待命伺服器上建立複製槽位的注意事項:嘗試在唯讀待命伺服器上建立複製槽位時 (使用REGISTER EXTRACT命令或pg_create_logical_replication_slot敘述句),只有在高可用性設定中主要伺服器上的任何表格執行某些 DML (可以是任何隨機 DML) 之後,作業才會完成。或者,可以在主要伺服器上啟用活動訊號功能,這可能會導致主要伺服器上必要的 DML 活動,以完成待命伺服器上的複製槽位建立作業。
-
-
PostgreSQL 高可用性設定中的任何唯讀待命伺服器都不支援
ADD TRANDATA或DELETE TRANDATA命令。唯讀待命伺服器上任何表格的REPLICA IDENTITY設定,會與主要伺服器上對應表格的REPLICA IDENTITY設定相同。 -
若要在唯讀待命伺服器上設定資料擷取時使用活動訊號功能,應在主要伺服器上啟用活動訊號功能。
-
在容錯移轉的情況下,應修改擷取參數檔以連線至所需的節點 (根據需求的主要 / 待命),以便在容錯移轉後繼續擷取資料。
範例
假設 PostgreSQL 高可用性叢集中有三個節點,且有對應的連線別名:
Node1 (目前主要) 與對應的連線別名:
node1Node2 (待命) 與對應的連線別名:
node2Node3 (待命) 與對應的連線別名:
node3容錯移轉之前,如果將 Extract 設定為從其中一個節點擷取資料 (例如
node2),則 Extract 參數檔會包含類似下列的項目:USERIDALIAS node2如果容錯移轉,則主要節點 (
node1) 會停止運作,而次要節點 (node2) 會成為新的主要節點,然後可能有兩種可能:-
若要繼續從相同
node2擷取資料,請執行下列動作:-
Extract 參數檔中不需要變更。
-
重新啟動 Extract。
-
-
若要一律從不同的節點擷取資料,請執行下列動作:
-
變更 Extract 參數檔,以連線至想要的節點,例如 Node3。
USERIDALIAS node3 -
重新啟動 Extract。
-
-
支援的 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 和 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 個位元組。 -
Extract 無法處理大小超過 512 MB 之
bytea資料欄的記錄。 -
屬於「主索引鍵」之資料類型
CITEXT的資料欄最多支援 8000 個位元組。不支援大於 8000 個位元組且屬於「主索引鍵」一部分的CITEXT資料欄。 -
Extract 無法處理大小超過 512 MB 之
bytea資料欄的記錄。 -
不支援
decimal: NaN輸入值。 -
下列限制適用於
bit/varbit資料類型:-
支援的長度最多為 4k。對於大於 4k 的長度,資料會被截斷,且只會擷取較低的 4k 位元。
-
來源位元 (n) 資料欄只能套用至非 PostgreSQL 目標的字元類型資料欄,而且可以套用至 PostgreSQL 目標的
char類型或bit/varbit資料欄。
-
-
下列限制適用於時區為
timestamp且不含時區為timestamp:-
不支援資料中含 BC 或 AD 標記的
timestamp資料。 -
不支援早於 1883-11-18 12:00:00 的
timestamp資料。 -
不支援 YEAR 元件中超過 4 位數的
timestamp資料。 -
不支援
timestamp資料欄的Infinity/-Infinity輸入字串。
-
-
以下是使用
interval時的限制:- 不支援從
interval類型資料欄擷取混合符號interval資料。您可以在 Extract 參數檔中使用DBOPTIONSALLOWNONSTANDARDINTERVALDATA來擷取混合符號interval資料 (或 Oracle GoldenGate 不支援的任何其他interval資料格式) 作為字串 (非標準interval資料)。
以下是一些在 Extract 參數檔中使用
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 分鐘。
- 不支援從
-
Replicat:如果使用
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) -
除非在支援的 PostgreSQL 資料類型底下明確列出,否則 Oracle GoldenGate 不支援 https://www.postgresql.org/docs/current/contrib.html 所列的擴充功能和其他提供的模組。注意:如果 Extract 參數檔包含不支援資料類型的表格,則 Extract 會停止並顯示錯誤訊息。若要繼續複製,請將表格從 Extract 檔案中移除,或從具有不支援資料類型的表格中移除資料欄。
PostgreSQL 支援的物件和作業
-
Oracle GoldenGate for PostgreSQL 僅支援 DML 作業 (插入 / 更新 / 刪除)。不支援 DDL 複製。
-
Oracle GoldenGate for PostgreSQL 支援從 PostgreSQL 11 和更新版本開始的截斷作業複製,而且需要 Extract 和 Replicat 中的
GETTRUNCATES參數。 -
pgoutput plugin僅支援多個截斷作業。 -
區分大小寫 / 不區分大小寫的名稱用法:
-
未加引號的名稱不區分大小寫,且隱含小寫。例如,
CREATE TABLE MixedCaseTable和SELECT * FROM mixedcasetable等同於。 -
引號的表格和資料欄名稱區分大小寫,必須正確列示在 Extract 和 Replicat 中,並且使用 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 分割的表格擷取資料,所有分割區的「複本識別」設定必須與基礎分割表格的「複本識別」設定相符。這也適用於多層次分割表格。
您可以選擇下列其中一種方式來設定此組態:
-
在基本分割表格的所有或必要的分割區上執行
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,則 Extract 將不會處理DELETE記錄。若要將「複本識別」設為 FULL,請使用下列命令:
add trandata *schema.materialized_view*, ALLCOLS -
UPDATE或PK UPDATE的統計資料將以DELETE的形式記錄,後面接著INSERT。雖然這會在 Extract 統計資料中顯示異常,但比較來源和目標具體化視觀表資料時,資料同步是正確的。 -
PK UPDATE會產生DELETE後面接著INSERT,因此 Extract 統計資料將會與資料庫資料列計數不同。您必須仰賴資料比較工具來檢查來源與目標資料之間包含具體化視觀表記錄的資料完整性。 -
歷程檔中的資料無法套用至 Replicat 處理作業的具體化視觀表。您可以將歷程檔中的具體化視觀表資料對應至任何其他表格。
限制
-
Oracle GoldenGate for PostgreSQL 不支援擷取及傳遞視觀表。
-
Oracle GoldenGate for PostgreSQL 不支援從分割表格的個別分割區進行擷取。
序列和識別資料欄
-
來源和目標表格支援單向、雙向和多向實行的序列。
-
來源和目標表格支援使用
GENERATED BY DEFAULT AS IDENTITY子句建立的識別資料欄,以進行單向、雙向及多向實行。 -
目標資料庫表格不支援使用
GENERATED ALWAYS AS IDENTITY子句建立的識別資料欄,且應將識別特性自目標表格移除或變更為GENERATED BY DEFAULT AS 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。