ora2pg使用記錄 前言 這篇文章是我在學習使用ora2pg過程中的學習記錄,以便日後遺忘查閱; 諸君也可跟隨我的步伐瞭解一下ora2pg,或可移步如下官方文檔參考學習:Ora2Pg : Migrates Oracle to PostgreSQL (darold.net) 本文的ora2pg安裝和 ...
ora2pg使用記錄
前言
這篇文章是我在學習使用ora2pg
過程中的學習記錄
,以便日後遺忘查閱;
諸君也可跟隨我的步伐瞭解一下ora2pg
,或可移步如下官方文檔參考學習:Ora2Pg : Migrates Oracle to PostgreSQL (darold.net)
本文的ora2pg
安裝和使用記錄是在win10
系統下遷移遠程Oracle資料庫到遠程PostgreSQL資料庫的應用環境下進行的,如果你的應用場景不同,可簡閱做思路參考!
目錄
目錄初識ora2pg
一、ora2pg是什麼?
Ora2Pg
- Oracle to PostgreSQL database schema converter(Oracle到PostgreSQL資料庫模式轉換器)
Ora2Pg
是一個開源免費的資料庫遷移工具,用於將Oracle
資料庫遷移到PostgreSQL
相容的模式。它連接您的Oracle資料庫,自動掃描並提取其結構或數據,然後生成可以載入到PostgreSQL資料庫中的SQL腳本。Ora2Pg非常易於使用,除了提供連接到Oracle資料庫所需的參數外,不需要任何Oracle資料庫知識。
(一)、Ora2Pg能做的遷移動作如下
TABLE with constraints, VIEW, MVIEW, TABLESPACE, SEQUENCE, INDEXES, TRIGGER, GRANT, FUNCTION, PROCEDURE, PACKAGE, PARTITION, TYPE, INSERT or COPY, FDW, QUERY, KETTLE, SYNONYM
(二)、功能包括
- Export full database schema (tables, views, sequences, indexes), with unique, primary, foreign key and check constraints.
【導出完整的資料庫架構(表、視圖、序列、索引),具有唯一、主鍵、外鍵和檢查約束。】
- Export grants/privileges for users and groups.
【導出用戶和組的授予/許可權。】
- Export range/list partitions and sub partitions.
【導出範圍/列表分區和子分區。】
- Export a table selection (by specifying the table names).
【導出選擇的表格(通過指定表格名稱)。】
- Export Oracle schema to a PostgreSQL 8.4+ schema.
【將Oracle模式導出為PostgreSQL 8.4+模式。】
- Export predefined functions, triggers, procedures, packages and package bodies.
【導出預定義的函數、觸發器、過程、包和包體。】
- Export full data or following a WHERE clause.
【導出完整數據或遵循WHERE子句。】
- Full support of Oracle BLOB object as PG BYTEA.
【完全支持Oracle BLOB對象作為PG BYTEA。】
- Export Oracle views as PG tables.
【將Oracle視圖導出為PG表。】
- Export Oracle user defined types.
【導出Oracle用戶定義的類型。】
- Provide some basic automatic conversion of PLSQL code to PLPGSQL.
【將Oracle表導出為外部數據包裝表。】
- Works on any platform.
【適用於任何平臺。】
- Export Oracle tables as foreign data wrapper tables.
【將Oracle表導出為外部數據包裝表。】
- Export materialized view.
【導出具體化視圖。】
- Show a report of an Oracle database content.
【顯示Oracle資料庫內容的報告。】
- Migration cost assessment of an Oracle database.
【Oracle資料庫的遷移成本評估。】
- Migration difficulty level assessment of an Oracle database.
【Oracle資料庫的遷移難度級別評估。】
- Migration cost assessment of PL/SQL code from a file.
【從文件遷移PL/SQL代碼的成本評估。】
- Migration cost assessment of Oracle SQL queries stored in a file.
【存儲在文件中的Oracle SQL查詢的遷移成本評估。】
- Generate XML ktr files to be used with Penthalo Data Integrator (Kettle)
【生成要與Penthalo Data Integrator(Kettle)一起使用的XML ktr文件】
- Export Oracle locator and spatial geometries into PostGis.
【將Oracle定位器和空間幾何圖形導出到PostGis中。】
- Export DBLINK as Oracle FDW.
【將DBLINK導出為Oracle FDW。】
- Export SYNONYMS as views.
【將SYNONYMS導出為視圖。】
- Export DIRECTORY as external table or directory for external_file extension.
【將DIRECTORY導出為external_file擴展名的外部表或目錄。】
- Dispatch a list of SQL orders over multiple PostgreSQL connections
【通過多個PostgreSQL連接調度SQL訂單列表】
- Perform a diff between Oracle and PostgreSQL database for test purpose.
【通過多個PostgreSQL連接調度SQL訂單列表】
- MySQL/MariaDB and Microsoft SQL Server migration.
【MySQL/MariaDB和Microsoft SQL Server遷移。】
需要註意的是:Ora2Pg盡最大努力將您的Oracle資料庫自動轉換為PostgreSQL,但仍有手動工作要做。為函數、procedures、包和觸發器生成的Oracle特定PL/SQL代碼必須經過審查,以匹配PostgreSQL語法。
二、ora2pg下載安裝及環境配置
(一)、Perl下載安裝
首先因為Ora2Pg是Perl語言編寫的,所以要使用這個工具,則必須為其搭建Perl運行環境。註意:安裝版本要大於等於5.10
Perl下載地址:Strawberry Perl for Windows
下載好如下:
傻瓜式安裝即可,沒有特殊操作。
(二)、Oracle客戶端或完整的Oracle安裝配置
1.1 安裝
必須在系統上安裝Oracle Instant Client或完整的Oracle安裝程式。
進行資料庫遷移工作這些應該都已經安裝了,這裡不做贅述。
如果確實沒有安裝,這裡推薦幾篇相關博文供參考:
註意:這裡由於我的資料庫伺服器都不在本機,這裡我使用的是Oracle客戶端進行的接下來的操作。
如果你的Oracle資料庫在本機,這裡也推薦一篇文章以作參考!
[Windows下Ora2Pg(Oracle到PostgreSQL遷移工具)的安裝配置及使用教程](https://blog.csdn.net/qq_34272470/article/details/128128287#:~:text=使用Ora2Pg 1 1.cmd定位到解壓後的Ora2Pg目錄中,執行下麵的命令使用Perl解析Ora2Pg perl Makefile.PL 2 2.上面的命令執行完成後,會有提示,按照提示執行下麵的命令即可 dmake,get DBD%3A%3AOracle 8 8.安裝DBD%3A%3AOracle驅動 install DBD%3A%3AOracle ... 更多項目)
1.2 配置
在使用ora2pg時,我們需要配置Oracle客戶端(或Oracle)的ORACLE_HOME環境變數,值為客戶端安裝目錄。(這是必須的)
官方文檔:You need to have the Oracle client libraries installed and the ORACLE_HOME environment variable must be defined.
(三)、Ora2Pg安裝配置
Ora2Pg下載地址
- SOURCEFORGE:ora2pg download | SourceForge.net
- GitHub:Releases · darold/ora2pg (github.com)
下載好如下:
1.1 安裝
解壓到任意目錄即可!
1.2 配置(win10下配置)
1.2.1 配置前說明
-
Ora2Pg
連接資料庫併進行遷移動作,DBI
Perl模塊是必須安裝的,並且其版本要大於1.614。 -
Ora2Pg
不僅能夠遷移Oracle資料庫,還可以遷移MySQL、SQL Server等,只需要安裝對應的Perl模塊即可。例如:遷移Oracle -
install DBD::Oracle
遷移MySQL -
install DBD::MySQL
遷移SQL Server -
install DBD::ODBC
有些
ora2pg
發行版可能還需要安裝Time::HiRes
Perl模塊 -
Ora2Pg
可以導出sql腳本供pg資料庫導入執行,也可以直接導入到遠程pg資料庫。要導入sql腳本你還需要安裝PostgreSQL客戶端(psql)
如果你想動態直接導入到PostgreSQL,你至少還需要安裝
DBD::Pg
和Compress::Zlib
Perl模塊預設情況下,
Ora2Pg
生成sql腳本供PostgreSQL客戶端導入執行
1.2.2 Oracle遷移到PostgreSQL環境配置
-
通過cmd進入到
Ora2Pg
安裝目錄,查看Perl版本(Perl版本要大於5.10
) -
將把
Ora2Pg.pm
安裝到Perl庫perl Makefile.PL gmake && gmake install
-
安裝
DBI
Perl模塊cpan get DBI install DBI
-
安裝
DBD::Oracle
Perl模塊官方文檔:Installing DBD::Oracle require that the three Oracle packages: instant-client, SDK and SQLplus are installed as well as the libaio1 library.
可以看到,安裝
DBD::Oracle
還需要Oracle SDK和SQLplus,如果你和我一樣安裝的是精簡版Oracle客戶端,那麼你還需要去官網下載安裝Oracle SDK和SQLplus。下載地址:Instant Client for Microsoft Windows (x64) 64-bit (oracle.com)
直接點擊這裡下載的是最新版本的精簡版客戶端、SQL*Plus、SDK
下載好如下三個壓縮包:
SQL*Plus、SDK的安裝是建立在精簡版客戶端的基礎上的,你需要先安裝好精簡版客戶端。
精簡版客戶端安裝:精簡版客戶端客戶端的安裝很簡單,解壓到任意目錄即可!配置ORACLE_HOME環境變數。註意!註意!註意!安裝路徑上一定不要有空格或中文字元!否則在安裝
DBD::Oracle
的時候,會報錯!SQL*Plus和SDK安裝:直接將壓縮包文件解壓精簡版客戶端安裝目錄即可!
安裝好之後,還需要配置LD_LIBRARY_PATH環境變數(註意,精簡版客戶端不安裝SDK是沒有sdk\lib的,安裝
DBD::Oracle
時會載入lib)官方文檔:If you are using Instant Client from ZIP archives, the LD_LIBRARY_PATH and ORACLE_HOME will be the same and must be set to the directory where you have installed the files. For example: /opt/oracle/instantclient_12_2/
做好這一切開始安裝
DBD::Oracle
cpan get DBD::Oracle install DBD::Oracle
安裝完成之後再執行一下:
install DBD::Oracle
,確定是否安裝成功,如下表示安裝成功!
三、ora2pg參數說明
ora2pg可以使用命令行的方式進行數據遷移,但是這種方式我暫未實驗,瞭解一些常用命令即可!
(一)、常用命令
ora2pg -c | --conf file : 設置非預設的配置文件,預設配置文件為 /etc/ora2pg/ora2pg.conf。(指定自定義配置文件路徑)
ora2pg -d | --debug : 使用調試模式,輸出更多詳細信息。
(二)、參數幫助說明(直譯)
# ora2pg --help
Usage: ora2pg [-dhpqv --estimate_cost --dump_as_html] [--option value]
-a | --allow str : 指定允許導出的對象列表,使用逗號分隔。也可以與 SHOW_COLUMN 選項一起使用。
-b | --basedir dir: 設置預設的導出目錄,用於存儲導出結果。
-c | --conf file : 設置非預設的配置文件,預設配置文件為 /etc/ora2pg/ora2pg.conf。
-d | --debug : 使用調試模式,輸出更多詳細信息。
-D | --data_type STR : 通過命令行設置數據類型轉換。
-e | --exclude str: 指定導出時排除的對象列表,使用逗號分隔。也可以與 SHOW_COLUMN 選項一起使用。
-h | --help : 顯示幫助信息。
-g | --grant_object type : 導出指定類型的對象上的授權信息,取值參見 GRANT_OBJECT 配置項。
-i | --input file : 指定要導入的 Oracle PL/SQL 代碼文件,導入文件時不需要連接到 Oracle 資料庫。
-j | --jobs num : 設置用於發送數據到 PostgreSQL 的併發進程數量。
-J | --copies num : 設置用於從 Oracle 導出數據的併發連接數量。
-l | --log file : 設置日誌文件,預設為 stdout。
-L | --limit num : 導出數據時,每次寫入磁碟之前在記憶體中緩衝的記錄數量,預設值為 10000。
-m | --mysql : 導出 MySQL 資料庫。
-n | --namespace schema : 設置需要導出的 Oracle 模式。
-N | --pg_schema schema : 設置 PostgreSQL 中的搜索路徑 search_path。
-o | --out file : 設置導出的 SQL 文件的存儲路徑。預設值為當前目錄下的 output.sql 文件。
-p | --plsql : 啟用 PLSQL 代碼到 PLPGSQL 代碼的轉換。
-P | --parallel num: 同時導出多個表,設置併發數量。
-q | --quiet : 不顯示進度條。
-s | --source DSN : 設置 Oracle DBI 數據源。
-t | --type export: 設置導出類型。該參數將會覆蓋配置文件中的導出類型(TYPE)。
-T | --temp_dir DIR: 為多個同時運行的 ora2pg 腳本指定不同的臨時存儲目錄。
-u | --user name : 設置連接 Oracle 資料庫連接的用戶名。也可以使用 ORA2PG_USER 環境變數。
-v | --version : 顯示 Ora2Pg 版本信息並退出。
-w | --password pwd : 設置連接 Oracle 資料庫的用戶密碼。也可以使用 ORA2PG_PASSWD 環境變數。
--forceowner : 導入數據時,強制 ora2pg 將導入 PostgreSQL 的表和序列的擁有者設置為連接 Oracle 資料庫時的用戶。如果設置為指定的用戶名,所有導入的對象屬於該用戶。預設情況下,對象的擁有者為連接 Pg 資料庫的用戶。
--nls_lang code: 設置 Oracle 客戶端的 NLS_LANG 編碼。
--client_encoding code: 設置 PostgreSQL 客戶端編碼。
--view_as_table str: 將視圖導出為表,多個視圖使用逗號分隔。
--estimate_cost : 在 SHOW_REPORT 結果中輸出遷移成本評估信息。
--cost_unit_value minutes: 成本評估單位,使用分鐘數表示。預設值為 5 分鐘,表示一個 PostgreSQL 專家遷移所需的時間。如果是第一次遷移,可以設置為 10 分鐘。
--dump_as_html : 生成 HTML 格式的遷移報告,只能與 SHOW_REPORT 選項一起使用。預設的報告是一個簡單的文本文件。
--dump_as_csv : 與上個參數相同,但是生成 CSV 格式的報告。
--dump_as_sheet : 生成遷移評估時,為每個資料庫生成一行 CSV 記錄。
--init_project NAME: 創建一個ora2pg 項目目錄結構。項目的頂級目錄位於根目錄之下。
--project_base DIR : 定義ora2pg 項目的根目錄,預設為當前目錄。
--print_header : 與 --dump_as_sheet 一起使用,輸出 CSV 標題信息。
--human_days_limit num : 設置遷移評估級別從 B 升到 C 所需的人工日數量。預設值為 5 人工日。
--audit_user LIST : 設置查詢 DBA_AUDIT_TRAIL 表時需要過濾的用戶名,多個用戶使用逗號分隔。該參數只能用於 SHOW_REPORT 和 QUERY 導出類型。
--pg_dsn DSN : 設置線上導入時的 PostgreSQL 數據源。
--pg_user name : 設置連接 PostgreSQL 的用戶名。
--pg_pwd password : 設置連接 PostgreSQL 的用戶密碼。
--count_rows : 在 TEST 方式下執行真實的數據行數統計。
--no_header : 在導出文件中不添加 Ora2Pg 頭部信息。
--oracle_speed : 用於測試 Oracle 發送數據的速度。不會真的處理或者寫入數據。
--ora2pg_speed : 用於測試 Ora2Pg 發送轉換後的數據的速度。不會寫入任何數據。
四、ora2pg配置項說明
ora2pg不僅可以使用命令行的方式進行數據遷移,還可以通過自定義配置文件進行數據遷移配置。
ora2pg安裝目錄下有一個預設配置文件ora2pg.conf.dist
,你可以通過學習配置項,來修改此配置文件的預設值,來達到你想要的業務需求。
該文件是可自定義進行配置項覆蓋的,也就是說你可以在任意位置創建一個自定義配置文件,來增加自己的配置項,而不修改預設配置文件。
例如這樣:
(一)、常用配置項
註意:配置項和值之間用tab鍵隔開
#設置Oracle主目錄:Oracle的安裝目錄(如果說是Oracle客戶端,就是客戶端的路徑)
ORACLE_HOME D:\test\instantclient_21_11
#設置Oracle資料庫連接(數據源、用戶、密碼)連接遠程的,需要配置遠程資料庫ip和埠
ORACLE_DSN dbi:Oracle:host=127.0.0.1;sid=orcl;port=1521
#填入Oracle用戶名、密碼
ORACLE_USER username
ORACLE_PWD pwd***
#配置你想遷移的內容,需要遷移什麼內容,就配置什麼內容,之間用“,”隔開
TYPE TABLE,VIEW,SEQUENCE,TRIGGER,FUNCTION,PROCEDURE
#導出SQL目標文件名稱
OUTPUT user.sql
#導出SQL目標目錄
OUTPUT_DIR C:\test
#配置你要導出的Oracle資料庫 不配置的情況下預設導出所有資料庫所有表
SCHEMA MY_Oracle_SCHEMA
#配置允許留下的表,這裡可以使用正則表達式,示例表示遷移表名包含“BI_”的資料庫表
ALLOW .*BI_.*
#預設情況下,Oracle模式不會導出到PostgreSQL資料庫中,所有對象都是在預設的Pg命名空間下創建的。
#如果還要導出此架構併在此命名空間下創建所有對象,請將export_schema指令設置為1。
#這將使用預設的pg_catalog模式將導出SQL文件頂部的模式搜索路徑設置為schema指令中設置的模式名稱。
#如果要更改此路徑,請使用指令PG_SCHEMA。
EXPORT_SCHEMA 0
#在輸出文件開始時啟用/禁用CREATE SCHEMA SQL順序。它在預設情況下是啟用的,並關係TABLE導出類型。
CREATE_SCHEMA 1
#限制導出到哪一個架構
PG_SCHEMA MY_PG_SCHEMA
#設置導出目標pg資料庫
PG_DSN dbi:Pg:dbname=my_db;host=127.0.0.1;port=5432
#填入pg用戶名、密碼
PG_USER pg_username
PG_PWD pg_pwd***
(二)、配置項幫助文檔
更多配置項詳細說明,請詳見Ora2Pg
官方文檔!
Ora2Pg : Migrates Oracle to PostgreSQL (darold.net)
需求實驗
實驗一:批量導出Oracle中特定表到PostgreSQL的一個特定schema下
(1)需求詳細說明
匹配Oracle資料庫中所有表名包含"BI_"的數據表遷移到PostgreSQL的test_schema下。(遷移表結構和數據)
(2)實驗過程
編寫ora2pg.conf.dist
配置文件:
ORACLE_HOME D:\test\instantclient_21_11
ORACLE_DSN dbi:Oracle:host=127.0.0.1;sid=orcl;port=1521
ORACLE_USER username
ORACLE_PWD pwd***
TYPE TABLE,INSERT
ALLOW .*BI_.*
PG_SCHEMA test_schema
OUTPUT user.sql
OUTPUT_DIR C:\test
執行遷移命令:
ora2pg -c C:\Users\zhao-XH\Desktop\ora2pg.conf.dist -d
導出sql腳本成功
在PostgreSQL客戶端分別執行表結構和數據插入sql腳本即可!
(3)問題總結
遷移過程中要註意,欄位的類型映射是否符合要求。官方給出的類型映射關係如下:
oracle類型 | postgresql類型 |
---|---|
date | timestamp |
long | text |
long raw | bytea |
clob | text |
nclob | text |
blob | bytea |
bfile | bytea |
raw | bytea |
rowid | oid |
float | double precision |
dec | decimal |
decimal | decimal |
double precision | double precision |
int | integer |
integer | integer |
real | real |
smallint | smallint |
binary_float | double precision |
binary_double | double precision |
tinestamp | timestamp |
xmltype | xml |
binary_integer | integer |
pls_integer | integer |
timestamp with time zone | timestamp with time zone |
timestamp with local time zone | timestamp with time zone |
如果類型映射不符合我們的要求,例如本次實驗,我想要NUMBER(1,0)類型進行精度映射,而ora2pg工具考慮到效率問題,預設關閉NUMBER(p,s) -> numeric(p,s)的映射關係。採用了取整型的方式,這一點很顯然不是我想要的。查閱官方文檔,我們可以看出,要想開啟NUMBER(p,s) -> numeric(p,s)的映射關係,需要將PG_INTEGER_TYPE配置項的值置為0即可!
官方文檔:
PG_NUMERIC_TYPE
If set to 1 replace portable numeric type into PostgreSQL internal type. Oracle data type NUMBER(p,s) is approximatively converted to real and float PostgreSQL data type. If you have monetary fields or don't want rounding issues with the extra decimals you should preserve the same numeric(p,s) PostgreSQL data type. Do that only if you need exactness because using numeric(p,s) is slower than using real or double.
PG_INTEGER_TYPE
If set to 1 replace portable numeric type into PostgreSQL internal type. Oracle data type NUMBER(p) or NUMBER are converted to smallint, integer or bigint PostgreSQL data type following the value of the precision. If NUMBER without precision are set to DEFAULT_NUMERIC (see below).
DEFAULT_NUMERIC
NUMBER without precision are converted by default to bigint only if PG_INTEGER_TYPE is true. You can overwrite this value to any PG type, like integer or float.
我們也可以設置配置項來進行手動映射。方法如下:
官方文檔:
If you're experiencing any problem in data type schema conversion with this directive you can take full control of the correspondence between Oracle and PostgreSQL types to redefine data type translation used in Ora2pg. The syntax is a comma-separated list of "Oracle datatype:Postgresql datatype". Here are the default list used:
DATA_TYPE VARCHAR2:varchar,NVARCHAR2:varchar,NVARCHAR:varchar,NCHAR:char,DATE:timestamp(0)...
The directive and the list definition must be a single line.
看到上述說明,我們關註以下幾點:
- 設置配置項時,你沒有必要全部粘貼預設映射再進行更改,只需要修改不符合你映射要求的數據類型即可!
- 所有類型映射配置必須在一行上聲明,中間用","隔開。
示範,例如官方文檔預設將DATE:timestamp(0),而我需要DATE:timestamp。同時我需要開啟精度映射。
那麼上述配置文件更改如下:
ORACLE_HOME D:\test\instantclient_21_11
ORACLE_DSN dbi:Oracle:host=127.0.0.1;sid=orcl;port=1521
ORACLE_USER username
ORACLE_PWD pwd***
TYPE TABLE,INSERT
ALLOW .*BI_.*
PG_SCHEMA test_schema
OUTPUT user.sql
OUTPUT_DIR C:\test
PG_INTEGER_TYPE 0
DATA_TYPE DATE:timestamp