背景:在对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
[root@localhost ~]# cat /etc/ld.so.conf.d/oracle-instantclient.conf
/opt/oracle/instantclient_19_13
[root@localhost ~]# ldconfig
配置LD_LIBRARY_PATH环境变量
修改dmdba用户下的.bash_profile文件,添加如下内容:
export LD_LIBRARY_PATH="$LD_LIBRARY_PATH:/opt/instantclient_19_13"
生效:
[dmdba@localhost ~]$ 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
[root@localhost 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
[root@localhost admin]# vim /usr/local/etc/odbc.ini
[ORA11]
DSN = ORA11
Driver = Oracle ODBC1913
ServerName = DB10
4)测试ODBC连接
[root@localhost instantclient_21_4]# isql -v ORA11 system tiger
SQL> select name from v$database;
5)拷贝以下文件到/dm/bin目录下(这个步骤非常关键)
[root@localhost ~]# cp /opt/unixODBC-2.3.9/DriverManager/.libs/libodbc.so /dm/bin
[root@localhost ~]# cp /opt/unixODBC-2.3.9/cur/.libs/libodbccr.so /dm/bin/
[root@localhost ~]# cp /opt/unixODBC-2.3.9/odbcinst/.libs/libodbcinst.so /dm/bin
[root@localhost ~]# 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 test1@link02;
源端Oracle数据库表结构发生变更(增加列或者删除列),在目标端使用dblink无感知,即在目标端通过查询语句能够直接查看到变更的列数据,无需重建dblink定义
oracle源端修改表结构,增加一列:执行
alter table test.test1 add c int;
DM端查询,直接获取变更列数据:
SQL> select top 10 *from test1@link02;
被测数据库支持对源端Oracle数据表的同义词功能,即通过同义词即可访问源端数据表
SQL> create or replace synonym test_syn for test1@link02;
SQL> select top 10 *from test_syn;
被测数据库支持含有dblink的自定义函数