本次实验的目标是在 DM8 数据库中创建 DBLINK,通过 Oracle OCI客户端动态库连接 Oracle 数据库,使 DM8 可以直接查询 Oracle 远程表。Oracle OCI 负责建立 Oracle 连接、完成用户认证、发送 SQL 和接收结果;DM8 的 DBLINK 则负责把远程 Oracle 对象封装成可在当前数据库中访问的远程对象通道。
达梦技术社区文章说明,DM 访问 Oracle 的 DBLINK 可以通过 OCI 或 ODBC 两种方式实现,本次学习 OCI 方案。
安装 Oracle Instant Client 前,先确认操作系统架构、glibc 版本以及 libaio 依赖是否满足。高版本 Oracle Instant Client 对 glibc 有最低版本要求。
rpm -qi glibc
ldd --version
本机为 Kylin V10 x86_64,glibc 版本为 2.28
rpm -qa | grep libaio
说明:如果 libaio 未安装,应先通过系统软件源安装。OCI 动态库依赖缺失时,DBLINK 可能创建成功,但真正查询时才报加载库失败。
mkdir -p /opt/oracle
unzip instantclient-basic-linux-21.20.0.0.0dbru.zip -d /opt/oracle/
cd /opt/oracle/instantclient_21_20
pwd
ls -l
从目录可以看到 libclntsh.so.21.1、libclntshcore.so.21.1、libocci.so.21.1、libnnz21.so 等文件,同时包含指向 21.1 实际库文件的多个兼容软链接。
DM 服务进程要能够找到 libclntsh.so 及其依赖。常见做法有两层:一是把 Instant Client 目录注册到系统动态链接器,二是给 dmdba/DM 服务配置 LD_LIBRARY_PATH。
echo /opt/oracle/instantclient_21_20 > /etc/ld.so.conf.d/oracle-instantclient.conf
cat /etc/ld.so.conf.d/oracle-instantclient.conf
ldconfig
问题记录:截图中 /etc/ld.so.conf.d/oracle-instantclient.conf 的内容为 /opt/oracle/instantclient_19_13,而实际解压目录是 /opt/oracle/instantclient_21_20。这个路径不一致本身就是一个需要优先排除的配置问题。实际操作应保证 ld.so.conf.d 和真实 Instant Client 目录完全一致,然后重新执行 ldconfig。这个问题也导致了后续操作出现问题,dm端无法链接到oracle指定表中
su - dmdba
vi ~/.bash_profile
export LD_LIBRARY_PATH=/data/dmdbms/bin:/opt/oracle/instantclient_21_20
source ~/.bash_profile
env | grep LD_LIBRARY_PATH
为了验证 DBLINK 是否能够真正跨库读取中文、数字等数据,在 Oracle 侧创建 SCOTT 用户和 T1 测试表。
CREATE USER SCOTT IDENTIFIED BY oracle;
GRANT DBA TO SCOTT;
CONN SCOTT/oracle
CREATE TABLE SCOTT.T1
(
NAME VARCHAR2(20),
AGE INTEGER,
SEX VARCHAR2(3),
GRADE INTEGER
);
INSERT INTO SCOTT.T1 VALUES('丽丽',18,'女',1000);
COMMIT;
完成 OCI 环境准备并重启 DM 服务后,可以在 DM8 中创建 Oracle 类型的 DBLINK。
CREATE OR REPLACE LINK PDBLINK
CONNECT 'ORACLE'
WITH "SCOTT" IDENTIFIED BY "oracle"
USING '<Oracle服务器IP>:1521/<服务名>';
查看已创建的链接:
SELECT * FROM DBA_DB_LINKS;
通过 DBLINK 查询远端 Oracle 表:
SELECT * FROM T1@PDBLINK;
SELECT * FROM V$VERSION@PDBLINK;
删除链接:
DROP LINK PDBLINK;
ALTER SYSTEM SET 'ELOG_REPORT_LINK_SQL' = 1;
本次实验最主要的问题是 OCI 动态库加载。初次使用 Instant Client 21.20 时,虽然客户端目录、LD_LIBRARY_PATH 等已经配置,但 DM 通过 DBLINK 调用 OCI 时仍出现动态库加载问题。这次现象为21.20 在当前 DM8 + Kylin + Oracle 11g 环境不兼容
echo $LD_LIBRARY_PATH
env | grep LD_LIBRARY_PATH
本次截图中 dmdba 环境已经包含 /opt/oracle/instantclient_21_20,因此交互式用户环境这一层基本正常。
cd /opt/oracle/instantclient_21_20
ls -l
ls -l libclntsh.so
重点确认 libclntsh.so 存在,并且软链接最终指向真实的 libclntsh.so.21.1。
ldd libclntsh.so
正常情况下,应能看到 libnnz、libaio、libm、libpthread 等依赖的解析路径;如果出现 not found,需要先补依赖或修正动态库路径。
# 查找 DM 服务进程
ps -ef | grep DmServiceDMSERVER
# 假设 dmserver PID 为 1234
cat /proc/1234/environ | tr '\0' '\n' | grep LD_LIBRARY
# 查看 systemd 服务定义
systemctl cat DmServiceDMSERVER
systemctl status DmServiceDMSERVER
执行 source ~/.bash_profile 只改变当前终端环境,systemd 启动的 dmserver 并不一定读取 dmdba 的 .bash_profile。
如果 dmserver 进程中没有 OCI 路径,可在服务文件的 [Service] 中加入:
Environment="LD_LIBRARY_PATH=/data/dmdbms/bin:/opt/oracle/instantclient_11_2"
然后以 root 执行:
systemctl daemon-reload
systemctl restart DmServiceDMSERVER
本次实验的核心是理解 DBLINK 对 Oracle OCI 动态库的依赖。DM8 通过 OCI 访问 Oracle 时,数据库服务进程必须能够定位 libclntsh.so,并且该动态库的所有依赖也必须能够被系统解析。
实际排错时应按“系统运行库 → Instant Client 文件 → 系统动态库路径 → dmdba 环境 → dmserver 进程环境 → OCI 版本 → DBLINK SQL”的顺序逐层检查。本次遇到的 21.20 客户端问题说明,动态库版本和运行环境也是 DBLINK 成功与否的重要因素;换用与 Oracle 11g 更接近的 11.2.0.4 客户端后,再结合正确的软链接和服务环境变量进行验证,排查思路会更加清晰。
文章
阅读量
获赞
