达梦DBLINK之DM访问Oracle配置步骤

达梦通过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

相关推荐
止语Lab6 小时前
好的 DX 不等于少写代码——三种语言的摩擦力设计课
后端
吃饱了得干活6 小时前
别再手动解析 LLM 输出了!LangChain 四种结构化输出方案对比
后端·python·langchain
程序员天天困6 小时前
Arthas trace 命令怎么用?一行定位最慢那行代码
jvm·后端
Huiturn6 小时前
GPT 5.6 连续编码 10 小时,纯 Python 啃下 Word 二进制格式——doc2docx 实现拆解
后端
用户298698530147 小时前
Python 实现 Excel 与 Markdown 互转的实用指南
后端·python·excel
用户77283104908407 小时前
krono-job:零侵入、单二进制交付的分布式任务调度平台(开源)
后端
Conan在掘金7 小时前
鸿蒙报错速查:Function lacks ending return statement,返回路径漏 return 就炸,根因 + 真解法
后端
人间凡尔赛7 小时前
AI-Native 云原生架构:2026 年从容器编排到智能体编排的范式革命
后端·云原生·架构
IT_陈寒7 小时前
Vue的响应式让我加班到凌晨3点,原来问题出在这
前端·人工智能·后端
卷无止境7 小时前
提升 Python 代码健壮性的方法大盘点
后端·python