暂无图片
暂无图片
1
暂无图片
暂无图片
暂无图片

DM8 通过 Oracle OCI 创建 Oracle 19c DBLINK

胖头鱼 23小时前
8

本文适用于 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 官方下载地址:

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 查询测试完成。


「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论