本文为 Centos7 DM8 → MySQL 8.4 DBLINK 配置及验证,其中数据库部署前检查和单机安装已略过,详情请参考历史文章和 DM 官网:
https://eco.dameng.com/document/dm/zh-cn/ops/DW-installation-cluster.html
安装包下载:https://eco.dameng.com/download/
达梦社区地址: https://eco.dameng.com
1. 环境准备
DM8 单机 + MySQL 8.4 单机,数据库安装过程不再介绍,DM8 单机安装可参考历史文章及达梦官网。
注意:DM 与 MySQL 的大小写敏感机制存在差异,配置 DBLINK 时需要重点关注用户名及表名大小写。
2. DM8 安装 unixODBC
yum -y install unixODBC unixODBC-devel odbcinst -j isql --version
本环境验证结果:
unixODBC 2.3.1 DRIVERS............: /etc/odbcinst.ini SYSTEM DATA SOURCES: /etc/odbc.ini FILE DATA SOURCES..: /etc/ODBCDataSources USER DATA SOURCES..: /root/.odbc.ini SQLULEN Size.......: 8 SQLLEN Size........: 8 SQLSETPOSIROW Size.: 8 isql --version unixODBC 2.3.1
3. 下载 MySQL Connector/ODBC
下载地址:
https://downloads.mysql.com/archives/c-odbc/
注意:MySQL Connector/ODBC 的 Linux 二进制包需要与操作系统 glibc 版本匹配。
本环境:
CentOS 7.9
glibc 2.17
x86_64
实际使用:
mysql-connector-odbc-8.0.29-linux-glibc2.12-x86-64bit.tar.gz
4. 上传并解压 MySQL Connector/ODBC
cd /opt
tar -xzf /root/mysql-connector-odbc-8.0.29-linux-glibc2.12-x86-64bit.tar.gz
安装目录:
/opt/mysql-connector-odbc-8.0.29-linux-glibc2.12-x86-64bit
主要驱动文件:
/opt/mysql-connector-odbc-8.0.29-linux-glibc2.12-x86-64bit/lib/libmyodbc8w.so
检查驱动依赖:
ldd /opt/mysql-connector-odbc-8.0.29-linux-glibc2.12-x86-64bit/lib/libmyodbc8w.so | grep "not found"
无输出表示没有发现缺失的动态库。
5. 将 MySQL ODBC 驱动注册到 unixODBC
配置 /etc/odbcinst.ini:
cat >/etc/odbcinst.ini <<'EOF'
[MySQL ODBC 8.0 Unicode Driver]
Description=MySQL Connector/ODBC 8.0.29 Unicode Driver
Driver=/opt/mysql-connector-odbc-8.0.29-linux-glibc2.12-x86-64bit/lib/libmyodbc8w.so
Setup=
UsageCount=1
EOF
验证:
odbcinst -j odbcinst -q -d
应看到:
[MySQL ODBC 8.0 Unicode Driver]
6. 配置 /etc/odbc.ini
根据实际 MySQL 环境修改:
cat >/etc/odbc.ini <<'EOF'
[mysql8]
Driver=MySQL ODBC 8.0 Unicode Driver
SERVER=192.168.88.88
PORT=3306
DATABASE=USER
CHARSET=utf8mb4
EOF
检查:
cat /etc/odbc.ini
本环境 DSN:
mysql8
7. 使用 isql 测试 MySQL ODBC 连接
使用 MySQL 用户测试:
isql -v mysql8 USER 'PASSWORD'
正常应返回:
+---------------------------------------+ | Connected! | | | | sql-statement | | help [tablename] | | quit | +---------------------------------------+ SQL>
注意:密码替换成实际 MySQL 用户密码。
8. 使用 dmdba 用户测试 ODBC
DM Server 最终使用 dmdba 用户运行,因此必须进一步验证 dmdba 用户是否能够正常连接:
su - dmdba -c "isql -v mysql8 USER 'PASSWORD'"
本环境已经验证:
+---------------------------------------+ | Connected! | | | | sql-statement | | help [tablename] | | quit | +---------------------------------------+ SQL>
说明:
dmdba ↓ unixODBC ↓ mysql8 ↓ MySQL Connector/ODBC ↓ MySQL 8.4
连接正常。
9. 检查 DM8 systemd 服务环境
检查 DM 服务环境:
systemctl show DmServiceDMSERVER.service -p Environment
systemctl cat DmServiceDMSERVER.service | grep -E 'Environment|ExecStart'
进一步确认实际 DM Server 进程:
pid=$(pgrep -f '/home/dmdba/dmdbms/bin/dmserver' | head -1)
echo "PID=$pid"
tr '\0' '\n' < /proc/$pid/environ | grep -E '^(LD_LIBRARY_PATH|ODBC|HOME)='
本环境实际:
LD_LIBRARY_PATH=/home/dmdba/dmdbms/bin:
HOME=/home/dmdba
由于使用与 DM Server 类似的环境执行 isql 已经能够:
+---------------------------------------+ | Connected! | | | | sql-statement | | help [tablename] | | quit | +---------------------------------------+ SQL>
因此本环境暂时**不需要额外修改 systemd 的 **LD_LIBRARY_PATH。
10. 创建 DM8 → MySQL DBLINK
本环境最终使用:
CREATE OR REPLACE LINK DBLINK_DM_MYSQL
CONNECT 'ODBC'
WITH "USER" IDENTIFIED BY "PASSWORD"
USING 'mysql8';
其中:
DBLINK_DM_MYSQL DBLINK名称
ODBC 使用ODBC连接
USER MySQL用户名
PASSWORD MySQL密码
mysql8 /etc/odbc.ini中的DSN
注意:当前 DM8 版本实际测试中,不能使用:
会报:
因此当前环境直接使用
USING 'mysql8'。
OPTION (DB_TYPE=MYSQL)
-2297: DBLINK选项[DB_TYPE]解析失败
11. 注意 DM DBLINK 用户名大小写
DM DBLINK 实际连接 MySQL 时,如果日志出现:
Access denied for user 'USER'@'192.168.88.97'
说明 DM 实际发送给 MySQL 的用户名是大写而不是小写。
这种情况下,需要根据 DM 日志确认实际用户名。
例如 MySQL 端创建对应用户:
CREATE USER 'USER'@'192.168.88.97'
IDENTIFIED WITH caching_sha2_password BY 'PASSWORD';
GRANT ALL PRIVILEGES ON USER.* TO 'USER'@'192.168.88.97';
SHOW GRANTS FOR 'USER'@'192.168.88.97';
本环境实际验证时,DM 日志出现了
USER@192.168.88.97,增加对应 MySQL 用户后,认证问题解决。
12. 创建简单测试表
在 MySQL 创建测试表。
考虑到 DM DBLINK 访问远程对象时存在对象名大写转换问题,本环境建议直接使用大写表名:
USE USER;
DROP TABLE IF EXISTS DBLINK_TEST_TABLE;
CREATE TABLE DBLINK_TEST_TABLE (
ID INT NOT NULL,
NAME VARCHAR(50),
AGE INT,
SALARY DECIMAL(10,2),
PRIMARY KEY (ID)
);
INSERT INTO DBLINK_TEST_TABLE (ID, NAME, AGE, SALARY) VALUES
(1, '张三', 25, 8000.00),
(2, '李四', 30, 12000.50),
(3, '王五', 28, 9500.00);
COMMIT;
SELECT * FROM DBLINK_TEST_TABLE;
13. DM8 测试 DBLINK
回到 DM8:
SELECT * FROM DBLINK_TEST_TABLE@DBLINK_DM_MYSQL;
如果正常,应返回:
ID NAME AGE SALARY 1 张三 25 8000.00 2 李四 30 12000.50 3 王五 28 9500.00




