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