注册
达梦通过DBLink连接Oracle配置步骤与常见问题处理
培训园地/ 文章详情 /

达梦通过DBLink连接Oracle配置步骤与常见问题处理

航航子🌻🌻🌻 2026/09/24 268 0 0

一、DBLink 基础概念

1.1 什么是 DBLink

DBLink 是一种允许用户在一个数据库中访问另一个数据库对象的技术,可跨数据库执行查询、数据操作或事务处理。

1.2 DBLink 类型

类型 说明
私有 DBLink 仅拥有者可访问,连 SYSDBA 都无法访问
公有 DBLink 所有用户均可访问,创建语法中加 PUBLIC

1.3 支持的外部连接类型

达梦 DBLink 支持通过以下驱动类型连接外部数据库:

连接库类型 用途
DPI 连接达梦数据库
ODBC 连接所有支持 ODBC 协议的数据库
ORACLE 连接 Oracle 数据库(OCI 接口)
DAMENG 连接达梦数据库
GATEWAY 通过网关连接

1.4 达梦连接 Oracle 的两种技术路线

方式 链路 适用场景
OCI 方式 DM DBLink → Oracle Instant Client OCI 接口 → Oracle 推荐,配置简单,性能较好
ODBC 方式 DM DBLink → unixODBC → Oracle ODBC 驱动 → Oracle 需要走 ODBC 标准协议时使用

二、环境准备

2.1 本例环境信息

项目 值
操作系统 麒麟 V10
系统架构 x86
glibc 版本 2.28
Oracle 服务端版本 19.19.0.0
Oracle 客户端版本 23.26.3.0.0(要求 glibc 2.28)

2.2 下载 Oracle Instant Client

在Oracle Instant Client官网进行下载

包名 是否必须 说明
Basic Package(instantclient-basic) 必须 包含 OCI 核心库 libclntsh.so
ODBC Package(instantclient-odbc) 可选 ODBC 驱动,ODBC 方式才需要
SQL*Plus Package 可选 调试用

libclntsh.so 是 OCI 通信核心驱动,dmserver 进程会加载它,负责与 Oracle 建立连接、传输 SQL、返回结果。缺少该文件则 OCI 驱动加载失败,DBLink 无法使用。

2.3 安装 libaio

libaio 是异步 I/O 系统库,是 OCI 库正常加载的前提。

# 检查是否已安装 rpm -qa | grep libaio # 输出示例 libaio-0.3.112-1.p01.ky10.x86_64 # 未安装则执行 yum install -y libaio

三、OCI 方式配置

3.1 解压 Oracle 客户端

unzip /opt/oracle/instantclient-basic-linux.x64-23.26.3.0.0.zip -d /opt/oracle

解压后会得到目录 /opt/oracle/instantclient_23_26/,其中包含:

  • libclntsh.so.23.1 / libclntsh.so(OCI 核心库)
  • libclntshcore.so.23.1
  • 其他 Oracle Instant Client 库文件

如果是 Instant Client 12.2 之前的版本,还需要手动创建软链接:

cd /opt/oracle/instantclient_12_2 ln -s libclntsh.so.12.1 libclntsh.so ln -s libocci.so.12.1 libocci.so

3.2 检查 OCI 库依赖

cd /opt/oracle/instantclient_23_26 ldd libclntsh.so

image.png

应能看到 libaio.so.1、libc.so.6、libclntshcore.so.23.1 等依赖均被正确解析,没有 not found。

3.3 配置动态链接库路径

让系统动态链接器能找到 Oracle 客户端库。

方式一:ld.so.conf.d(推荐,永久生效)

echo /opt/oracle/instantclient_23_26 > /etc/ld.so.conf.d/oracle-instantclient.conf cat /etc/ld.so.conf.d/oracle-instantclient.conf ldconfig

/etc/ld.so.conf.d/ 是 Linux 动态链接器的配置目录。执行 ldconfig 会扫描该目录下所有配置文件,把库路径缓存到运行时链接库缓存中。写完必须执行 ldconfig 刷新缓存,否则系统不识别新增路径。

验证是否生效:

ldconfig -p | grep libclntsh

配置完成后需要 重启达梦数据库 生效。

方式二:LD_LIBRARY_PATH(临时 / 调试)

LD_LIBRARY_PATH 优先级更高,适用于临时调试、多版本 Oracle 客户端共存、没有 root 权限不能修改系统配置的场景。但只对当前会话生效,重启失效。

修改 dmdba 用户下的 .bash_profile:

export LD_LIBRARY_PATH="$LD_LIBRARY_PATH:/opt/oracle/instantclient_23_26"

生效并查看:

source /home/dmdba/.bash_profile env | grep LD_LIBRARY_PATH

3.4 在 DM 中创建 OCI 方式 DBLink

语法:

CREATE [OR REPLACE] [PUBLIC] LINK [IF NOT EXISTS] <外部链接名> CONNECT ['<连接库类型>'] WITH <登录名> IDENTIFIED BY <登录口令> USING '<外部链接串>' [<OPTION 子句>];

创建示例:

CREATE OR REPLACE PUBLIC LINK DM_ORA_LINK CONNECT 'ORACLE' WITH "DBLINK_TEST" IDENTIFIED BY "Test@123" USING '10.36.25.30:1521/orcl';

3.5 使用 OCI DBLink

远程对象访问格式:

<对象名>@<外部链接名>

示例:

SELECT * FROM V$VERSION@DM_ORA_LINK;

image.png


四、ODBC 方式配置

4.1 安装 unixODBC

yum install -y unixODBC unixODBC-devel

查看配置:

odbcinst -j

image.png

输出说明:

项目 路径 作用
DRIVERS /etc/odbcinst.ini 驱动文件配置
SYSTEM DATA SOURCES /etc/odbc.ini 系统级 DSN
USER DATA SOURCES ~/.odbc.ini 用户级 DSN

4.2 解压 Oracle ODBC 驱动

unzip /opt/oracle/instantclient-odbc-linux.x64-23.26.3.0.0.zip -d /opt/oracle

默认解压到 /opt/oracle/instantclient_23_26/ 目录下。

4.3 配置 tnsnames.ora(可选,用于别名访问)

vi /opt/oracle/instantclient_23_26/network/admin/tnsnames.ora

内容示例:

DB10 = (DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST = 10.36.25.30)(PORT = 1521)) (CONNECT_DATA = (SERVER = DEDICATED) (SERVICE_NAME = orcl) ) )

配置后让 Oracle 客户端能找到它:

vim /etc/profile --添加 export TNS_ADMIN=/opt/oracle/instantclient_23_26/network/admin

4.4 配置 odbcinst.ini

向 unixODBC 驱动管理器注册 Oracle ODBC 驱动:

vi /etc/odbcinst.ini

内容:

[Oracle ODBC2326] Description = Oracle ODBC Driver Driver = /opt/oracle/instantclient_23_26/libsqora.so.23.1 Setup = FileUsage = CPTimeout = CPReuse =

libsqora.so.23.1 是 Oracle Instant Client 自带的 64 位 ODBC 驱动程序,unixODBC 靠这个 .so 文件与 Oracle 通信。

4.5 配置 odbc.ini

定义 DSN 数据源,unixODBC 使用;达梦 DBLink(ODBC 方式)会读取该文件。

vi /etc/odbc.ini

关键字段:

[ORA11] DSN = ORA11 Driver = Oracle ODBC2326 # odbcinst.ini 中的驱动名称 ServerName = DB10 # tnsnames.ora 中的网络服务名 UserID =

其余参数(如 AggregateSQLType、FetchBufferSize 等)可按默认配置,或根据 Oracle ODBC 文档调整。

4.6 创建 ODBC 方式 DBLink

CREATE OR REPLACE PUBLIC LINK "LINKODBC1" CONNECT 'ODBC' WITH "DBLINK_TEST" IDENTIFIED BY "Test@123" USING 'ORA11';

4.7 验证 ODBC 方式访问

Oracle 侧创建测试表:

DBLINK_TEST@orcl SQL> CREATE TABLE test_ora(id NUMBER); INSERT INTO test_ora VALUES(1); COMMIT;

DM 侧查询:

SELECT * FROM dual@LINKODBC1; SELECT * FROM test_ora@LINKODBC1;

image.png


五、常见问题与解决方法

问题一:DBLink 加载库文件失败(错误码 -2245)

现象
执行 SELECT 1 FROM dual@DM_ORA_LINK; 时报错:

-2245: 第 6 行附近出现错误:DBLINK加载库文件失败

原因
dmserver 进程找不到或无法加载 Oracle OCI 核心库 libclntsh.so,可能原因:

  1. Oracle Instant Client 未安装或未解压到正确目录
  2. libaio 未安装,导致 libclntsh.so 依赖缺失
  3. 动态链接库路径未配置,或配置后未执行 ldconfig
  4. 配置未重启达梦数据库生效

解决方法
按第 2、3 节步骤检查:

  1. 确认 libclntsh.so 存在
  2. 确认 ldd libclntsh.so 无 not found
  3. 配置 /etc/ld.so.conf.d/oracle-instantclient.conf 并执行 ldconfig
  4. 验证 ldconfig -p | grep libclntsh 有输出
  5. 重启达梦数据库

问题二:DBLink 连接丢失(错误码 -6033)

现象
执行 SELECT * FROM dual@DM_ORA_LINK; 时报错:

-6033: DBLINK连接丢失

连接 Oracle 过程中断,常见原因包括用户名/密码错误、大小写敏感问题、网络中断等。

1. 开启 DBLink 详细错误日志

ALTER SYSTEM SET 'ELOG_REPORT_LINK_SQL' = 1;

然后查看 dmserver 日志:

grep -E "DBLINK|ORA|ERROR" dm_DMSERVER_202609.log

image.png
示例日志中可看到 Oracle 返回的具体错误码,如:

  • ORA-01017: invalid username/password; logon denied
  • ORA-04043: object "dual" does not exist

2. 用户名/密码问题

Oracle 默认对未加双引号的标识符自动转为大写。需先确认 Oracle 中的用户名大小写:

SELECT username, password_versions, account_status FROM dba_users WHERE username = 'SJHL';

如果 Oracle 用户名实际是大写,但创建 DBLink 时用了小写可能会匹配不上;建议 DM 端用户名用双引号精确包裹。

3. 大小写敏感问题

image.png

DM 的 CASE_SENSITIVE 参数控制达梦对标识符的转换逻辑:

DM 大小写敏感 行为
大小写敏感(默认) 不带双引号的标识符自动转大写
大小写不敏感 不自动转大写,保留原文小写,如 dual 直接发给 Oracle

当 DM 是大小写不敏感时,访问 Oracle 的 dual、V$VERSION 等对象可能会因为大小写不一致而报错,可尝试在 DM 端对对象名加双引号,或确认 Oracle 中对象名大小写。


问题三:ODBC 方式查询公共对象 / 动态性能视图失败(错误码 -2251)

现象
ODBC 方式 DBLink 查询公共同义词、动态性能视图时报错:

-2251: DBLINK远程服务器获取对象[DUAL]失败
-2251: DBLINK远程服务器获取对象[V$VERSION]失败

image.png

但同样的 SQL 在 Oracle 侧直接执行可以查到:

image.png

原因
高版本 DM(1-2-70 版本)通过 ODBC 方式访问 Oracle 时,对公共同义词、动态性能视图等公共对象的解析存在兼容性问题,DBLink 无法正确解析这些对象所属的用户/模式。

解决方法
在 Oracle 数据库对应用户下创建有权限访问的非本用户对象同义词:

DBLINK_TEST@orcl SQL> create or replace synonym v$version for sys.v_$version;

然后在 DM 侧再次查询:

SELECT * FROM v$version@LINKODBC1;

image.png

说明:Oracle 中 V$VERSION 等动态性能视图实际底层是 V_$VERSION,创建同义词后 ODBC 方式即可访问。


六、调试验证清单

步骤 命令 预期结果
检查 libaio rpm -qa | grep libaio 有 libaio 包
检查 OCI 库依赖 ldd /opt/oracle/instantclient_23_26/libclntsh.so 无 not found
检查库缓存 ldconfig -p | grep libclntsh 能查到 Oracle 客户端路径
重启 DM 后测试 OCI SELECT * FROM V$VERSION@DM_ORA_LINK; 返回 Oracle 版本信息
检查 ODBC 配置 odbcinst -j 输出配置路径
测试 ODBC DSN(可选) isql -v ORA11 DBLINK_TEST Test@123 能连接 Oracle
测试 ODBC DBLink SELECT * FROM dual@LINKODBC1; 返回 X

七、关键参数速查

参数 说明
ELOG_REPORT_LINK_SQL 设置为 1 后,OCI 型 DBLink 会打印远端返回的 Oracle 错误
CASE_SENSITIVE DM 大小写敏感参数,影响对象名自动转换行为
TNS_ADMIN Oracle 客户端查找 tnsnames.ora 的环境变量
LD_LIBRARY_PATH 临时指定动态库搜索路径
/etc/ld.so.conf.d/ 永久配置动态库搜索路径
评论
后发表回复

作者

文章

阅读量

获赞

扫一扫
联系客服