DBLINK(Database Link)是数据库提供的一种跨库访问机制。它本质上是一个建立在本地数据库中的"通道",通过这个通道,本地数据库可以像访问本地表一样,直接对远程数据库中的表执行查询、插入、更新、删除等操作。对应用来说,远程表几乎是"透明"的。
| 角色 | 数据库 | 版本 | IP 地址 | 端口 |
|---|---|---|---|---|
| 本地端 | 达梦 DM8 | DM8 | 192.168.233.101 | 5236 |
| 远程端 | 达梦 DM8 | DM8 | 192.168.233.103 | 5288 |
| 异构端 | MySQL | 8.0.17 | 192.168.31.231 | 3306 |
分别登录两台达梦,查询实例名:
SELECT NAME FROM V$INSTANCE;
结果两台都是 DMSERVER。但官方文档明确要求"A 和 B 的实例名不能一样",所以把 .103 改成 DMSERVER2。
分别在这两台服务器上进入数据库安装目录下的库目录里修改 dm.ini 文件:MAL_INI=1
在 dm.ini 同级目录下,新建或编辑 dmmal.ini(两台主机的 dmmal.ini 文件相同):
[mal_inst1]
mal_inst_name = DMSERVER
mal_host = 192.168.233.101
mal_port = 5282
[mal_inst2]
mal_inst_name = DMSERVER2
mal_host = 192.168.233.103
mal_port = 5283
配置成功之后分别重启 dmserver DM 数据库服务。
在主机 A(.101)上建表
CREATE TABLE TEST(C1 INT,C2 VARCHAR(20));
在 B(.103)上建立到 A 的数据库链接
CREATE PUBLIC LINK LINK01
CONNECT WITH SYSDBA IDENTIFIED BY "Dameng123"
USING '192.168.233.101/5282';
在 B 上做增删改查
INSERT INTO TEST@LINK01 VALUES(1,'A');
INSERT INTO TEST@LINK01 VALUES(2,'B');
UPDATE TEST@LINK01 SET C2='C' WHERE C1=1;
DELETE FROM TEST@LINK01 WHERE C1=2;
COMMIT;
SELECT * FROM TEST@LINK01;
<img src=“C:\Users\70790\AppData\Roaming\Typora\typora-user-images\image-20260918103351754.png” alt=“image-20260918103351754” style=“zoom:67%;” />
如果不再需要,可以删掉 DBLINK:
DROP PUBLIC LINK LINK01;
达梦本身不认识 MySQL 的协议,所以需要在达梦所在的虚拟机(.101)上装一个 MySQL 的 ODBC 驱动,让达梦通过 ODBC 去访问 MySQL
DM (192.168.233.101) → unixODBC → MySQL ODBC 驱动 → MySQL (192.168.31.231:3306)
在达梦虚拟机上装 unixODBC,到这个网站:https://dev.mysql.com/downloads/connector/odbc/
里面MySQL ODBC 5.3.13 Unicode Driver和 DM8 ODBC DRIVER:
点顶的系统 DSN标签页,再点击右侧的添加按钮
回到系统 DSN标签页,能看到 mysql_local_53 出现在列表里。
在DM中输入:
CREATE PUBLIC LINK LINK_MYSQL
CONNECT 'ODBC'
WITH "dm_link" IDENTIFIED BY "Dameng123"
USING 'mysql_local';
查询mysql中的oms_order表,成功!
这是整个实验中最关键、也最耗时的部分。实验过程中尝试了三个驱动版本,结果完全不同:
驱动版本 结果 原因
26.7 报 系统错误 127 驱动太新,达梦加载失败,DLL 依赖或位数兼容问题
8.0 报 -2246 DBLINK不支持该数据类型 驱动上报的字段类型元数据格式,达梦 DBLINK 解析不了
5.3 ✅ 成功 老版本驱动上报的元数据格式,正好在达梦 DBLINK 能识别的范围内
问题分析
26.7 版本:达梦加载驱动时直接失败,报"系统错误 127",这是 Windows 的"找不到指定的程序"错误,本质是 DLL 依赖缺失或位数不匹配。
8.0 版本:连接能建立,但查询时报 -2246。这个错误的本质是:达梦在处理 MySQL 表结构时,无法解析 8.0 驱动上报的字段类型元数据。即使表为空也会报错,因为达梦需要先读取表结构才能构建查询计划,读不懂就直接失败。
5.3 版本:换用 5.3 后,同一个查询直接通过。
结论
MySQL Connector/ODBC 的驱动版本,直接决定了达梦 DBLINK 能不能正常识别 MySQL 表的数据类型。
达梦通过 ODBC 访问 MySQL 时,驱动不宜选用过新的版本。8.0 和 5.3 的差别不在于功能强弱,而在于"上报格式"——达梦 DBLINK 对 ODBC 驱动返回的字段类型描述有固定的解析逻辑,新驱动改了上报方式,达梦就不认识了。
文章
阅读量
获赞
