环境版本:
DM8.1.4.200
Oracle11.2.0.1.0
在国产化数据库迁移场景中,经常会遇到达梦数据库需要访问 Oracle 库表数据的需求。达梦数据库支持 DBLINK 功能,可以直接跨库访问 Oracle 的数据,实现数据查询、同步等业务。本文基于 DM8.1.4.200 连接 Oracle11.2.0.1.0 环境,完整记录从环境准备、驱动部署、DBLink 创建到常见故障排查全流程。
登录 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;
专门给达梦 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 instantclient 驱动,需要在达梦服务器安装对应版本 rpm 包。
下载 oracle‑instantclient11.2‑basic‑11.2.0.4.0‑1.x86_64.rpm,上传到达梦服务器进行安装解压。
进入解压之后的 lib 目录,把 so 动态库文件属主修改为达梦运行用户dmdba:dinstall,否则达梦进程无法加载库文件。
cd /usr/lib/oracle/11.2/client64/lib
chown dmdba.dinstall ./*.so*
cp -rf ./*.so* /home/dmdba/dmdbms/bin/
提示:部分环境需要手动创建 so 软链接,根据
ldd检测结果按需处理。
编辑 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
切换 dmdba 用户,检查libclntsh.so依赖是否全部找到,不能出现 not found,出现缺失代表驱动部署异常,DBLINK 会连接失败。
ldd libclntsh.so
⚠️重点: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':远端数据库类型固定写 ORACLEWITH "DM_LINK_USER":Oracle 访问账号,必须双引号大写IDENTIFIED BY "Dameng123":Oracle 账号密码USING 'IP:端口/完整服务名':Oracle 连接串语法格式:表名@DBLINK名称,Oracle 的表名也建议大写
select * from SYS.TEST_DBLINK@LINKORA;
成功返回 ID、NAME 测试数据,代表整个 DBLink 链路跑通。
达梦可以开启参数,把 DBLINK 执行 SQL 记录到达梦日志,方便定位跨库报错。
ALTER SYSTEM SET 'ELOG_REPORT_LINK_SQL' = 1;
注意:该参数实例重启后失效,重启数据库需要重新设置。
过滤 DBLINK 相关报错日志命令:
grep -E "DBLINK|ORA|ERROR" dm_DMSERVER_202609.log
现象:创建 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'
现象:创建 dblink 成功,但是查询报‑7096 远程操作符执行失败。
根因:达梦大小写不敏感,如果用户名不加双引号,会自动转小写传到 Oracle,Oracle 找不到小写用户,鉴权失败。
错误写法(没有双引号,用户名小写)
WITH dm_link_user IDENTIFIED BY "Dameng123"
正确写法(双引号强制大写)
WITH "DM_LINK_USER" IDENTIFIED BY "Dameng123"
DBLINK、ORA、ERROR关键字定位根因。ldd命令检查依赖库,出现 not found,DBLINK 一定异常。文章
阅读量
获赞
