ora_migrator是一款用于Oracle到PostgreSQL的遷移工具,支持max_long參數設置和復制功能。適用于Oracle 9.5或更高版本,需要安裝oracle_fdw和db_migrator擴展,并創建外部服務器用...
將 Oracle 數據庫遷移到 PostgreSQL 時,過程很難會一帆風順。這種情況下,選擇一款好用的遷移工具,就顯得尤為重要了。
介紹
ora_migrator是一個用于db_migrator的插件,它使用oracle_fdw將 Oracle 數據庫遷移到 PostgreSQL。
請閱讀db_migrator文檔以獲取使用說明;本文僅涵蓋插件的設置以及一般文檔中未涵蓋的其他功能。
除此之外,ora_migrator還提供從 Oracle 到 PostgreSQL 的復制功能,可用于從 Oracle 進行幾乎零停機時間的遷移。有關詳細信息,請參閱復制。
請注意,由于 Oracle 中的模式名稱通常為大寫,因此,您需要為db_migrator函數的only_schemas參數,使用大寫的模式名稱。
選項
以下選項可用于db_migrate_prepare、db_migrate_mkforeign和db_migrate:
? max_long(整型,默認值 32767):將用于在外表上設置max_long選項。這決定了 LONG、LONG RAW 和 XMLTYPE 列的最大長度。
前提條件
? 您需要 PostgreSQL 9.5 或更高版本。
? 必須安裝oracle_fdw和db_migrator擴展。
? 必須為訪問的 Oracle 數據庫定義好外部服務器。
? 調用create_oraviews函數以創建外部表的用戶,必須具有外部服務器的USAGE權限。
? 調用create_oraviews函數的用戶必須存在用戶映射。
? 用戶映射中使用的 Oracle 用戶,必須具有讀取以下 Oracle 系統視圖的權限:您可以選擇改為授予用戶SELECT ANY DICTIONARY系統權限,它包括了上述所有權限。
? DBA_COL_PRIVS
? DBA_CONS_COLUMNS
? DBA_CONSTRAINTS
? DBA_IND_COLUMNS
? DBA_IND_EXPRESSIONS
? DBA_INDEXES
? DBA_MVIEWS
? DBA_MVIEW_LOGS
? DBA_PROCEDURES
? DBA_SEGMENTS
? DBA_SEQUENCES
? DBA_SOURCE
? DBA_TAB_COLUMNS
? DBA_TAB_PRIVS
? DBA_TABLES
? DBA_TRIGGERS
? DBA_USERS
? DBA_VIEWS
? 要使用復制,用戶必須具有CREATE TABLE和CREATE TRIGGER權限。若要對不屬于指定 Oracle 用戶的表使用復制,該用戶必須具有CREATE ANY TABLE、CREATE ANY INDEX、CREATE ANY TRIGGER、DROP ANY TABLE、DROP ANY TRIGGER和SELECT ANY TABLE權限(這是創建、刪除日志記錄表和觸發器所必需的)。
擴展創建的對象
遷移函數
db_migrator回調函數db_migrator_callback(),返回擴展提供的遷移函數。有關詳細信息,請參閱db_migrator文檔。
“元數據視圖創建函數”create_oraviews,會在 FDW 階段創建一些附加對象,這些對象提供了對 Oracle 遷移有幫助的信息:
包定義
packages (
schema text NOT NULL,
package_name text NOT NULL,
is_body boolean NOT NULL,
source text NOT NULL
)
? is_body,對于包規范定義是FALSE,對于包體定義是TRUE
此視圖可用于簡化包對象的轉換。
段
segments (
schema text NOT NULL,
segment_name text NOT NULL,
segment_type text NOT NULL,
bytes bigint NOT NULL
)
該外表對于評估 Oracle 中表和索引的大小最有用。
遷移成本估算
migration_cost_estimate (
schema text NOT NULL,
task_type text NOT NULL,
task_content bigint NOT NULL,
task_unit text NOT NULL,
migration_hours integer NOT NULL
)
? task_type可以是tables、data_migration、functions、triggers、packages和views之一。
? task_content是該類型的任務數量
? task_unit是task_content的單位
? migration_hours是對完成此任務可能需要的小時數的一個粗略估計
該視圖有助于評估一個 Oracle 數據庫的遷移成本。
其他對象
表函數 oracle_test_table
此函數測試一個 Oracle 表是否存在潛在的遷移問題。您必須在db_migrate_prepare之后運行它。
參數為:
? server:Oracle 外部服務器的名稱
? schema:模式名稱
? table_name:表名
? pgstage_schema(默認是pgsql_stage):由db_migrate_prepare創建的 PostgreSQL 階段的名稱。
schema和table_name必須是 PostgreSQL 階段中與tables表同名的列中的值。
這是一個表函數,返回有問題的行在 Oracle 中的 ROWID,以及一條描述問題的消息。
目前測試發現有兩個問題:
? 字符串列中的零字節chr(0)
? 不在數據庫編碼中的字符串列中的值
函數 oracle_migrate_test_data
此函數對 PostgreSQL 暫存模式中的所有表調用oracle_test_table,并將結果記錄在 FDW 階段的test_error表中(在清空表后)。
此外,在 FDW 階段,會有一份錯誤摘要添加到表test_error_stats中。在清理 Oracle 中的臟數據時,這對于衡量隨時間推移的進度非常有用。
該函數會返回遇到的錯誤總數。
函數參數為:
? server:Oracle 外部服務器的名稱
? staging_schema(默認是fdw_stage):遠程暫存模式的名稱
? pgstage_schema(默認是pgsql_stage):由oracle_migrate_prepare創建的 PostgreSQL 階段的名稱。
? only_schemas(默認是NULL):應遷移到 PostgreSQL 的 Oracle 模式名稱數組。如果為 NULL,則會處理除 Oracle 系統模式之外的所有模式。名稱必須與它們出現在 Oracle 中的名稱相同,通常為大寫。
表 oracle_test_table 和 test_error_stats
這些表包含運行oracle_migrate_test_data生成的單個結果和匯總結果。
復制函數
函數 oracle_replication_start
此函數在 Oracle 和 PostgreSQL 數據庫中創建復制所需的所有對象。PostgreSQL 對象將創建在 Postgres 暫存模式中,Oracle 對象與復制的表位于同一模式中。
此函數應在db_migrate_tables之前調用,并且在啟動oracle_replication_start和調用db_migrate_tables之間,不應在 Oracle 上發生任何數據修改活動。
函數參數為:
? server:Oracle 外部服務器的名稱
? pgstage_schema(默認是pgsql_stage):由oracle_migrate_prepare創建的 PostgreSQL 階段的名稱
該函數創建的對象包括:
? 一個 PostgreSQL 外表__ReplicationEnd,該表會顯示一個時間戳,保證能早于 Oracle 上最老的活躍事務
? 一個 PostgreSQL 表__ReplicationStart,用于存儲下一次復制追趕的起點
對于 Postgres 階段的tables表中設置migrate為TRUE的每個表,將創建以下對象:
? 一個 Oracle 表__Log_<tablename>,用于收集對<tablename>的更改
? 一個在<tablename>上面的 Oracle 觸發器__Log_<tablename>_TRIG
? Oracle 記錄更改的日志表,在 PostgreSQL 上的外表__Log_<schema>/<tablename>
函數 oracle_catchup_table
將特定時間間隔內更改的數據,從 Oracle 表復制到 PostgreSQL。
這要求oracle_replication_start已創建所需的對象,并且數據遷移已完成。
參數:
? schema:遷移表的模式
? table_name:遷移表的名稱
? from_ts:復制該時間點以后的更改
? to_ts:復制該時間點以前(包括該時間點)的更改
這是一個“底層”函數,由oracle_replication_catchup調用;如果要通過為不同的表并發運行它,來并行化追趕任務,則可以使用它。
函數 oracle_catchup_sequence
參數:
? schema:遷移序列的模式
? sequence_name:遷移序列的名稱
? staging_schema(默認是fdw_stage):遠程暫存模式的名稱
在遠程端查詢 Oracle 序列的當前值,并將遷移的序列設置為該值。
函數 oracle_replication_catchup
復制自上次同步到 PostgreSQL 以后所有 Oracle 表和序列中的所有更改。
開始時間戳取自__ReplicationStart,結束時間戳取自__ReplicationEnd(包含最近的安全時間戳)。成功完成后,復制結束時間將保存到__ReplicationStart,以便下次使用。
參數:
? staging_schema(默認是fdw_stage):遠程暫存模式的名稱
? pgstage_schema(默認是pgsql_stage):由oracle_migrate_prepare創建的 PostgreSQL 階段的名稱
您可以在oracle_replication_start完成后隨時調用此函數。
除非數據庫中沒有觸發器或外鍵約束,否則應在調用此函數時,將配置參數session_replication_role設置為replica。這樣就不會觸發觸發器,并且不會檢查外鍵約束。
oracle_replication_catchup在 Oracle 上使用SERIALIZABLE隔離級別,因此它可以看到 Oracle 數據庫的固定快照,并且數據在 PostgreSQL 端是一致的,即使 Oracle 數據庫被其他并發的會話修改。
如果要使用復制進行接近零停機時間的遷移,請在短時間內連續調用兩次,并確保在第二次調用期間 Oracle 上沒有數據修改活動。第二次追趕完成后,您可以立即將應用程序切換到 PostgreSQL。
函數 oracle_replication_finish
刪除 PostgreSQL 和 Oracle 中由oracle_replication_start創建的所有對象。
這可用于在完成從 Oracle 的遷移后進行清理。
? server:Oracle 外部服務器的名稱
? pgstage_schema(默認是pgsql_stage):由oracle_migrate_prepare創建的 PostgreSQL 階段的名稱
限制
并非所有 Oracle 分區選項都受ora_migrator支持。PostgreSQL 僅支持列表、哈希和范圍分區,不支持其他分區策略。此外,不支持使用兩列或更多列的分區鍵進行列表和范圍分區。當ora_migrator遇到一個無法遷移的分區模式時,會將該表遷移到一個非分區表。
復制
ora_migrator提供了一個從 Oracle 到 PostgreSQL 的簡單的基于觸發器的復制功能。
這可用于將數據庫從 Oracle 遷移到 PostgreSQL,幾乎沒有停機時間。
操作步驟如下:
? 按照db_migrator文檔中所述,通過調用db_migrate_prepare和db_migrate_mkforeign來準備遷移。
? 暫停 Oracle 數據庫上的所有數據修改活動。這是需要的,因為 Oracle 不支持事務性 DDL。
? 然后調用oracle_replication_start以設置所有必需的對象。這將在 Oracle 數據庫中創建日志表和觸發器。
? 然后像往常一樣使用db_migrate_tables開始數據遷移。一旦db_migrate_tables啟動,Oracle 數據庫上的數據修改活動就可以恢復。遷移將使用SERIALIZABLE事務隔離級別運行,因此遷移的數據將是一致的。請確保 Oracle 上有足夠的 UNDO 存儲空間,否則數據遷移可能會失敗。
? 使用db_migrate_constraints遷移約束和索引;按照db_migrator文檔中所述,遷移其他對象。
? 您可以隨時調用oracle_replication_catchup,以將更改的數據從 Oracle 傳輸到 PostgreSQL。這需要為所有受影響的表調用oracle_catchup_table,因此要并行化操作,您可以直接為所有受影響的表調用下層的函數。請注意,追趕時不會清理 Oracle 上的日志表。為避免 PostgreSQL 中的外鍵約束問題,請在運行oracle_catchup_table時,確保將配置參數session_replication_role設置為replica。對于接近零停機時間的遷移,在 Oracle 數據庫上沒有數據修改活動時,還必須執行最后一次oracle_replication_catchup調用。調用后,將應用程序切換到 PostgreSQL。
? 要結束復制,請調用oracle_replication_finish。這將會刪除為復制創建的所有對象。
? 最后,調用db_migrate_finish,以刪除所有輔助對象。
歡迎添加下面的微信,拉你進微信群交流 PostgreSQL 技術。
需要復制文章中的源碼,或者訪問引用的網頁鏈接,請點擊左下角閱讀原文。對文章中的內容有疑問或者改進建議,歡迎您在下方留言。
原文來源:https://mp.weixin.qq.com/s/eFzRkQwp8mOE-2qhNwz0pA
來源:本文內容搜集或轉自各大網絡平臺,并已注明來源、出處,如果轉載侵犯您的版權或非授權發布,請聯系小編,我們會及時審核處理。
聲明:江蘇教育黃頁對文中觀點保持中立,對所包含內容的準確性、可靠性或者完整性不提供任何明示或暗示的保證,不對文章觀點負責,僅作分享之用,文章版權及插圖屬于原作者。
Copyright?2013-2024 JSedu114 All Rights Reserved. 江蘇教育信息綜合發布查詢平臺保留所有權利
蘇公網安備32010402000125
蘇ICP備14051488號-3技術支持:南京博盛藍睿網絡科技有限公司
南京思必達教育科技有限公司版權所有 百度統計