對於從 Oracle 系統逐漸轉向兼用 EnterpriseDB 的用戶來說,時常會需要維持既有的系統間資料交換架構,因此而產生了 Oracle 與 EnterpriseDB 之間,異質資料庫間的 DBLink 連線需求。而 EnterpriseDB 的 Oracle 資料庫相容功能內,就提供了可以連接到 Oracle 資料庫的 DBLink 功能,而且操作上,相當接近 Oracle 的操作方式。在這篇演練中,即演習這樣的一個功能。
在此以 CentOS 上所安裝的 EnterpriseDB 9.5 版進行操作。
要設置 EnterpriseDB 對 Oracle 的 DBLink 功能,就需要安裝 Oracle Instant Client ,才可以透過 DBLink 從 EDB 連到 Oracle。Oracle Instant Client 對 Linux 提供 zip 壓縮檔或 rpm 安裝檔兩種安裝選擇。以下使用 rpm 進行安裝:
取得 rpm 安裝檔:
oracle-instantclient11.2-basic-11.2.0.2.0.x86_64.rpm |
安裝:
|
[root@edb95 ~]# rpm -ivh oracle-instantclient11.2-basic-11.2.0.2.0.x86_64.rpm
接著,在作業系統帳戶 enterprisedb( PostgreSQL process owner )中設定環境變數 LD_LIBRARY_PATH,使 EDB 找到 Oracle 提供的 library,像是 libnnz11.so:
使用 Oracle Instant Client 壓縮檔:
|
[enterprisedb@edb95 ~]$ export LD_LIBRARY_PATH="/path/to/OCI/location/lib/":$LD_LIBRARY_PATH
使用 Oracle Instant Client 的 rpm 安裝檔:
|
[enterprisedb@edb95 ~]$ export LD_LIBRARY_PATH="/usr/lib/oracle/11.2/client64/lib/":$LD_LIBRARY_PATH
Note:永久生效的設定方式(官方使用手冊未提及)
在 /etc/ld.so.conf 中將 Oracle lib 所在目錄路徑設定進去(紅字部份),然後再重新載入:
[root@edb95 ~]# echo "/usr/lib/oracle/11.2/client64/lib/" >> /etc/ld.so.conf
[root@edb95 ~]# ldconfig
由於 EnterpriseB 盡量對現行版本的 Oracle 支援,於是需要把 Oracle 提供的 library,做出 soft link,以便使 EnterpriseDB 認得 libocci.so 以及 libclntsh.so
[root@edb95 ~]# ln -s /usr/lib/oracle/11.2/client64/lib/libocci.so.11.1 /usr/lib/oracle/11.2/client64/lib/libocci.so [root@edb95 ~]# ln -s /usr/lib/oracle/11.2/client64/lib/libclntsh.so.11.1 /usr/lib/oracle/11.2/client64/lib/libclntsh.so
以上就已經把 EnterpriseDB 需要的環境設置設完畢了
接著,便是進行資料庫裡面的設定。
首先登入資料庫,設定 postgresql.conf 裡面的參數(官方使用手冊),這裡不直接調整設定檔,而是利用系統指令設置(相關設定會出現在 postgresql.auto.conf):
edb=# ALTER SYSTEM SET oracle_home ="/usr/lib/oracle/11.2/client64/lib/"; ALTER SYSTEM edb=#
Note:使用手冊中未提及 Linux 下設置:$PGDATA/postgresql.conf 內的 oracle_home 指的是 OCI library libclntsh.so 的位置,與 Oracle 資料庫中環境變數 $ORACLE_HOME 是不同的意思
然後重新啟動 Enterprisedb:
[enterprisedb@edb95 ~]$ . /opt/PostgresPlus/9.5AS/pgplus_env.sh [enterprisedb@edb95 ~]$ pg_ctl -D ~/data/ restart
以上就已經把 EnterpriseDB 的環境設置完畢。
接著,便是啟用 DBLink
edb=# -- 先以資料庫的管理者登入,才能建立 DBLink edb=# \c edb enterprisedb You are now connected to database "edb" as user "enterprisedb". edb=# CREATE PUBLIC DATABASE LINK oralink edb-# CONNECT TO hr IDENTIFIED BY 'hr_pwd' edb-# USING '//10.140.0.2:1521/xe'; CREATE DATABASE LINK edb=# -- 列舉 DBLink 的訊息 edb=# SELECT lnkname, lnkuser, lnkconnstr edb-# FROM pg_catalog.edb_dblink; lnkname | lnkuser | lnkconnstr ---------+---------+---------------------- oralink | hr | //10.140.0.2:1521/xe (1 row)
上面列舉 DBLink 訊息的指令,也能由下列指令進行確認:
edb=# SELECT dblink_ora_connect('oralink','10.140.0.2','xe', edb-# 'hr','hr_pwd','1521'); dblink_ora_connect -------------------- OK (1 row)
建立 DBLink 完畢後,使用 Oracle-xe 內建範例 schema,HR schema,測試 DBLink。使用 DBLink 存取表格時,不需要管理者權限的帳戶,就可以進行 Oracle 表格的查詢:
edb=# SELECT job_id FROM employees@oralink; job_id ------------ AC_ACCOUNT AC_MGR ...(略) (107 rows)
以上便是從 EnterpriseDB 連線到 Oracle 的 DBLink 功能。
目前已知的問題是,當 Oracle 資料庫上面所設定的資料庫系統編碼是不支援 User-Define Characters 功能的
順帶一提,Foreign Data Wrapper 是 PostgreSQL 用來連線到到其他 PostgreSQL 或其他類型資料庫(像是:Oracle FDW、Greenplum FDW、MongoDB FDW、Hadoop FDW、ElasticSearch FDW ... 等)存取資料的連線套件。這些套件,讓 PostgreSQL 成為最適合介接各種資料的工具之一。
參考資料:
EnterpriseDB DBLinkto Oracle
艾力克斯札記: Oracle dblink to Postgres Plus Enterprise Edition (PPEE)
在EnterpriseDB中建立指向Oracle的Database Link-pugna_zfr-ChinaUnix博客
EDB建立连接Oracle的DBlink_lxg0618_新浪博客
EnterpriseDB: Oracle Database Links
CREATE [PUBLIC] DATABASE LINK - Documentation | EnterpriseDB
dblink_ora - Documentation | EnterpriseDB
dba - A issue on DB link between Postgres and Oracle? - Database Administrators Stack Exchange
Oracle上相關:
查看及修改oracle編碼格式方法 @ 資訊園 :: 痞客邦 PIXNET ::
昭佑.天翔: Oracle PL/SQL: 讓 "字串資料" 進行 "字元集轉換"
以下為額外資訊:
Postgres DBLink
資料庫-工作日誌: PostgreSQL 跨資料庫查詢!!!!
PostgreSQL跨库查询 - 豆瓣
PostgreSQL: Documentation: 9.5: dblink
Using DbLink to access other PostgreSQL Databases and Servers - Postgres OnLine Journal
Google Search - postgres dblink remote plpgsql
Google Search - postgres dblink encoding
各式 Foreign Data Wrapper
Foreign data wrappers - PostgreSQL wiki
A look at Foreign Data Wrappers Craig Kerstiens
SQL Server and PostgreSQL Foreign Data Wrapper Configuration - Part 3
Connecting your PostgreSQL instance to an Oracle database - The PostgreSQL 9.5 way - Blog dbi services
Playing with Foreign Data Wrappers in PostgreSQL | Kartoza
Setup Mysql Foreign Data Wrapper in Postgresql - Stack Overflow
Import Foreign Schema for ogr_fdw for PostgreSQL 9.5 - Postgres OnLine Journal
Import Foreign Schema hack with OGR_FDW and reading LibreOffice calc workbooks - Postgres OnLine Journal
Specific SQL Database Wrappers - PostgreSQL wiki
HadoopFDW: PostgreSQL Foreign Data Wrapper for Hadoop - BigSQL
沒有留言:
張貼留言