达梦通过DBLINK访问Oracle数据库有两种方式一种是通过Oracle oci接口,一种是通过ODBC数据源的方式。
一、下载Oracle客户端驱动(Instant Client)
下载地址:Oracle Instant Client Downloads
下载下面两个包

二、检查操作系统环境
- 主要在DM数据库主机上进行环境检查
1、检查glibc版本
rpm -qi glibc

2、检查是否有安装libaio包
csharp
[root@localhost ~]# rpm -qa|grep libaio
libaio-0.3.109-13.el7.x86_64
三、使用 oci接口 方式来进行配置
- 主要在DM数据库主机上进行安装
1、解压安装Oracle Instant Client包
bash
mkdir -p /opt/oracle

解压压缩包
python
unzip instantclient-basic-linux-arm64.zip
unzip instantclient-odbc-linux-arm64.zip
ls -l instantclient_19_19

2、配置环境变量
-添加到/etc/ld.so.conf.d目录下
bash
echo /opt/oracle/instantclient_19_19 > /etc/ld.so.conf.d/oracle-instantclient.conf
配置LD_LIBRARY_PATH环境变量
修改dmdba用户下的.bash_profile文件,添加如下内容
bash
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、创建外部连接
- 注意用户名全大写
sql
CREATE OR REPLACE LINK "SYSDBA"."LINKORA" CONNECT 'ORACLE' WITH "SYSTEM" IDENTIFIED BY "******" USING '10.8.148.17:1528/ORCLPDB1';
5、创建测试表
SYSTEM 模式下创建表
- 注意创建的表名最好全大写
sql
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";
测试查询
sql
select * from TREE01@LINKORA

四、 通过ODBC数据源进行访问
1、安装ODBC驱动包
下载 odbc驱动包,下载地址
ruby
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动态库缺少依赖库。如下:
ini
[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目录下指定的配置文件中,如下:
csharp
[root@localhost ~]# echo /usr/local/lib > /etc/ld.so.conf.d/libodbc.conf
[root@localhost ~]# ldconfig
(2)yum安装,配置好yum源之后直接安装即可
typescript
[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系统环境变量
ini
[root@localhost ~]# cat /opt/oracle/instantclient_19_13/network/admin/tnsnames.ora
DB10 =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.15.10)(PORT = 1521))
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = orcl)
)
)
###配置TNS_ADMIN系统环境变量
[root@localhost ~]# vim /etc/profile ---添加下面export
export TNS_ADMIN=/opt/oracle/instantclient_19_13/network/admin
[root@localhost ~]# source /etc/profile
2、配置odbcinst.ini
ini
[Oracle ODBC1919]
Description = Oracle ODBC Driver
Driver = /opt/oracle/instantclient_19_19/libsqora.so.19.1
Setup =
FileUsage =
CPTimeout =
CPReuse =
3、配置odbc.ini
ini
[ORA11] ---主要配置项
DSN = ORA11 ---主要配置项
Driver = Oracle ODBC1913 ---主要配置项(odbcinst.ini中的驱动配置名称)
ServerName = DB10 ---主要配置项 (tnsnames.ora网络服务名)
UserID =
AggregateSQLType = FLOAT
Application Attributes = T
Attributes = W
BatchAutocommitMode = IfAllSuccessful
BindAsFLOAT = F
CacheBufferSize = 20
CloseCursor = F
DisableDPM = F
DisableMTS = T
DisableRULEHint = T
EXECSchemaOpt =
EXECSyntax = T
Failover = T
FailoverDelay = 10
FailoverRetryCount = 10
FetchBufferSize = 64000
ForceWCHAR = F
LobPrefetchSize = 8192
Lobs = T
Longs = T
MaxLargeData = 0
MaxTokenSize = 8192
MetadataIdDefault = F
QueryTimeout = T
ResultSets = T
SQLGetData extensions = F
SQLTranslateErrors = F
StatementCache = F
Translation DLL =
Translation Option = 0
UseOCIDescribeAny = F
4、测试ODBC访问Oracle数据库
yaml
[dmdba@localhost ~]$ isql -v ORA11 scott oracle
+---------------------------------------+
| Connected! |
| |
| sql-statement |
| help [tablename] |
| quit |
| |
+---------------------------------------+
SQL> select * from emp;
+-------+-----------+----------+-------+--------------------+----------+----------+-------+
| EMPNO | ENAME | JOB | MGR | HIREDATE | SAL | COMM | DEPTNO|
+-------+-----------+----------+-------+--------------------+----------+----------+-------+
| 7369 | SMITH | CLERK | 7902 | 1980-12-17 00:00:00| 800 | | 20 |
| 7499 | ALLEN | SALESMAN | 7698 | 1981-02-20 00:00:00| 1600 | 300 | 30 |
| 7521 | WARD | SALESMAN | 7698 | 1981-02-22 00:00:00| 1250 | 500 | 30 |
| 7566 | JONES | MANAGER | 7839 | 1981-04-02 00:00:00| 2975 | | 20 |
| 7654 | MARTIN | SALESMAN | 7698 | 1981-09-28 00:00:00| 1250 | 1400 | 30 |
| 7698 | BLAKE | MANAGER | 7839 | 1981-05-01 00:00:00| 2850 | | 30 |
| 7782 | CLARK | MANAGER | 7839 | 1981-06-09 00:00:00| 2450 | | 10 |
| 7839 | KING | PRESIDENT| | 1981-11-17 00:00:00| 5000 | | 10 |
| 7844 | TURNER | SALESMAN | 7698 | 1981-09-08 00:00:00| 1500 | 0 | 30 |
| 7900 | JAMES | CLERK | 7698 | 1981-12-03 00:00:00| 950 | | 30 |
| 7902 | FORD | ANALYST | 7566 | 1981-12-03 00:00:00| 3000 | | 20 |
| 7934 | MILLER | CLERK | 7782 | 1982-01-23 00:00:00| 1300 | | 10 |
+-------+-----------+----------+-------+--------------------+----------+----------+-------+
SQLRowCount returns -1
12 rows fetched
SQL> select * from t1;
+---------------------+-----------------------------------------+----+-----------------------------------------+
| NAME | AGE | SEX| GRADE |
+---------------------+-----------------------------------------+----+-----------------------------------------+
| ?? | 18 | ? | 1000 |
+---------------------+-----------------------------------------+----+-----------------------------------------+
SQLRowCount returns -1
1 rows fetched
SQL>
###可以看到上面中文会显示乱码,主要与客户端字符集环境有关
3、使用ODBC数据源创建DBLINK访问Oracle
DBLINK创建语法:
sql
create link "LINKODBC1" connect 'ODBC' with "SCOTT" identified by "oracle" using 'ORA11';
测试:
sql
[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