DBLink 是一种允许用户在一个数据库中访问另一个数据库对象的技术,可跨数据库执行查询、数据操作或事务处理。
| 类型 | 说明 |
|---|---|
| 私有 DBLink | 仅拥有者可访问,连 SYSDBA 都无法访问 |
| 公有 DBLink | 所有用户均可访问,创建语法中加 PUBLIC |
达梦 DBLink 支持通过以下驱动类型连接外部数据库:
| 连接库类型 | 用途 |
|---|---|
DPI |
连接达梦数据库 |
ODBC |
连接所有支持 ODBC 协议的数据库 |
ORACLE |
连接 Oracle 数据库(OCI 接口) |
DAMENG |
连接达梦数据库 |
GATEWAY |
通过网关连接 |
| 方式 | 链路 | 适用场景 |
|---|---|---|
| OCI 方式 | DM DBLink → Oracle Instant Client OCI 接口 → Oracle | 推荐,配置简单,性能较好 |
| ODBC 方式 | DM DBLink → unixODBC → Oracle ODBC 驱动 → Oracle | 需要走 ODBC 标准协议时使用 |
| 项目 | 值 |
|---|---|
| 操作系统 | 麒麟 V10 |
| 系统架构 | x86 |
| glibc 版本 | 2.28 |
| Oracle 服务端版本 | 19.19.0.0 |
| Oracle 客户端版本 | 23.26.3.0.0(要求 glibc 2.28) |
在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 无法使用。
libaio 是异步 I/O 系统库,是 OCI 库正常加载的前提。
# 检查是否已安装
rpm -qa | grep libaio
# 输出示例
libaio-0.3.112-1.p01.ky10.x86_64
# 未安装则执行
yum install -y libaio
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如果是 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
cd /opt/oracle/instantclient_23_26
ldd libclntsh.so
应能看到 libaio.so.1、libc.so.6、libclntshcore.so.23.1 等依赖均被正确解析,没有 not found。
让系统动态链接器能找到 Oracle 客户端库。
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 优先级更高,适用于临时调试、多版本 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
语法:
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';
远程对象访问格式:
<对象名>@<外部链接名>
示例:
SELECT * FROM V$VERSION@DM_ORA_LINK;
yum install -y unixODBC unixODBC-devel
查看配置:
odbcinst -j
输出说明:
| 项目 | 路径 | 作用 |
|---|---|---|
DRIVERS |
/etc/odbcinst.ini |
驱动文件配置 |
SYSTEM DATA SOURCES |
/etc/odbc.ini |
系统级 DSN |
USER DATA SOURCES |
~/.odbc.ini |
用户级 DSN |
unzip /opt/oracle/instantclient-odbc-linux.x64-23.26.3.0.0.zip -d /opt/oracle
默认解压到 /opt/oracle/instantclient_23_26/ 目录下。
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
向 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 通信。
定义 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 文档调整。
CREATE OR REPLACE PUBLIC LINK "LINKODBC1"
CONNECT 'ODBC'
WITH "DBLINK_TEST" IDENTIFIED BY "Test@123"
USING 'ORA11';
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;
现象
执行 SELECT 1 FROM dual@DM_ORA_LINK; 时报错:
-2245: 第 6 行附近出现错误:DBLINK加载库文件失败
原因
dmserver 进程找不到或无法加载 Oracle OCI 核心库 libclntsh.so,可能原因:
libaio 未安装,导致 libclntsh.so 依赖缺失ldconfig解决方法
按第 2、3 节步骤检查:
libclntsh.so 存在ldd libclntsh.so 无 not found/etc/ld.so.conf.d/oracle-instantclient.conf 并执行 ldconfigldconfig -p | grep libclntsh 有输出现象
执行 SELECT * FROM dual@DM_ORA_LINK; 时报错:
-6033: DBLINK连接丢失
连接 Oracle 过程中断,常见原因包括用户名/密码错误、大小写敏感问题、网络中断等。
ALTER SYSTEM SET 'ELOG_REPORT_LINK_SQL' = 1;
然后查看 dmserver 日志:
grep -E "DBLINK|ORA|ERROR" dm_DMSERVER_202609.log
示例日志中可看到 Oracle 返回的具体错误码,如:
ORA-01017: invalid username/password; logon deniedORA-04043: object "dual" does not existOracle 默认对未加双引号的标识符自动转为大写。需先确认 Oracle 中的用户名大小写:
SELECT username, password_versions, account_status
FROM dba_users
WHERE username = 'SJHL';
如果 Oracle 用户名实际是大写,但创建 DBLink 时用了小写可能会匹配不上;建议 DM 端用户名用双引号精确包裹。
DM 的 CASE_SENSITIVE 参数控制达梦对标识符的转换逻辑:
| DM 大小写敏感 | 行为 |
|---|---|
| 大小写敏感(默认) | 不带双引号的标识符自动转大写 |
| 大小写不敏感 | 不自动转大写,保留原文小写,如 dual 直接发给 Oracle |
当 DM 是大小写不敏感时,访问 Oracle 的
dual、V$VERSION等对象可能会因为大小写不一致而报错,可尝试在 DM 端对对象名加双引号,或确认 Oracle 中对象名大小写。
现象
ODBC 方式 DBLink 查询公共同义词、动态性能视图时报错:
-2251: DBLINK远程服务器获取对象[DUAL]失败
-2251: DBLINK远程服务器获取对象[V$VERSION]失败
但同样的 SQL 在 Oracle 侧直接执行可以查到:
原因
高版本 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;
说明: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/ |
永久配置动态库搜索路径 |
文章
阅读量
获赞
