Ora2Pg:將Oracle遷移到PostgreSQL的免費工具

banq發表於2020-09-27

Ora2Pg是一個免費工具,用於將Oracle或MySQL資料庫遷移到PostgreSQL相容模式。它連線Oracle資料庫,自動對其進行掃描並提取其結構或資料,然後生成可載入到PostgreSQL資料庫中的SQL指令碼。
Ora2Pg可以用於從反向工程Oracle資料庫到大型企業資料庫的遷移,也可以用於將一些Oracle資料複製到PostgreSQL資料庫中。除了提供連線到Oracle資料庫所需的引數外,它確實非常易於使用,並且不需要任何Oracle資料庫知識。
功能包括
  • 匯出具有唯一,主,外來鍵和檢查約束的完整資料庫架構(表,檢視,序列,索引)。
  • 匯出使用者和組的授予/特權。
  • 匯出範圍/列表分割槽和子分割槽。
  • 匯出表選擇(透過指定表名稱)。
  • 將Oracle模式匯出到PostgreSQL 8.4+模式。
  • 匯出預定義的函式,觸發器,過程,程式包和程式包主體。
  • 匯出完整資料或遵循WHERE子句。
  • 完全支援將Oracle BLOB物件作為PG BYTEA。
  • 將Oracle檢視匯出為PG表。
  • 匯出Oracle使用者定義的型別。
  • 提供從PLSQL程式碼到PLPGSQL的一些基本的自動轉換。
  • 適用於任何平臺。
  • 將Oracle表匯出為外部資料包裝器表。
  • 匯出物化檢視。
  • 顯示有關Oracle資料庫內容的詳細報告。
  • Oracle資料庫的遷移成本評估。
  • Oracle資料庫的遷移難度級別評估。
  • 檔案中PL / SQL程式碼的遷移成本評估。
  • 儲存在檔案中的Oracle SQL查詢的遷移成本評估。
  • 生成要與Penthalo Data Integrator(Kettle)一起使用的XML ktr檔案
  • 將Oracle定位器和空間幾何匯出到PostGis。
  • 將DBLINK匯出為Oracle FDW。
  • 將SYNONYMS匯出為檢視。
  • 將DIRECTORY匯出為ex​​ternal_file副檔名的外部表或目錄。
  • 完全MySQL匯出,就像Oracle資料庫一樣。

 

HN討論
我已經使用它來遷移一些應用程式。它工作得很好。此外,“ orafce”副檔名還有助於減少對應用程式進行的實際SQL查詢的必要更改。
在我的情況下,應用程式相對簡單,但是許多查詢顯式地使用了序列,並且缺乏通用語法,這有一點痛苦。
 
Oracle實際上提供了一個出色的資料庫產品,它具有非常好的複製/故障轉移功能和非常好的效能。這不是一個不好的資料庫,並且擴充套件性非常好。與您可能獲得的任何好處相比,Oracle資料庫許可證的價格簡直太高了。
 
Oracle或Microsoft RDBMS的許可成本與其所支援的專案成本相比微不足道,而且很容易找到價值所在。這些公司提供的功能和管理工具使大規模執行RDBMS的所有困難(群集,故障轉移/複製,統計資訊收集,計劃管理,監視,線上索引重建,表分割槽...)都變得容易。為此新增真正的體面支援,您將獲得非常明確的價值主張。
Postgres例項將需要更多的管理經驗,並且需要對資料庫引擎的工作方式有更深入的瞭解。在較小的規模上,這些因素不太可能引起問題,並且許多組織不太可能真正達到大規模(許多TB例項,每秒執行數百或數千個事務)。但是,如果要開始擴充套件RDBMS應用程式,則將不得不以一種或另一種方式來應對這些成本。在此之後,許可昂貴的功能可能比部署更多的專業勞動力看起來更好。
 
最近,我們使用Org2Pg將我們的Oracle資料庫(已經使用了15年)移動到Postgres。即使使用Ora2Pg,我們也花了2年的時間。

  1.  Ora2Pg將建立一個檔案,其中包含Postgres格式的所有表,列,索引,鍵等。不幸的是,這很不錯,但是我們發現我們必須進行大量的手動調整才能使其真正可用。例如,它確實是選擇正確的資料型別的最佳猜測,但是我們不同意它的所有選擇,因此我們必須仔細檢查每個選擇並確定需要更改的資料。另外,在Oracle和Postgres上設定主鍵的方式也大不相同Ora2Pg採用字面翻譯來翻譯如何設定Oracle主鍵,而不是使用Postgres方式-因此我們必須修復所有這些。
  2. 它不能真正轉換函式和觸發器。所有這些都必須手工重寫。
  3. 要花費大量時間進行調整和實驗,才能使Ora2Pg在相當長的時間內傳輸資料。我們的第一次嘗試聽了將近24聲。我們最終將其調整到大約一個小時。
  4. 您仍然需要將所有SQL查詢重寫為Postgres格式。這是花費時間最多的部分,因為我們有大約5,000個查詢,並且每個查詢都必須進行檢查。
  5. 最大的痛苦是,在資料庫遷移正在進行的過程中,我們無法停止開發。因此,每次對Oracle資料庫進行更改時,我們都必須手動對Postgres DDL檔案進行相同的更改。

嘆。我很高興這個專案在我身後。我再也不想參與類似的事情了。這是完全值得的(與Oracle相比,Postgres是一個與之合作的夢想),但是過程卻是一場噩夢。
有關將查詢從Oracle轉換為Postgres的一些說明:
  • 在Postgres中,“ foo IN(a,b,c)”通常可以更好地作為“ foo = ANY(ARRAY [a,b,c]))”進行處理-尤其重要的是,您可以轉換為傳入可變大小的陣列必須為每一個構造一個特殊的語句。
  • 要對函式的結果進行排序,請考慮使用子選擇。“ SELECT foo FROM(選擇fun(z)作為blaz的foo)tmp順序為1”。
  • 用coalesce替換nvl
  • 用LIMIT 1替換rownum <= 1
  • 用string_agg替換listagg
  • 用遞迴替換遞迴層次結構(以/開頭/先於/先於)
  • 用except代替減號
  • 用CURRENT_TIMESTAMP替換SYSDATE
  • 將trunc(sysdate)替換為CURRENT_DATE
  • 用DATE(datelastupdted)或datelastupdated :: date替換trunc(datelastupdated)
  • 用'-infinity':: date替換諸如to_date('01 Jan 1900')之類的人工日期標記/圍欄
  • 刪除雙表引用
  • 用case語句替換解碼
  • 用獨特替換獨特
  • 用:: integer替換to_number
  • 用〜或〜*替換regexp_like()
  • 用%運算子替換mod
  • 用INSERT ... ON CONFLICT… DO UPDATE/NOTHING替換merge
  • 使用sys_guid()作為gen_random_uuid()的預設值來更改任何表的預設值
  • oracle的pivot 和unpivot在postgres中不起作用-使用unnest
  • ORDER BY NLSSORT(english, 'NLS_SORT=generic_m') 變為ORDER BY gin(insensitive_query(english) gin_trgm_ops)
  • 用U&'替換UNISTR(
  • Oracle:使用IS NULL檢查空字串;postgres使用空字串和null是不同的
  • 如果varchar / text列具有唯一索引,則需要檢查以確保在新增或更新列之前將空字串更改為null。
  • PostgreSQL需要一個用括號括起來的子SELECT,並且必須為其提供一個別名。-- SELECT * FROM ( ) A
  • order by子句中的所有函式都必須移至select語句(例如,order by lower(column_name))
  • 任何數字/整數/ bigint /等排序。IN語句中的內容不能為字串(包括'null'-不必費心嘗試使用null =“”,它就行不通)。
  • 將NULL與NOT NULL串聯將導致NULL。
  • 注意任何左聯接。如果在where或select子句中使用左連線中的列,則該列可能為null。
  • 對於序列,請使用nextval('sequence_name')而不是sequence_name.nextval

 
從Oracle遷移到Postgres時,還有其他一些非常方便的工具:
Orafce-捆綁在Oracle函式中的擴充套件-https: //github.com/orafce/orafce
OracleFDW-外部資料包裝器,可直接從Postgres查詢到Oracle- https://github.com/laurenz/oracle_fdw


 

相關文章