注册
达梦 DM8 通过 DBLink 访问 Oracle 数据库完整实战
专栏/技术分享/ 文章详情 /

达梦 DM8 通过 DBLink 访问 Oracle 数据库完整实战

z'z'z'z 2026/09/23 310 0 0
摘要

环境版本:
DM8.1.4.200
Oracle11.2.0.1.0

前言

在国产化数据库迁移场景中,经常会遇到达梦数据库需要访问 Oracle 库表数据的需求。达梦数据库支持 DBLINK 功能,可以直接跨库访问 Oracle 的数据,实现数据查询、同步等业务。本文基于 DM8.1.4.200 连接 Oracle11.2.0.1.0 环境,完整记录从环境准备、驱动部署、DBLink 创建到常见故障排查全流程。

环境信息

  • Oracle 版本:11.2.0.1.0‑Production
  • 达梦版本:DM8.1.4.200

一、Oracle 侧准备工作

1.1 创建测试表

登录 Oracle 数据库,准备一张测试表,用于后续跨库验证。

sqlplus sys/Cr030511@orcl as sysdba
CREATE TABLE SYS.TEST_DBLINK (ID NUMBER,NAME VARCHAR2(20));
INSERT INTO SYS.TEST_DBLINK VALUES(1,'张三');
INSERT INTO SYS.TEST_DBLINK VALUES(2,'李四');
INSERT INTO SYS.TEST_DBLINK VALUES(3,'王五');
commit;

1.2 创建 DBLink 专用访问账号

专门给达梦 DBLINK 使用的用户,只授予会话登录和查询测试表权限,遵循最小权限原则。

-- 创建用户
CREATE USER dm_link_user IDENTIFIED BY "Dameng123";
-- 授予登录权限
GRANT CREATE SESSION TO dm_link_user;
-- 授予查询测试表权限
GRANT SELECT ON SYS.TEST_DBLINK TO dm_link_user;

验证账号是否可以正常查询:

conn dm_link_user/Dameng123@orcl
SELECT * FROM SYS.TEST_DBLINK;

能正常返回张三、李四、王五数据,代表 Oracle 账号侧配置完成。

二、达梦服务器部署 Oracle 客户端驱动

达梦访问 Oracle 底层依赖 Oracle instantclient 驱动,需要在达梦服务器安装对应版本 rpm 包。

2.1 下载驱动包

下载 oracle‑instantclient11.2‑basic‑11.2.0.4.0‑1.x86_64.rpm,上传到达梦服务器进行安装解压。

2.2 修改库文件属主

进入解压之后的 lib 目录,把 so 动态库文件属主修改为达梦运行用户dmdba:dinstall,否则达梦进程无法加载库文件。

cd /usr/lib/oracle/11.2/client64/lib
chown dmdba.dinstall  ./*.so*

2.3 复制驱动库到达梦 bin 目录

cp -rf ./*.so*   /home/dmdba/dmdbms/bin/

提示:部分环境需要手动创建 so 软链接,根据 ldd 检测结果按需处理。

2.4 配置 dmdba 用户环境变量

编辑 dmdba 用户的.bash_profile,增加如下环境变量:

export DM_HOME="/home/dmdba/dmdbms"
export ORACLE_HOME=/usr/lib/oracle/11.2/client64
export PATH=$DM_HOME/bin:$ORACLE_HOME/bin:$PATH
export LD_LIBRARY_PATH=$DM_HOME/bin:$ORACLE_HOME/lib
export NLS_LANG=AMERICAN_AMERICA.ZHS16GBK

使环境变量生效:

source /home/dmdba/.bash_profile

2.5 校验动态库依赖

切换 dmdba 用户,检查libclntsh.so依赖是否全部找到,不能出现 not found,出现缺失代表驱动部署异常,DBLINK 会连接失败。

ldd libclntsh.so

三、达梦数据库创建 DBLink

3.1 创建 Public DBLink 连接 Oracle

⚠️重点:Oracle 侧用户名需要使用双引号强制大写,否则会报权限错误;USING 里面填写完整 Oracle 服务名。

CREATE OR REPLACE PUBLIC LINK LINKORA
CONNECT 'ORACLE'
WITH "DM_LINK_USER" IDENTIFIED BY "Dameng123"
USING '192.168.1.82:1521/orcl.168.1.82';

参数说明:

  • LINKORA:自定义 dblink 名称
  • CONNECT 'ORACLE':远端数据库类型固定写 ORACLE
  • WITH "DM_LINK_USER":Oracle 访问账号,必须双引号大写
  • IDENTIFIED BY "Dameng123":Oracle 账号密码
  • USING 'IP:端口/完整服务名':Oracle 连接串

3.2 通过 DBLink 查询 Oracle 表数据

语法格式:表名@DBLINK名称,Oracle 的表名也建议大写

select * from SYS.TEST_DBLINK@LINKORA;

成功返回 ID、NAME 测试数据,代表整个 DBLink 链路跑通。

四、开启 DBLink 辅助排查日志

达梦可以开启参数,把 DBLINK 执行 SQL 记录到达梦日志,方便定位跨库报错。

ALTER SYSTEM SET 'ELOG_REPORT_LINK_SQL' = 1;

注意:该参数实例重启后失效,重启数据库需要重新设置。

过滤 DBLINK 相关报错日志命令:

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

五、常见报错踩坑总结

错误 1:‑6033 DBLINK 连接丢失

现象:创建 dblink 或者查询时报‑6033,连接丢失。
根因:USING 中 Oracle 服务名填写不完整。

解决:
Oracle 数据库查询真实 service_names

select value from v$parameter where name='service_names';

DBLINK 的 USING 部分使用查询出来完整服务名

USING '192.168.1.82:1521/orcl.168.1.82'

错误 2:‑7096 远程操作符执行失败

现象:创建 dblink 成功,但是查询报‑7096 远程操作符执行失败。
根因:达梦大小写不敏感,如果用户名不加双引号,会自动转小写传到 Oracle,Oracle 找不到小写用户,鉴权失败。

错误写法(没有双引号,用户名小写)

WITH dm_link_user IDENTIFIED BY "Dameng123"

正确写法(双引号强制大写)

WITH "DM_LINK_USER" IDENTIFIED BY "Dameng123"

六、重要经验总结

  1. 优先看达梦日志排查:不同达梦小版本,同一个故障返回错误码可能不一致,不要死记错误码,优先过滤 DM 日志中DBLINK、ORA、ERROR关键字定位根因。
  2. Oracle 对象大小写:通过 DBLINK 访问 Oracle,用户名、表名建议双引号大写;Oracle 数据库默认对象都是大写存储。
  3. 驱动权限不能忽略:instantclient 的 so 动态库必须给到 dmdba 用户权限,ldd命令检查依赖库,出现 not found,DBLINK 一定异常。
  4. 服务名不是 SID:USING 后面对应 Oracle 的 service_name,不是 SID,两者不要混淆,否则报‑6033 连接丢失。
评论
后发表回复

作者

文章

阅读量

获赞

扫一扫
联系客服