基於 FDW 的快照¶
概述¶
所有連接器都支援基於 Debezium 的初始快照,該快照可將遠端表格模式移轉到 PostgreSQL,無論是否包含初始資料(取決於所使用的快照模式)。這種方法在大多數情況下都有效,但當需要遷移大量資料表時,可能會出現效能問題,並且會透過 JNI 呼叫引入額外的開銷。如果來源資料庫(例如 Oracle)支援 "FLASHBACK" 查詢,則可以使用外部資料包裝器 (FDW) 實作相同的初始快照。 "FLASHBACK"查詢可以確保快照遷移到某個 "偏移"(Oracle 中的 SCN),從而確保到某個時間點的讀取一致性,然後從該時間點開始 CDC 串流傳輸。
目前,我們僅支援使用 oracle_fdw 作為原生 Openlog Replicator (OLR) 連接器的 Debezium 快照的替代方案。未來,如果可行的話,我們可能會添加對其他連接器的支援。若要使用基於 FDW 的快照,只需將 GUC 參數 synchdb.olr_snapshot_engin 設定為 "fdw" 。請參閱此處 以取得建置和安裝 oracle_fdw 的快速指南。
基於 FDW 的快照如何運作¶
基於 FDW 的快照大約包含 10 個步驟:
1. 準備¶
此步驟檢查 oracle_fdw 是否已安裝且可用,並根據 synchdb_add_conninfo 建立的連接器資訊建立 server 和 user 對應。
2. 建立 Oracle 物件視圖¶
此步驟在 PostgreSQL 中,在單獨的模式(例如 ora_obj)中建立多個外部表。這些外部表(查詢時)透過 oracle_fdw 連接到 Oracle,並取得 Oracle 上大多數(如果不是全部)可用的物件。這些對象包括:
- 表
- 列
- 鍵
- 索引
- 函數
- 序列
- 視圖
- 觸發器
- 等等
SynchDB 無需考慮每個物件即可完成初始快照;它僅考慮 "表"、 "列" 和 "鍵" 物件來建立 PostgreSQL 中的表。
3. 建立外部表以取得目前 SCN¶
此外部表(查詢時)將連接到 Oracle 並取得目前 SCN 值。此值將作為初始快照的 "截止" 點。此點之後的新變更將不包含在快照中。
4.建立所需外部表格清單¶
此步驟的目標是建立一個新的暫存模式(例如 ora_stage),並基於下列條件為快照建立所需的外部表:
- 步驟 2 中建立的 Oracle 物件視圖
- SynchDB 在
synchdb_conninfo中的data->'snapshottable'參數 -> 這是 SynchDB 執行快照所需的資料表的篩選器。如果設定為null,則所有表都將被視為快照。 - 額外的資料類型映射,如
synchdb_objmap中所述 - 步驟 3 中獲得的截止 SCN
此步驟結束時,暫存模式將包含具有 AS OF SCN xxx 屬性的外部表,其資料類型根據 SynchDB 的資料類型對應規則進行對應。這些外部表將僅傳回 SCN 集之前的數據,並且仍然需要 oracle_fdw 連接到 Oracle。
5.物化模式¶
此步驟的目標是僅物化步驟 4 中建立的表模式(將外部表轉換為真正的 PostgreSQL 表),並將其放入新的目標模式(例如 dst_stage)。因此,在此步驟結束時,目標模式將包含與暫存模式中結構相同的真實表。
6. 遷移主鍵¶
基於步驟 2 中建立的 Oracle 物件視圖,對步驟 5 中建立的物化表執行 ALTER TABLE ADD PRIMARY KEY 命令,以根據需要新增主鍵。
7. 應用列名映射¶
基於 synchdb_objmap 中所述的列名映射,對步驟 5 中建立的物化表執行 ALTER TABLE RENAME COLUMN 命令,以根據需要更改列名。
8.使用轉換遷移資料¶
此步驟的目標是將表格資料從暫存區遷移到目標模式,並執行 synchdb_objmap 中描述的任何值轉換,大致如下:
- 遠端查詢
- 数据轉換
- 本地插入
9. 應用表名映射¶
資料遷移完成後,SynchDB 將套用 synchdb_objmap 中所描述的表名映射。之所以最後執行此操作,是因為表名映射可能會將表移動到我們不希望在物化過程中發生的其他模式。
10. 完成初始快照¶
此時初始快照即視為完成。此步驟將執行下列清理操作:
- 刪除步驟 1 中建立的伺服器和使用者映射
- 刪除步驟 2 中建立的 Oracle 物件視圖
- 刪除步驟 4 中建立的暫存模式
- 刪除步驟 3 中建立的外部表以傳回目前 SCN
步驟 5 中建立的目標模式中的表格是初始快照的最終結果。