注册
使用DBLINK,从DM到MYSQL报错原因与解决
专栏/技术分享/ 文章详情 /

使用DBLINK,从DM到MYSQL报错原因与解决

chinuppp 2026/09/23 254 0 0
摘要

什么是 DBLINK

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

一、DM 到 DM:同构连接

1. 确认实例名

分别登录两台达梦,查询实例名:

SELECT NAME FROM V$INSTANCE;

image.png
image.png
结果两台都是 DMSERVER。但官方文档明确要求"A 和 B 的实例名不能一样",所以把 .103 改成 DMSERVER2。

image.png

分别在这两台服务器上进入数据库安装目录下的库目录里修改 dm.ini 文件:MAL_INI=1

image.png

  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
  2. 配置成功之后分别重启 dmserver DM 数据库服务。

  3. 在主机 A(.101)上建表

    CREATE TABLE TEST(C1 INT,C2 VARCHAR(20));

    image.png

  4. 在 B(.103)上建立到 A 的数据库链接

    CREATE PUBLIC LINK LINK01 CONNECT WITH SYSDBA IDENTIFIED BY "Dameng123" USING '192.168.233.101/5282';
  5. 在 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%;” />

image.png

  1. 如果不再需要,可以删掉 DBLINK:

    DROP PUBLIC LINK LINK01;

五、MYSQL到DM

达梦本身不认识 MySQL 的协议,所以需要在达梦所在的虚拟机(.101)上装一个 MySQL 的 ODBC 驱动,让达梦通过 ODBC 去访问 MySQL

DM (192.168.233.101) → unixODBC → MySQL ODBC 驱动 → MySQL (192.168.31.231:3306)

  1. 在达梦虚拟机上装 unixODBC,到这个网站:https://dev.mysql.com/downloads/connector/odbc/
    9ab9f4fbd2bd41d7b1b05154e181c95a.png

  2. 里面MySQL ODBC 5.3.13 Unicode Driver和 DM8 ODBC DRIVER:
    image.png

  3. 点顶的系统 DSN标签页,再点击右侧的添加按钮
    image.png

  4. 回到系统 DSN标签页,能看到 mysql_local_53 出现在列表里。
    image.png
    在DM中输入:

CREATE PUBLIC LINK LINK_MYSQL CONNECT 'ODBC' WITH "dm_link" IDENTIFIED BY "Dameng123" USING 'mysql_local';

image.png

查询mysql中的oms_order表,成功!
image.png

这是整个实验中最关键、也最耗时的部分。实验过程中尝试了三个驱动版本,结果完全不同:

驱动版本 结果 原因
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 驱动返回的字段类型描述有固定的解析逻辑,新驱动改了上报方式,达梦就不认识了。

评论
后发表回复

作者

文章

阅读量

获赞

扫一扫
联系客服