Ora2Pg介紹
Ora2Pg是一個將Oracle遷移至PostgreSQL的開源工具,通過連接Oracle數據庫,自動掃描并提取其中的對象結構及數據,產生SQL腳本,通過手動或自動的方式將其應用到PostgreSQL。
官方網站:https://ora2pg.darold.NET/
Ora2Pg優秀特性
- 支持導出數據庫絕大多數對象類型,包括表、視圖、序列、索引、外鍵、約束、函數、存儲過程等。
- 提供PL/SQL到PL/PGSQL語法的自動轉換,一定程度避免了人工修正。
- 可生成遷移報告,包括遷移難度評估、人天估算。
- 可選對導出數據進行壓縮,節約磁盤開銷。
- 配置選項豐富,可自定義遷移行為。
Ora2Pg在openGauss的應用
Ora2Pg主要語言是perl,使用Perl DBI模塊,通過DBD:Pg連接PostgreSQL目標數據庫,openGauss兼容PostgreSQL的通信協議以及絕大部分語法,因此只需作部分命名上的修改,Ora2Pg同樣可應用于openGauss。
Ora2Pg使用示例
對于對象結構,Ora2Pg將其DDL語句導出到SQL文件中,對于表數據,則既可以以INSERT或COPY命令導出到文件,也支持直接導入到目標數據庫,不需要產生中間SQL文件。
為了完成上述過程,Ora2Pg工具同時支持命令行和一鍵式腳本的方式完成遷移。命令行方式通過Ora2Pg二進制分布執行各條命令,來完成對應的步驟;一鍵式腳本通過創建遷移項目,分別得到導出導入腳本以及遷移目錄模板,腳本集成了若干Ora2Pg命令以及導入SQL文件所需的psql命令(openGauss為gsql),用戶只需要執行兩個腳本即可完成遷移。本次主要演示腳本的方式。
1. 依賴安裝
Ora2Pg語言為perl,故需安裝所需perl模塊。
# root用戶下操作下
yum install -y perl-ExtUtils-CBuilder perl-ExtUtils-MakeMaker
yum install perl-CPAN
安裝DBI、DBD:Pg、DBD:Oracle,Ora2Pg依賴這些軟件去連接數據庫。
perl -MCPAN -e 'install DBI'
perl -MCPAN -e 'install DBD::Pg'
安裝DBD:Oracle,需要先安裝Oracle Instant Client或者本地已安裝Oracle數據庫。
# 從Oracle官方下載并安裝Oracle Instant Client
rpm -ivh oracle-instantclient19.11-basic-19.11.0.0.0-1.x86_64.rpm
rpm -ivh oracle-instantclient19.11-devel-19.11.0.0.0-1.x86_64.rpm
rpm -ivh oracle-instantclient19.11-jdbc-19.11.0.0.0-1.x86_64.rpm
rpm -ivh oracle-instantclient19.11-sqlplus-19.11.0.0.0-1.x86_64.rpm
# 設置環境變量ORACLE_HOME
export ORACLE_HOME=/usr/lib/oracle/19.11/client64/
# 或者本地已安裝有Oracle數據庫
ORACLE_HOME如下設置
export ORACLE_HOME=/opt/oracle/product/19c/dbhome_1
export LD_LIBRARY_PATH=$ORACLE_HOME/lib
# 安裝DBD:Oracle
perl -MCPAN -e 'install DBD::Oracle'
2. Ora2Pg安裝并創建遷移項目
源碼路徑:https://github.com/darold/ora2pg
# 進到代碼目錄下,
為目標安裝路徑
perl Makefile.PL PREFIX=
make && make install
# 設置環境變量,查看是否安裝成功.
為下載的代碼路徑
export PERL5LIB=
/lib
export PATH=$PATH:
/usr/local/bin
ora2pg --help
# 創建遷移項目
ora2pg --init_project oramig
創建遷移項目后會在當前目錄下生成oramig目錄模板,如下所示。其中主要包含兩個腳本export_schema.sh和import_all.sh,后續導出和導入即使用這兩個腳本。schema和sources目錄存放各對象的DDL語句,區別在于schema存放PL/SQL語法轉化為PL/PGSQL后的語句, sources目錄存放轉化前PL/SQL的語句,data目錄存放表數據文件,config目錄包含配置文件ora2pg.conf,reports目錄存放遷移報告。
至此您已可以使用Ora2Pg命令,以下是使用該命令時允許指定的部分命令行參數,這些參數都可以在ora2pg.conf設置,指定配置文件時,命令行選項指定的值會覆蓋配置文件中的對應值。
Usage: ora2pg [-dhpqv --estimate_cost --dump_as_html] [--option value]
-a | --allow str : 指定允許導出的對象列表,使用逗號分隔。
-b | --basedir dir: 設置默認的導出目錄,用于存儲導出SQL文件。
-c | --conf file : 設置配置文件路徑。
-e | --exclude str: 指定導出時排出的對象列表,使用逗號分隔。
-i | --input file : 指定要導入的SQL文件,導入文件時不需要連接到 Oracle 數據庫。
-o | --out file : 設置導出的 SQL 文件的存儲路徑。默認值為當前目錄下的 output.sql 文件。
-p | --plsql : 啟用 PLSQL 代碼到 PLPGSQL 代碼的轉換。
-s | --source DSN : 設置 Oracle DBI 數據源。
-t | --type export: 設置導出類型。該參數將會覆蓋配置文件中的導出類型(TYPE)。
-u | --user name : 設置連接 Oracle 數據庫連接的用戶名。也可以使用 ORA2PG_USER 環境變量。
-w | --password pwd : 設置連接 Oracle 數據庫的用戶密碼。也可以使用 ORA2PG_PASSWD 環境變量。
--init_project NAME: 初始化典型的Ora2Pg項目,生成目錄模板。
--view_as_table str: 將視圖導出為表,多個視圖使用逗號分隔。
3. 配置Ora2Pg
ora2pg.conf文件包含所有配置選項,通過配置選項可以自定義遷移時的行為。這里簡單介紹幾個常用的配置項。
ORACLE_HOME:設置環境變量ORACLE_HOME,DBD:Oracle模塊使用該變量查找所需的Oracle庫。設置方式在依賴安裝中已涉及。
ORACLE_DSN:該參數以標準DBI DSN形式設置數據源名稱,例如:
ORACLE_DSN dbi:Oracle:host=oradb_host.myhost.com;sid=DB_SID;port=1521
或者
ORACLE_DSN dbi:Oracle:DB_SID
第二種方式需要在$ORACLE_HOME/network/admin/tnsnames.ora 文件或者環境變量 TNS_ADMIN 指定目錄下的 tnsnames.ora 文件中定義 SID。
ORACLE_USER, ORACLE_PWD:這兩個參數用于定義Oracle數據庫連接的用戶名和密碼。請注意,如果可以的話,以Oracle超級管理員身份登錄,以避免在數據庫掃描時遇到權限問題,以及丟失內容。
PG_DSN:設置目標數據庫名稱,如下為openGauss示例,連接IP為localhost,端口為5432,名稱為mydb的數據庫。
PG_DSN dbi:Pg:dbname=mydb;host=localhost;port=5432
PG_USER,PG_PWD:設置目標數據庫的用戶、密碼。請注意,這里使用的用戶需要有遠程連接openGauss的權限,以及對對應數據庫的讀寫權限,具體是運行Ora2Pg所在的機器和該用戶需要在openGauss的遠程訪問白名單里。
SCHEMA:此參數用于設置要導出的schema。如下,將提取AppS下的對象。
SCHEMA APPS
ORA_INITIAL_COMMAND:該參數可用于在連接之后向Oracle發送初始命令。例如,在讀取對象前關閉訪問限制策略,或設置一些會話參數。
TYPE:設置要導出的對象類型,包括表、視圖、序列、索引、外鍵、約束、函數、存儲過程等,默認為TABLE。如下,將導出普通表和視圖。
TYPE TABLE VIEW
更多更詳細的配置項說明,可查看官網:
https://ora2pg.darold.net/documentation.html
連接測試:配置好Oracle數據庫的DSN之后,可執行以下命令測試數據庫的連接。
ora2pg -t SHOW_VERSION -c config/ora2pg.conf
以上命令將顯示Oracle數據庫的版本。
4. 執行遷移腳本
本次演示的配置如下,以system用戶連接目標數據庫
修改export_schema.sh中導出類型,本次遷移導出表和函數。
執行導出腳本,等待遷移完成。結束后在schema和source的子目錄下生成對應類型的DDL文件,并在末尾給出導出表數據的命令。
sh export_schema.sh
同時reports目錄下也生成html格式的遷移報告。
執行導入腳本之前需要做如下準備:
1. 先在openGauss庫中創建數據庫,并在該數據庫下創建用戶,把mydb屬主設為該用戶。(import_all.sh中使用PostgreSQL特有的createuser和createdb創建用戶和數據庫)
2. 為了使用openGauss命令行工具gsql,需要將數據庫的bin和lib加在操作系統的環境變量PATH和LD_LIBRARY_PATH中。
3. 將import_all.sh里的psql修改為gsql。
4. 當使用普通用戶導入數據時,可增加一個執行該腳本的選項,指定用戶密碼,避免頻繁輸入密碼。
執行導入腳本,表示使用用戶testuser登錄名為mydb的數據庫,ip和端口分別是127.0.0.1和5432,-f選項表示跳過用戶和數據庫是否需要創建的檢查。
sh import_all.sh -d mydb -o testuser –h 127.0.0.1 -p 5432 –f
執行后會交互式提示是否導入各對象結構及數據,如下所示。(其中的-w是手動修改import_all.sh腳本,添加密碼選項)
對于表的索引和約束,可選擇延遲導入,即在導入數據之后。
登錄openGauss數據庫查看遷移結果。
Ora2Pg不足
Ora2Pg對PL/SQL和PL/PGSQL的語法轉換處理采用正則表達式和文本替換的方式,先天設計不足,很難覆蓋所有的語法,目前僅支持部分轉換。因此,Ora2Pg可以滿足SQL簡單的應用遷移,對于復雜的語法,并不能完全保證轉換的正確性,需要對生成的SQL語句進行核對,必要時需要人工修正。
更多內容請參考:
https://docs.opengauss.org/zh/docs/3.1.0/docs/BriefTutorial/BriefTutorial.html