背景:在對DM8資料庫做測試的過程中,需要驗證異構資料庫的DBLINK功能(ORACLE到DM8)。
遇到的問題:
1.文檔資料較少,網上有一些示例,實際操作過程中會有問題,資訊不完善,需要整合。
2.DM8處于國産化ARM64平台環境,而ORACLE處于X86架構的linux環境,OCI的實作方式不能夠跨平台,需要使用ODBC的實作方式。
在此,對收集到的資訊,并且最終驗證實作的過程做個整理。友善以後使用。
--建立到oracle的外部連結DBLINK(以oracle11.2g版本為例)
前提:
1.oracle源端環境,提供資料庫相關連接配接參數
如:
位址:192.168.136.106:1521
服務名:orcl
使用者: system/tiger
2.oracle建立測試使用者及資料
create user test identified by "dameng123";
grant dba to test;
create table test.test1(a int,b varchar(200));
create view test.v_test1 as select *from test.test1;
insert into test.test1 select level , to_char(level) from dual connect by level <=1000;
commit;
方式一:OCI的方式(這種方式問題少,建立過程簡單,相容性也更強,缺點是不能跨平台)
配置DM端的OCI接口
ORACLE官網下載下傳對應的instantclient 包:
https://www.oracle.com/database/technologies/instant-client/downloads.html
這裡使用:instantclient-basic-linux.x64-19.13.0.0.0dbru-2.zip
拷貝至DM資料庫伺服器,/opt目錄下,解壓
unzip instantclient-basic-linux.x64-19.13.0.0.0dbru-2.zip
添加到/etc/ld.so.conf.d目錄下
echo /opt/instantclient_19_13 > /etc/ld.so.conf.d/oracle-instantclient.conf
[ro[email protected] ~]# cat /etc/ld.so.conf.d/oracle-instantclient.conf
/opt/oracle/instantclient_19_13
[[email protected] ~]# ldconfig
配置LD_LIBRARY_PATH環境變量
修改dmdba使用者下的.bash_profile檔案,添加如下内容:
export LD_LIBRARY_PATH="$LD_LIBRARY_PATH:/opt/instantclient_19_13"
生效:
[[email protected] ~]$ source .bash_profile
重新開機DM資料庫完成。
建立dblink:
create or replace link link01 connect 'ORACLE' with TEST identified by "dameng123" using '192.168.136.106/orcl';
方式二:ODBC方式(不同平台架構下,需要使用此方式)
opt目錄下同樣操作,解壓instantclient包。
unzip instantclient-basic-linux.x64-19.13.0.0.0dbru-2.zip
1)DM端安裝oracle的 ODBC驅動:
https://www.oracle.com/database/technologies/instant-client/downloads.html
這裡使用:instantclient-odbc-linux.x64-19.13.0.0.0dbru.zip,其它版本對應也可以
拷貝到/opt目錄下解壓:
unzip instantclient-odbc-linux.x64-19.12.0.0.0dbru.zip
ls /opt/instantclient_19_13/
basic和odbc會解壓到相同目錄
測試:
ldd libsqora.so.21.1
解決依賴問題:
ln -s /opt/instantclient_19_13/libclntshcore.so.19.1 /opt/instantclient_19_13/libclntshcore.so.21.1
ln -s /opt/instantclient_19_13/libclntsh.so.19.1 /opt/instantclient_19_13/lib
ln -s /usr/local/lib/libodbcinst.so.2.0.0 /opt/instantclient_19_13/libodbcinst.so.2clntsh.so.21.1
export LD_LIBRARY_PATH=LD_LIBRARY_PATH:/opt/instantclient_19_13:/usr/lib64
2) DM端安裝ODBC
拷貝到/opt目錄下解壓:
tar -zxvf unixODBC-2.3.9.tar.gz
cd unixODBC-2.3.9/
編譯安裝:
./configure
make && make install
驗證:
odbcinst -j
3)配置ODBC資料源
3.1)配置tnsnames.ora
vim /opt/instantclient_19_13/network/admin/tnsnames.ora
DB10 =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.136.106)(PORT = 1521))
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = orcl)
)
)
3.2)配置環境變量
vim /etc/profile
#結尾追加:
export TNS_ADMIN=/opt/instantclient_19_13/network/admin
source /etc/profile
3.3)配置odbcinst.ini
[[email protected] admin]# vim /usr/local/etc/odbcinst.ini
[Oracle ODBC1913]
Description = Oracle ODBC Driver
Driver = /opt/instantclient_21_4/libsqora.so.21.1
3.4) 配置odbc.ini
[[email protected] admin]# vim /usr/local/etc/odbc.ini
[ORA11]
DSN = ORA11
Driver = Oracle ODBC1913
ServerName = DB10
4)測試ODBC連接配接
[[email protected] instantclient_21_4]# isql -v ORA11 system tiger
SQL> select name from v$database;
5)拷貝以下檔案到/dm/bin目錄下(這個步驟非常關鍵)
[[email protected] ~]# cp /opt/unixODBC-2.3.9/DriverManager/.libs/libodbc.so /dm/bin
[[email protected] ~]# cp /opt/unixODBC-2.3.9/cur/.libs/libodbccr.so /dm/bin/
[[email protected] ~]# cp /opt/unixODBC-2.3.9/odbcinst/.libs/libodbcinst.so /dm/bin
[[email protected] ~]# chown -R dmdba:dinstall /dm
6)建立DBLINK
重新開機資料庫服務
create or replace public link "LINK6" connect 'ODBC' with "TEST" identified by "dameng123" using 'ORA11';
完成建立
下面是一些測試過程:
被測資料庫支援public dblink功能
SQL> create or replace public link link02 connect 'ORACLE' with TEST identified by "dameng123" using '192.168.136.106/orcl';
SQL> conn UCAP/DAMENG123
SQL> select top 10 *from [email protected];
源端Oracle資料庫表結構發生變更(增加列或者删除列),在目标端使用dblink無感覺,即在目标端通過查詢語句能夠直接檢視到變更的列資料,無需重建dblink定義
oracle源端修改表結構,增加一列:執行
alter table test.test1 add c int;
DM端查詢,直接擷取變更列資料:
SQL> select top 10 *from [email protected];
被測資料庫支援對源端Oracle資料表的同義詞功能,即通過同義詞即可通路源端資料表
SQL> create or replace synonym test_syn for [email protected];
SQL> select top 10 *from test_syn;
被測資料庫支援含有dblink的自定義函數