本文适用于 DM8 64 位 → Oracle 19c 64 位,通过 Oracle Instant Client OCI 创建 DBLINK 的场景。
示例环境以 CentOS 7.x + Oracle Instant Client 19.32 为例。实际环境请根据 Oracle、DM、OS 版本调整。
其中数据库部署前检查和单机安装已略过,详情请参考历史文章和 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 服务器
主机名:dm97
OS:CentOS 7.9.2009
架构:x86_64
glibc:2.17
DM8 安装目录:
/home/dmdba/dmdbms
DM OS 用户:
dmdba
DM IP:
192.168.88.97
2. Oracle 19c 服务器
IP:
192.168.88.88
Port:
1521
Service Name:
orclpdb1
Oracle Home:
/opt/oracle/product/19c/dbhome_1
Oracle 用户:
<ORACLE_USER>
Oracle 密码:
<ORACLE_PASSWORD>
二、安装 Oracle Instant Client
DM8 通过 OCI 访问 Oracle,因此需要在 DM8 服务器安装 Oracle Instant Client。
Oracle Instant Client 官方下载地址:
本文使用:
instantclient-basic-linux.x64-19.32.0.0.0dbru.zip
将 ZIP 包上传至 DM8 服务器:
/root/instantclient-basic-linux.x64-19.32.0.0.0dbru.zip
1. 创建 Oracle 客户端目录
mkdir -p /opt/oracle
2. 解压
unzip -q /root/instantclient-basic-linux.x64-19.32.0.0.0dbru.zip -d /opt/oracle
解压完成后目录通常为:
/opt/oracle/instantclient_19_32
检查:
ls -lh /opt/oracle/instantclient_19_32/
重点确认存在:
libclntsh.so libclntsh.so.19.1 libclntshcore.so.19.1 libnnz19.so genezi network/
三、检查 OCI 动态库依赖
首先检查 libclntsh.so 是否存在未找到的依赖库:
ldd /opt/oracle/instantclient_19_32/libclntsh.so | grep "not found"
如果有输出,例如:
libnnz19.so => not found libclntshcore.so.19.1 => not found
说明动态库搜索路径尚未配置。
四、配置系统动态库路径
创建动态库配置文件:
cat > /etc/ld.so.conf.d/oracle-instantclient.conf <<'EOF'
/opt/oracle/instantclient_19_32
EOF
ldconfig
再次检查:
ldd /opt/oracle/instantclient_19_32/libclntsh.so | grep "not found"
无任何输出即表示 OCI 动态库依赖正常。
五、配置 dmdba 用户环境变量
编辑 /home/dmdba/.bash_profile:
cat >> /home/dmdba/.bash_profile <<'EOF'
# Oracle Instant Client 19.32
export ORACLE_HOME=/opt/oracle/instantclient_19_32
export TNS_ADMIN=/opt/oracle/instantclient_19_32/network/admin
export LD_LIBRARY_PATH=/opt/oracle/instantclient_19_32:/home/dmdba/dmdbms/bin:$LD_LIBRARY_PATH
export NLS_LANG=AMERICAN_AMERICA.AL32UTF8
EOF
重新登录 dmdba,或者手动加载:
su - dmdba
source /home/dmdba/.bash_profile
echo "ORACLE_HOME=$ORACLE_HOME"
echo "TNS_ADMIN=$TNS_ADMIN"
echo "LD_LIBRARY_PATH=$LD_LIBRARY_PATH"
echo "NLS_LANG=$NLS_LANG"
应能看到类似:
ORACLE_HOME=/opt/oracle/instantclient_19_32
TNS_ADMIN=/opt/oracle/instantclient_19_32/network/admin
LD_LIBRARY_PATH=/opt/oracle/instantclient_19_32:/home/dmdba/dmdbms/bin:...
NLS_LANG=AMERICAN_AMERICA.AL32UTF8
**注意:**如果原来的
.bash_profile已经存在LD_LIBRARY_PATH配置,不建议反复执行cat >>,否则可能造成环境变量重复累加。正式环境建议直接编辑文件,保证 OCI 路径配置一次即可。
六、配置 DM systemd 服务环境
仅配置 dmdba 的 .bash_profile 不能保证 systemd 启动的 dmserver 能继承这些变量。
因此建议为 DM 服务增加 systemd Drop-In 配置。
创建目录:
mkdir -p /etc/systemd/system/DmServiceDMSERVER.service.d
创建配置:
cat > /etc/systemd/system/DmServiceDMSERVER.service.d/oracle.conf <<'EOF'
[Service]
Environment="ORACLE_HOME=/opt/oracle/instantclient_19_32"
Environment="TNS_ADMIN=/opt/oracle/instantclient_19_32/network/admin"
Environment="LD_LIBRARY_PATH=/opt/oracle/instantclient_19_32:/home/dmdba/dmdbms/bin"
Environment="NLS_LANG=AMERICAN_AMERICA.AL32UTF8"
EOF
检查:
cat /etc/systemd/system/DmServiceDMSERVER.service.d/oracle.conf
七、重新加载并重启 DM 服务
执行:
systemctl daemon-reload systemctl restart DmServiceDMSERVER systemctl status DmServiceDMSERVER --no-pager
确认:
Active: active (running)
说明 DM 服务正常运行。
检查 Drop-In:
systemctl status DmServiceDMSERVER --no-pager
应该可以看到类似:
Drop-In: /etc/systemd/system/DmServiceDMSERVER.service.d └─oracle.conf
说明:
/usr/lib/systemd/system/DmServiceDMSERVER.service原始服务文件不需要修改。
/etc/systemd/system/DmServiceDMSERVER.service.d/oracle.conf属于 systemd Drop-In 配置,用于额外增加 OCI 环境变量,不会直接修改原始服务文件。
八、检查 dmserver 实际环境变量
使用:
pid=$(pgrep -o -x dmserver)
echo "=== DM进程 ==="
ps -fp "$pid"
echo "=== DM进程OCI环境 ==="
tr '\0' '\n' < /proc/$pid/environ | grep -E 'ORACLE_HOME|TNS_ADMIN|LD_LIBRARY_PATH|NLS_LANG'
正常应该能看到:
ORACLE_HOME=/opt/oracle/instantclient_19_32
TNS_ADMIN=/opt/oracle/instantclient_19_32/network/admin
LD_LIBRARY_PATH=/opt/oracle/instantclient_19_32:/home/dmdba/dmdbms/bin
NLS_LANG=AMERICAN_AMERICA.AL32UTF8
这一项非常重要。
因为它验证的是:
正在运行的 dmserver 进程,实际上是否拿到了 OCI 环境变量。
九、验证 Oracle OCI
1. 验证 OCI 动态库
使用 dmdba 用户执行:
su - dmdba -c 'LD_LIBRARY_PATH=/opt/oracle/instantclient_19_32:/home/dmdba/dmdbms/bin /usr/bin/ldd /opt/oracle/instantclient_19_32/libclntsh.so | grep "not found"'
无输出:正常。
2. 使用 genezi 验证 OCI
su - dmdba -c 'LD_LIBRARY_PATH=/opt/oracle/instantclient_19_32:/home/dmdba/dmdbms/bin /opt/oracle/instantclient_19_32/genezi -v'
正常可以看到:
Client Shared Library 64-bit - 19.32.0.0.0
同时应该能够看到:
Operating in Instant Client mode.
这说明 Oracle Instant Client 已经能够正常运行。
十、检查 DM8 → Oracle 网络连通性
在 DM8 服务器执行:
nc -zv 192.168.88.88 1521
正常:
Connected to 192.168.88.88:1521.
说明:
DM8服务器 │ │ TCP/1521 ▼ Oracle 19c
网络层已经打通。
十一、创建 DM8 → Oracle DBLINK
登录 DM8 数据库后创建 DBLINK。
示例:
CREATE OR REPLACE LINK DBLINK_DM_ORACLE
CONNECT 'ORACLE'
WITH <ORACLE_USER> IDENTIFIED BY "<ORACLE_PASSWORD>"
USING '(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS =
(PROTOCOL = TCP)
(HOST = 192.168.88.88)
(PORT = 1521)
)
)
(CONNECT_DATA =
(SERVICE_NAME = orclpdb1)
)
)';
⚠️ 用户名大小写注意
如果 Oracle 用户是通过普通 SQL 创建的:
CREATE USER lzb IDENTIFIED BY xxx;
Oracle 实际保存的是大写用户名:
LZB
在本次 DM8 DBLINK 场景中,使用:
WITH lzb IDENTIFIED BY ...
即可。
不要随意写成:
WITH "lzb" IDENTIFIED BY ...
双引号会改变标识符的大小写语义,可能导致 Oracle 用户认证失败。
十二、测试 DBLINK
首先测试 Oracle 数据库连接:
SELECT SYSDATE FROM DUAL@DBLINK_DM_ORACLE;
如果能够正常返回 Oracle 当前时间:
SYSDATE ------------------- 2026-xx-xx xx:xx:xx
说明:
DM8 ↓ DBLINK ↓ OCI ↓ Oracle Listener ↓ Oracle 19c
整个连接链路已经打通。
十三、Oracle 创建测试表
登录 Oracle 19c,并使用 DBLINK 对应的 Oracle 用户创建测试表:
CREATE TABLE dblink_test_table (
id NUMBER(10) PRIMARY KEY,
name VARCHAR2(50),
age NUMBER(3),
salary NUMBER(10,2)
);
插入测试数据:
INSERT INTO dblink_test_table (id, name, age, salary)
VALUES (1, '张三', 28, 15000.00);
INSERT INTO dblink_test_table (id, name, age, salary)
VALUES (2, '李四', 32, 20000.00);
INSERT INTO dblink_test_table (id, name, age, salary)
VALUES (3, '王五', 25, 12000.00);
COMMIT;
Oracle 本地检查:
SELECT * FROM dblink_test_table;
十四、DM8 通过 DBLINK 查询 Oracle 表
回到 DM8:
SELECT * FROM dblink_test_table@DBLINK_DM_ORACLE;
正常应该返回:
ID NAME AGE SALARY ---- ------ ----- -------- 1 张三 28 15000.00 2 李四 32 20000.00 3 王五 25 12000.00
至此,DM8 → Oracle 19c DBLINK 查询测试完成。




