注册
达梦DBLINK相关实践(dm-dm、dm-oracle)
专栏/培训园地/ 文章详情 /

达梦DBLINK相关实践(dm-dm、dm-oracle)

南瓜鸡肉焖饭 2026/09/16 124 0 0
摘要

1.背景

学习了DCA,没有讲解dblink相关的东西,查看了官方文档相关的东之后,对dblink做一个实践的测试。
达梦的数据库链接(LINK / 外部链接)本质上是一条"去哪儿、用谁登录"的远程连接记录。本地库执行 <对象名>@<链接名>,数据库自动转成网络请求发往远端,从而实现跨库操作。

本次实验主要操作DM-DM以及DM-ORACLE;

  • DM→DM 只有"单实例直连"需求,一律走 DPI,不要为了建链去改 dmmal.ini。MAL 是给多机互联、主备优先选路准备的。
  • DM→Oracle 有且只有'ORACLE'一种类型,绕不开 OCI 客户端。
    设备信息:
    image.png

2.达梦到达梦

2.1.创建前检查

2.1.1.版本与关键参数

SELECT * FROM V$VERSION;
SELECT ID_CODE FROM DUAL;
SELECT PARA_NAME, PARA_VALUE FROM V$DM_INI WHERE PARA_NAME IN ('INSTANCE_NAME', 'PORT_NUM', 'MAL_INI', 'CASE_SENSITIVE', 'GLOBAL_STR_CASE_SENSITIVE');
PORT_NUM:走 DPI 时 USING 串里要填的就是它。
MAL_INI:只有走 MAL 路线才需要为 1;走 DPI 时保持 0 即可,不用动。
CASE_SENSITIVE 和 GLOBAL_STR_CASE_SENSITIVE :A、B 两端应一致。
image.png

2.1.2.网络连通性

从 A 机测 B 机的数据库端口(走MAL时改测MAL端口):
telnet 192.168.100.188 5236
这里我们本机,通过访问不同端口的实例来进行实验。

2.1.3.B机器的权限

只有 DBA 和具有 CREATE LINK 或 CREATE ANY LINK 权限的用户可以创建外部链接。若用普通账号,先授权:
GRANT CREATE LINK TO USER01;
GRANT CREATE ANY LINK TO USER01;
GRANT DROP LINK TO USER01;
GRANT DROP ANY LINK TO USER01;
本机我们使用sysdba用户创建,此用户有dba权限

2.1.4.机器确认没有同名链接

SELECT * FROM SYS.DBA_DB_LINKS;

2.2.DPI直连

推荐,DM→DM走这条

2.2.1.创建链接

-- 私有链接:只有创建者能引用,生产环境推荐
CREATE LINK LNK_A CONNECT 'DPI' WITH SYSDBA IDENTIFIED BY "Dameng123" USING '192.168.100.188:5236';
-- 公有链接:全库可引用,适合多应用共用的公共远端库
CREATE PUBLIC LINK PUB_LNK_A CONNECT 'DPI' WITH SYSDBA IDENTIFIED BY "Dameng123" USING '192.168.100.188:5236';
补充:也可以用 dm_svc.conf 里配置的服务名替代 IP:端口,便于后续换 IP 时只改配置不改链接:
CREATE LINK LNK_A_SVC CONNECT WITH SYSDBA IDENTIFIED BY "Dameng123" USING 'dm5236';

2.2.2.元数据校验

SELECT OWNER, OBJECT_NAME, OBJECT_TYPE, STATUS FROM SYS.DBA_OBJECTS WHERE OBJECT_TYPE = 'DBLINK';
SELECT * FROM SYS.DBA_DB_LINKS;
SELECT * FROM SYS.ALL_DB_LINKS;
image.png

2.2.3.连通性校验

SELECT COUNT(*) FROM SYSOBJECTS@LNK_A;也可以直接查数据,我直接查询了一个test1表。
预期:返回一个正整数。这是最可靠的连通判定,比 DUAL@link 兼容性更好。
image.png

2.2.4.增删改查验证

INSERT INTO TEST1@LNK_A VALUES (1, 1);
INSERT INTO TEST1@LNK_A VALUES (2, 1);
UPDATE TEST1@LNK_A SET C2 = 2 WHERE C1 = 1;
DELETE FROM TEST1@LNK_A WHERE C1 = 2;
COMMIT; -- 关键:对远端的修改必须在本地提交
SELECT * FROM TEST1@LNK_A ORDER BY C1;
image.png

2.2.5.远端过程 / 函数调用验证

建过程:
CREATE OR REPLACE PROCEDURE SP_HW(STR IN VARCHAR2(64)) AS
BEGIN
PRINT STR;
END;
/
远端调用:CALL SP_HW@LNK_A('hello_world');
注意:入参必须是 SQL 类型,不能用 DMSQL 程序类型,也不能用复合类型
image.png

2.2.6.删除link

DROP LINK LNK_A;
DROP PUBLIC LINK PUB_LNK_A;
DROP LINK IF EXISTS LNK_A_SVC;

2.3.MAL 互联

这条路要动配置文件,且两端必须对称。

2.3.1.改dm.ini

A、B 两台机器,数据库目录下的dm.ini都要改:
MAL_INI = 1

2.3.2.新建dmmal.ini

文件不存在就新建。A、B 两台机器该文件内容必须完全一致:
[mal_inst1]
mal_inst_name = DMSERVER
mal_host = 192.168.100.188
mal_port = 5276

[mal_inst2]
mal_inst_name = DMSERVER2
mal_host = 192.168.100.188
mal_port = 6276

2.3.3.重启 dmserver

A、B 两台都重启,配置才生效。

2.3.4.创建链接

端口填 A 机的 MAL 端口
CREATE PUBLIC LINK LINK01 CONNECT 'DAMENG' WITH SYSDBA IDENTIFIED BY "Dameng123" USING '192.168.100.188/5276';

2.3.5.检查后删除

select * from dual@LINK01;
drop PUBLIC LINK LINK01;
image.png

3.达梦到ORACLE

3.1.检查端口连通性

检查达梦搭到oracle监听端口是否通
telnet 192.168.100.10 1521
curl -v 192.168.100.10:1521

3.2.配置OCI

Oracle官网下载x86环境下的驱动(有oci的就可以)
驱动名称:instantclient-basic-linux.x64-19.32.0.0.0dbru.zip
上传至达梦数据库服务器任一目录解压
解压至/home/dmdba/instantclient_19_32下
ldd 核查系统环境是否有库文件缺失
ldd libclntsh.so
修改环境变量并生效
vi .bash_profile
#在现有环境下添加红色部分
export LD_LIBRARY_PATH="$LD_LIBRARY_PATH:/home/dmdba/dmdbms/bin:/home/dmdba/instantclient_19_32"
image.png

3.3.重启数据库服务

DmServiceDMSERVER restart

3.4.创建dblink

create or replace PUBLIC LINK DB19C CONNECT 'ORACLE' WITH system IDENTIFIED BY "123123" USING '192.168.100.10:1521/oracle19c';

3.5.检查dblink有效性

select * from dual@DB19C;
image.png

4.问题排查

达梦侧开启dblink日志,新的版本默认未开启,若连接失败,查看实例日志的ERROR
sp_set_para_value(1,'ELOG_REPORT_LINK_SQL',1);
开启后可以看到报错日志如下:
image.png

评论
后发表回复

作者

文章

阅读量

获赞

扫一扫
联系客服