您可以使用 Datastream,將 PostgreSQL 資料庫的歷來資料和持續變更複製到目的地,以便進行即時分析及同步處理資料庫。
如要準備在 Datastream 中複製 PostgreSQL,請參閱複製行為、支援的版本和資料庫類型、最佳做法、唯讀副本需求和已知限制。
行為
來源 PostgreSQL 資料庫仰賴邏輯解碼功能。邏輯解碼會公開所有提交至資料庫的變更,並允許使用輸出外掛程式,以容易使用的格式使用及處理這些變更。Datastream 使用 pgoutput 外掛程式,這是 PostgreSQL 10 以上版本的標準 PostgreSQL 邏輯解碼外掛程式。
- 您可以選取指定 PostgreSQL 來源的所有結構定義或特定結構定義,以及結構定義中的所有資料表或特定資料表。
- 所有歷來資料都會複製。
- 所有 data manipulation language (DML) 變更都會複製,例如從指定資料庫和資料表插入、更新及刪除資料。
- 只有已修訂的變更會複製。
- 如果您在資料表上定義 REPLICA IDENTITY,Datastream 會將指定資料欄視為主鍵。
- Datastream 連線至主要執行個體時,會定期傳送活動訊號訊息至來源資料庫。因此,邏輯解碼訊息事件 (
op:"m") 會直接插入 WAL 檔案。Datastream 需要這些訊息,才能確保來源可用性及計算資料更新程度。如果使用唯讀副本做為來源,則必須從外部設定心跳訊息。詳情請參閱「從唯讀副本複製」。如果其他複製設定會從同一個來源資料庫讀取資料,建議您將這點納入考量。
版本
Datastream 支援 PostgreSQL 10 以上版本。
Datastream 支援下列類型的 PostgreSQL 資料庫:
- 自行託管的 PostgreSQL
- PostgreSQL 適用的 Cloud SQL
- AlloyDB for PostgreSQL
- AlloyDB Omni
- PostgreSQL 適用的 Amazon RDS
- Amazon Aurora PostgreSQL
免費方案
Datastream 可讓您使用免費方案,將 AlloyDB for PostgreSQL 的資料串流至 BigQuery,每月最多可免費提供 100 GiB 的變更資料擷取資料。詳情請參閱 Datastream 定價。
最佳做法
本節說明設定 PostgreSQL 來源,以便與 Datastream 搭配使用的建議最佳做法。
使用多個串流,避免隊頭阻塞
如果是 PostgreSQL 來源,Datastream 會為整個串流使用單一邏輯複製槽。如果對一個高流量資料表執行大型交易或多項更新,可能會延遲同一串流中所有其他資料表的資料複製作業。
為避免發生隊頭阻塞,請為不同的資料表組合建立個別串流。例如,您可以為高用量資料表建立一個串流,並為低用量資料表建立另一個串流。這樣可以隔離高流失率的資料表,避免其他資料表的複製作業延遲。
建議:找出寫入 (INSERT/UPDATE/DELETE) 速率極高的資料表,並將其放入專屬的 Datastream 串流,並使用獨立的複製槽。
避免長時間執行的交易
長時間執行的交易可能會導致 WAL 記錄累積。由於 WAL 是依序執行,PostgreSQL 必須等到長時間交易完成,才能移除複製運算單元所需的舊 WAL 檔案。這會增加 WAL 磁碟用量。
此外,這可能會降低邏輯解碼速度。這是因為大型交易會將變更溢出至磁碟,導致提交時需要進行緩慢且需要大量 I/O 的重組作業,進而阻礙所有後續交易的複製。建議:在來源資料庫上設定 statement_timeout 和 idle_in_transaction_session_timeout 參數,避免交易執行時間過長。詳情請參閱 PostgreSQL 說明文件。
建立出版品時使用表格篩選功能
如果只複製少數資料表的變更,請務必建立僅包含這些資料表的 PUBLICATION。如果發布作業限定於特定資料表,PostgreSQL 只會有效率地保留複製運算單元中這些資料表的變更。這有助於縮減複製運算單元的大小,並提升邏輯解碼效能。
主動管理複製槽
Datastream 會在 PostgreSQL 主要執行個體上使用邏輯複製運算單元,確保 WAL 檔案會保留到 Datastream 確認已處理完畢為止。如果串流失敗、暫停或刪除,但未捨棄複製槽,PostgreSQL 會無限期保留 WAL 檔案。這可能會填滿資料庫伺服器磁碟,導致正式環境服務中斷。
建議:設定有效率的警告機制,並監控來源 PostgreSQL 伺服器的 WAL 磁碟用量。
正確設定副本身分
REPLICA IDENTITY 設定會指示 PostgreSQL 要將哪些資料寫入 WAL,用於 UPDATE 和 DELETE 事件,讓 Datastream 識別哪些資料列有所變更。
如果使用 BigQuery 做為目的地,請避免將 REPLICA IDENTITY 設為 FULL。Datastream 會將記錄的資料欄做為 BigQuery MERGE 作業的邏輯索引鍵。如果 REPLICA IDENTITY 設為 FULL,且資料表超過 16 欄,則會超出 BigQuery 在 MERGE 作業中對主鍵的 16 欄限制,並中斷串流。
建議 (依偏好順序排列):
- 最佳做法:使用主鍵。
REPLICA IDENTITY DEFAULT的預設設定會自動有效率地使用現有的主鍵。 - 良好:如果沒有主鍵,請建立
UNIQUE NOT NULL索引並設定REPLICA IDENTITY USING INDEX INDEX_NAME。 - 最不建議:僅在沒有專屬 ID 的資料表上使用
REPLICA IDENTITY FULL設定。如果複製到 BigQuery,請留意效能影響、16 欄限制,以及主鍵支援資料類型的限制。
從唯讀副本複製
Datastream 支援從 PostgreSQL 16 以上版本的 PostgreSQL 唯讀副本執行個體複製資料。
如要從唯讀副本進行複製,您必須在主要執行個體上執行下列設定步驟:
- 在主要執行個體上建立發布項目:雖然 Datastream 會連線至唯讀副本,但定義要複製資料的發布項目必須在主要執行個體上建立。
- 設定 WAL 心跳訊號:Datastream 仰賴定期 WAL 心跳訊號訊息,做為檢查點機制。連線至主要執行個體時,Datastream 會處理這些心跳訊號的生成作業。不過,唯讀副本的心跳訊號必須從外部產生。
如要設定定期心跳訊號,其中一種方法是使用 pg_cron 擴充功能,在 PostgreSQL 中建立 cron 工作:
SELECT cron.schedule_in_database(
'datastream-heartbeat', -- Job name
'* * * * *', -- Every minute
$$SELECT pg_logical_emit_message(true, 'datastream', 'cdc heartbeat')$$,
'DATABASE_NAME', -- Change this to your database name
'USERNAME', -- Username to run as
true -- Enabled
);
更改下列內容:
- DATABASE_NAME:要產生心跳訊號的資料庫名稱。
- USERNAME:執行工作的使用者名稱。一般價格:
postgres。
已知限制
將 Datastream 與 PostgreSQL 資料庫搭配做為來源時,已知限制包括:
- 串流最多只能有 10,000 個資料表。
- PostgreSQL 會嚴格拒絕 UTF-8 字串資料欄中的 NULL 位元組 (
0x00)。Datastream 不會移除 NULL 位元組。如果來源字串包含0x00空值位元組,插入批次作業就會失敗,並停止複製。建議您先清除或取代來源資料庫中的CHAR(0)個字元,再進行複製。 - 您無法將 PostgreSQL 串流設為從最新位置開始。
- 如果資料表超過 5 億列,則必須符合下列條件,才能回填:
- 沒有主鍵的資料表必須有 REPLICA IDENTITY。否則,系統只會將
INSERT事件複製到目的地。 - 如果資料表有主鍵,REPLICA IDENTITY 不得設為
FULL或NOTHING。必須設為DEFAULT。 - 系統無法自動偵測來源結構定義的所有變更,因此可能會發生資料損毀。下列結構定義變更可能會導致資料損毀,或無法處理下游事件:
- 捨棄資料欄。
- 在表格中間新增資料欄。
- 變更資料欄的資料類型。
- 重新排序資料欄。
- 捨棄資料表 (如果之後重新建立相同資料表並新增資料,則適用)。
- Datastream 不支援
geometric資料類型的資料欄,例如BOX、CIRCLE、LINE、LSEG、PATH、POINT和POLYGON。這類資料欄會複製為NULL。 - Datastream 不支援
range資料類型的資料欄。 - Datastream 不支援不支援的資料類型陣列 (例如空間類型)、
LTREE陣列、使用者定義資料類型陣列 (包括ENUM),或DATE、TIMESTAMP或TIMESTAMP WITH TIME ZONE(TIMESTAMPTZ) 陣列。Datastream 會在複製期間忽略這類資料欄。 - 2026 年 2 月 17 日前建立的串流:如果資料表的副本識別資訊包含 TOAST 值,Datastream 不支援複製這類資料列的 UPDATE 事件。這類事件會遭到捨棄。在該日期之後建立的串流則不適用這項例外。
- Datastream 不支援複製含有
JSON或JSONB值的資料列,且巢狀物件超過 2950 個。包含這類JSON或JSONB值的事件不會複製到目的地資料庫。 - Datastream 不支援複製
NUMERIC (precision, scale)資料欄中含有NaN值的資料列。這類資料欄中的值會替換為NULL值。 - Datastream 不支援複製 hstore 資料類型的資料欄。這類資料欄中的值會替換為
NULL值。 - Datastream 不支援從 SQL_ASCII 編碼的來源資料庫複製非 ASCII 記錄。這類記錄會遭到捨棄。
- Datastream 不支援複製已定義資料列層級安全性 (RLS) 政策的資料表。如要瞭解如何略過這項限制,請參閱「PostgreSQL 來源行為和限制」。
- 針對使用超大屬性儲存技術 (TOAST) 的可變長度資料類型串流資料欄:
如果未變更的 TOAST 值在
UPDATE作業期間從 WAL 記錄中遭到捨棄,Datastream 會主動查詢來源資料庫,嘗試復原遺失的值。因此,如果發生快速連續更新,或插入後快速刪除的情況,系統可能不會擷取中間的變更。請注意,DELETE作業不會觸發這項主動查詢作業。使用僅限附加寫入模式時,系統會預期擷取所有中繼變更,因此使用 TOAST 的可變長度資料欄限制特別重要。 - Datastream 不會擷取生成資料欄的變更。
- 如果對資料庫執行 PostgreSQL 主要版本升級,Datastream 可能會停止運作,或無法擷取任何新事件。建議您在升級前捨棄複製槽,接著升級資料庫,然後重新建立複製槽。如果串流失敗,請指定新的複製運算單元名稱來復原串流,並在需要資料一致性時執行補充。
- 使用自動化串流設定流程時,Datastream 不支援複製 PostgreSQL 系統資料表。如果您編輯使用自動化流程建立的串流,並新增系統資料表,Datastream 會自動忽略這些資料表,不會複製其中的任何資料或變更。
後續步驟
- 瞭解如何設定 PostgreSQL 來源,以便與 Datastream 搭配使用。