达梦通过DBLINK访问Oracle数据库有两种方式一种是通过Oracle oci接口,一种是通过ODBC数据源的方式。
一、下载Oracle客户端驱动(Instant Client)
下载地址:Oracle Instant Client Downloads
下载下面两个包
二、检查操作系统环境
- 主要在DM数据库主机上进行环境检查
1、检查glibc版本
rpm -qi glibc
2、检查是否有安装libaio包
[root@localhost ~]# rpm -qa|grep libaio
libaio-0.3.109-13.el7.x86_64
三、使用 oci接口 方式来进行配置
- 主要在DM数据库主机上进行安装
1、解压安装Oracle Instant Client包
mkdir -p /opt/oracle
解压压缩包
unzip instantclient-basic-linux-arm64.zip
unzip instantclient-odbc-linux-arm64.zip
ls -l instantclient_19_19
2、配置环境变量
-添加到/etc/ld.so.conf.d目录下
echo /opt/oracle/instantclient_19_19 > /etc/ld.so.conf.d/oracle-instantclient.conf
配置LD_LIBRARY_PATH环境变量
修改dmdba用户下的.bash_profile文件,添加如下内容
su - dmdba
vi .bash_profile
-- 添加当前变量
export LD_LIBRARY_PATH="$LD_LIBRARY_PATH:/opt/oracle/instantclient_19_19"
source .bash_profile
查看:
env 或者env |grep LD_LIBRARY_PATH
3、重启数据库加载Oracle OCI驱动
./DmServiceDMSERVER restart
4、创建外部连接
- 注意用户名全大写
CREATE OR REPLACE LINK "SYSDBA"."LINKORA" CONNECT 'ORACLE' WITH "SYSTEM" IDENTIFIED BY "******" USING '10.8.148.17:1528/ORCLPDB1';
5、创建测试表
SYSTEM 模式下创建表
- 注意创建的表名最好全大写
CREATE TABLE "SYSTEM"."TREE01"
( "COLUMN_1" CHAR(10) DEFAULT NULL
) PCTFREE 10 PCTUSED 40 INITRANS 1 MAXTRANS 255
NOCOMPRESS LOGGING
STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645
PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1
BUFFER_POOL DEFAULT FLASH_CACHE DEFAULT CELL_FLASH_CACHE DEFAULT)
TABLESPACE "SYSTEM";
测试查询
select * from TREE01@LINKORA
四、 通过ODBC数据源进行访问
1、安装ODBC驱动包
odbc 配置可以参考文章。 blog.csdn.net/cainiao_201…
下载 odbc驱动包,下载地址
tar -zxvf unixODBC-2.3.9.tar.gz
cd unixODBC-2.3.9
./configure --enable-gui=no
make
make install
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/lib
odbcinst -j
源码编译安装完成之后,还需要检查oracle odbc的依赖是否正常。
有的时候,将操作系统yum安装的unixODBC卸载之后,可能会导致Oracle的odbc动态库缺少依赖库。如下:
[root@localhost instantclient_19_13]# ldd libsqora.so.19.1
linux-vdso.so.1 => (0x00007ffeef3cd000)
libdl.so.2 => /lib64/libdl.so.2 (0x00007ffafac45000)
libm.so.6 => /lib64/libm.so.6 (0x00007ffafa943000)
libpthread.so.0 => /lib64/libpthread.so.0 (0x00007ffafa727000)
libnsl.so.1 => /lib64/libnsl.so.1 (0x00007ffafa50d000)
librt.so.1 => /lib64/librt.so.1 (0x00007ffafa305000)
libaio.so.1 => /lib64/libaio.so.1 (0x00007ffafa103000)
libresolv.so.2 => /lib64/libresolv.so.2 (0x00007ffaf9ee9000)
libclntsh.so.19.1 => /opt/oracle/instantclient_19_13/libclntsh.so.19.1 (0x00007ffaf5d76000)
libclntshcore.so.19.1 => /opt/oracle/instantclient_19_13/libclntshcore.so.19.1 (0x00007ffaf57d2000)
libodbcinst.so.2 => not found ###这里缺少依赖
libc.so.6 => /lib64/libc.so.6 (0x00007ffaf5404000)
/lib64/ld-linux-x86-64.so.2 (0x00007ffafb103000)
libnnz19.so => /opt/oracle/instantclient_19_13/libnnz19.so (0x00007ffaf4d92000)
所以在源码编译安装完成之后,需要将/usr/local/lib或者使用find命令查找系统上相关的库文件将对应路径目录加入到LD_LIBRARY_PATH系统环境变量,或者添加到 /etc/ld.so.conf.d目录下指定的配置文件中,如下:
[root@localhost ~]# echo /usr/local/lib > /etc/ld.so.conf.d/libodbc.conf
[root@localhost ~]# ldconfig
(2)yum安装,配置好yum源之后直接安装即可
[root@localhost ~]# yum install -y unixODBC unixODBC-devel
[root@localhost ~]# odbcinst -j
unixODBC 2.3.1
DRIVERS............: /etc/odbcinst.ini
SYSTEM DATA SOURCES: /etc/odbc.ini
FILE DATA SOURCES..: /etc/ODBCDataSources
USER DATA SOURCES..: /root/.odbc.ini
SQLULEN Size.......: 8
SQLLEN Size........: 8
SQLSETPOSIROW Size.: 8
2、配置ODBC数据源
1、配置tnsnames.ora,并配置TNS_ADMIN系统环境变量
[root@localhost ~]# cat /opt/oracle/instantclient_19_19/network/admin/tnsnames.ora
DB10 =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.15.10)(PORT = 1521))
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = pdbname)
)
)
###配置TNS_ADMIN系统环境变量
[root@localhost ~]# vim /etc/profile ---添加下面export
export TNS_ADMIN=/opt/oracle/instantclient_19_19/network/admin
[root@localhost ~]# source /etc/profile
2、配置odbcinst.ini
vi /usr/local/etc/odbcinst.ini
[Ora_ODBC1919]
Description=Oracle ODBC Driver
Driver=/opt/oracle/instantclient_19_19/libsqora.so.19.1
3、配置odbc.ini
vi /usr/local/etc/odbc.ini
[ORA11] ---主要配置项
DSN = ORA11 ---主要配置项
Driver = Oracle ODBC1919 ---主要配置项(odbcinst.ini中的驱动配置名称)
ServerName = DB10 ---主要配置项 (tnsnames.ora网络服务名)
UserID=system
Password=oracle
TCP_PORT=1528
4、测试ODBC访问Oracle数据库
isql -v ora11
3、使用ODBC数据源创建DBLINK访问Oracle
DBLINK创建语法:
create link "LINKODBC1" connect 'ODBC' with "SYSTEM" identified by "oracle" using 'ORA11';
测试:
注意,如果不成功,可重启dm数据库进行重试。
[dmdba@localhost ~]$ cd $DM_HOME/bin
[dmdba@localhost bin]$ ./disql
disql V8
username:
password:
Server[LOCALHOST:5236]:mode is normal, state is open
login used time : 3.101(ms)
/***创建DBLINK***/
SQL> create link "LINKODBC1" connect 'ODBC' with "SCOTT" identified by "oracle" using 'ORA11';
executed successfully
used time: 7.763(ms). Execute id is 800.
SQL> select * from t1@linkodbc1;
LINEID NAME AGE SEX GRADE
---------- ---- --- --- -----
1 ?? 18 ? 1000
used time: 678.249(ms). Execute id is 801.
SQL>
---上面中文问号是由于数据库启动时未加载NLS_LANG环境变量导致,
需要在配置NLS_LANG环境变量并生效后重启数据库后可以正常显示
五、总结
DM DBLINK使用Oracle OCI方式和ODBC数据源的方式创建访问Oracle数据库,通过简单的测试对比发现,使用Oracle OCI方式兼容性等都要更好。
使用Oracle OCI方式,如果数据库启动时未加载Oracle OCI驱动,需要重启数据库加载Oracle OCI驱动后,才能正常使用DBLINK。
使用ODBC数据源方式,如果目的表数据有中文,那么需要在DM数据库服务器上配置正确的NLS_LANG环境变量并生效后在当前窗口重启DM数据库。
通过测试对比,建议使用Oracle OCI方式来创建DM DBLINK访问Oracle数据库。
更多资讯请上达梦技术社区了解:eco.dameng.com