一、 DBLINK介绍
1. 概念介绍
外部链接对象( LINK )是 DM 中的一种特殊的数据库实体对象,它记录了远程数据库的连接和路径信息,用于建立与远程数据的联系。通过多台数据库主库间的相互通讯,用户可以透明地操作远程数据库的数据,使应用程序看起来只有一个大型数据库。用户远程数据库中的数据请求,都被自动转换为网络请求,并在相应结点上实现相应的操作。用户可以建立一个数据库链接,以说明一个对象在远程数据库中的访问路径。这个链接可以是公用的(数据库中所有用户使用),也可以是私有的(只能被某个用户使用)。
用户可以通过外部链接对远程数据库的表进行查询和增删改操作,以及本地调用远程的存储过程。
2. 访问类型
DM数据库的DBLINK按类型分类可分为普通 DBLINK 和公用 DBLINK 两类:
普通 DBLINK(默认):只有创建语句中标识的用户才可以访问远程数据库;
公用 DBLINK(public):本地数据的所有用户都可以访问远程数据库。
3. 连接类型
按照数据库间连接类型划分的话,有以下几种:
DPI、ODBC、GATEWAY、DAMENG或ORACLE,默认为DPI。
DPI 和 DAMENG 用于连接达梦数据库; ODBC 可以连接所有支持 ODBC 协议的数据库; ORACLE 用于连接 ORACLE 数据库; GATEWAY 可以使用达梦的 ODBC 驱动,需配置扩展选项 GWDSN ,指定远程 GATEWAY 的 DSN ,通过 GATEWAY 中转,连接到远程数据库。
4.DMDBLINK支持软硬件版本信息
| 软件 | 版本 |
|---|---|
| 操作系统 | Redhat 7 及以上版本 |
| DM 数据库 | DM 8.0 及以上版本 |
| CPU 架构 | x86、ARM、龙芯、飞腾等国内外主流 CPU |
5.当前部署环境介绍
| 数据库类型 | IP | 数据库端口 | MAL端口 | 目标端DBLINK名称 |
|---|---|---|---|---|
| DM8 | 192.168.30.28 | 5236 | 5283 | N/A |
| DM8 | 192.168.30.30 | 5236 | 5283 | LINK01/LINK_DPI |
| Oracle 19C | 192.168.30.37 | 1521 | N/A | LINK_O |
二、 DBLINK配置DM-DM
1. DAMENG(MAL)方式
1.1 源备端配置MAL
1.1.1 修改dm.ini
[dmdba@dms DMTEST]$ grep 'MAL_INI' dm.ini MAL_INI = 1 #dmmal.ini [dmdba@dms DMTEST]$复制
1.1.2 准备dmmal.ini
[dmdba@dms DMTEST]$ cat dmmal.ini [DBSERVER] mal_inst_name = DBSERVER mal_host = 192.168.30.28 mal_port = 5283 [DMS] mal_inst_name = DMS mal_host = 192.168.30.30 mal_port = 5283 [dmdba@dms DMTEST]$复制
1.1.3 重启源备端数据库
DmServiceXXXX restart
1.2 源端创建测试表
[dmdba@slave ~]$ disql sysdba/Dameng123 SQL> CREATE TABLE "SYSDBA"."TEST" ( "C1" INT, "C2" VARCHAR(20));复制
1.3 备端建立DBLINK用于数据处理
CREATE PUBLIC LINK LINK01 CONNECT 'DAMENG' WITH SYSDBA IDENTIFIED BY Dameng123 USING '192.168.30.30/5283';复制
1.4 数据操作
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;复制
1.5 查看数据
select * from test@link01;复制
1.6 详细操作结果如下
1.6.1 源端创建表
[dmdba@slave ~]$ disql sysdba/Dameng123 SQL> CREATE TABLE TEST ( "C1" INT, "C2" VARCHAR(20)) ; 操作已执行 已用时间: 46.219(毫秒). 执行号:1218. SQL>复制
1.6.2 目标端创建DBLINK并操作数据
[dmdba@dms DMTEST]$ disql sysdba/Dameng123 服务器[LOCALHOST:5236]:处于普通打开状态 登录使用时间 : 20.901(ms) disql V8 SQL> CREATE PUBLIC LINK LINK01 CONNECT 'DAMENG' WITH SYSDBA IDENTIFIED BY Dameng123 USING '192.168.30.30/5283'; 操作已执行 已用时间: 35.511(毫秒). 执行号:1702. SQL> SQL> INSERT INTO TEST@LINK01 VALUES(1,'A'); 影响行数 1 已用时间: 8.804(毫秒). 执行号:1703. SQL> INSERT INTO TEST@LINK01 VALUES(2,'B'); 影响行数 1 已用时间: 2.921(毫秒). 执行号:1704. SQL> UPDATE TEST@LINK01 SET C2='C' WHERE C1=1; 影响行数 2 已用时间: 2.636(毫秒). 执行号:1705. SQL> DELETE FROM TEST@LINK01 WHERE C1=2; 影响行数 1 已用时间: 8.984(毫秒). 执行号:1706. SQL> COMMIT; 操作已执行 已用时间: 4.481(毫秒). 执行号:1707. SQL> select * from test@link01; 行号 C1 C2 ---------- ----------- -- 1 1 C 已用时间: 19.723(毫秒). 执行号:1708. SQL>复制
2. DPI 方式:
备端创建DBLINK并操作数据
SQL> CREATE or replace PUBLIC LINK LINK_DPI CONNECT 'DPI' WITH SYSDBA IDENTIFIED BY Dameng123 USING '192.168.30.30:5236'; 操作已执行 已用时间: 16.456(毫秒). 执行号:1715. SQL> INSERT INTO TEST@LINK_DPI VALUES(1,'C'); 影响行数 1 已用时间: 7.302(毫秒). 执行号:1716. SQL> select * from test@LINK_DPI; 行号 C1 C2 ---------- ----------- -- 1 1 C 2 1 C 已用时间: 44.833(毫秒). 执行号:1717. SQL>复制
三、 DMLINK配置DM-Oracle19C
1. 准备工作
1.1 Oracle端
1.1.1 准备监听
[oracle@localhost admin]$ cd /u01/app/oracle/product/19.3/dbhome_1/network/admin [oracle@localhost admin]$ cat listener.ora SID_LIST_LISTENER = (SID_LIST = (SID_DESC = (SID_NAME = xubin) (ORACLE_HOME = /u01/app/oracle/product/19.3/dbhome_1) (PROGRAM = extproc) ) (SID_DESC = (SID_NAME = xubin) (ORACLE_HOME = /u01/app/oracle/product/19.3/dbhome_1) ) ) LISTENER = (DESCRIPTION_LIST = (DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.30.37)(PORT = 1521)) ) )复制
[oracle@localhost admin]$ cat tnsnames.ora ORACLR_CONNECTION_DATA = (DESCRIPTION = (ADDRESS_LIST = (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1521)) ) (CONNECT_DATA = (SID = xubin) (PRESENTATION = RO) ) ) xubin = (DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.30.37)(PORT = 1521)) (CONNECT_DATA = (SERVER = DEDICATED) (SERVICE_NAME = xubin) ) ) [oracle@localhost admin]$复制
1.1.2 创建表
[oracle@localhost ~]$ sqlplus / as sysdba SQL*Plus: Release 19.0.0.0.0 - Production on Tue Jul 15 14:07:57 2025 Version 19.3.0.0.0 Copyright (c) 1982, 2019, Oracle. All rights reserved. Connected to: Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production Version 19.3.0.0.0 SQL> create user wang identified by wang ; User created. SQL> grant dba to wang ; Grant succeeded. SQL> grant create session to wang ; Grant succeeded. SQL> connect wang/wang Connected. SQL> create table t1(id int,name varchar(20)); Table created. SQL> commit ; Commit complete.复制
2. DM端操作
2.1 准备环境
2.1.1 下载Oracle client:
https://www.oracle.com/database/technologies/instant-client/linux-x86-64-downloads.html
2.1.2 解压并准备环境
(1) 解压并拷贝环境
unzip instantclient-basic-linux.x64-19.27.0.0.0dbru.zip mv instantclient_19_27 oracle_instance_client cp oracle_instance_client/lib* dmdbms/bin/复制
(2) 查看库文件
[dmdba@dms oracle_instance]$ ls libcl* libclntshcore.so.19.1 libclntsh.so.10.1 libclntsh.so.12.1 libclntsh.so.19.1 libclntsh.so libclntsh.so.11.1 libclntsh.so.18.1 [dmdba@dms oracle_instance]$ ls libnnz* libnnz19.so [dmdba@dms oracle_instance]$ [dmdba@dms oracle_instance]$ ldd libnnz19.so linux-vdso.so.1 => (0x00007fff1e16b000) libclntshcore.so.19.1 => /dmdba/dmdbms/bin/libclntshcore.so.19.1 (0x00007fc73a8c1000) libc.so.6 => /lib64/libc.so.6 (0x00007fc73a4e4000) libdl.so.2 => /lib64/libdl.so.2 (0x00007fc73a2e0000) libm.so.6 => /lib64/libm.so.6 (0x00007fc739fde000) libpthread.so.0 => /lib64/libpthread.so.0 (0x00007fc739dc1000) libnsl.so.1 => /lib64/libnsl.so.1 (0x00007fc739ba7000) librt.so.1 => /lib64/librt.so.1 (0x00007fc73999f000) libaio.so.1 => /lib64/libaio.so.1 (0x00007fc73979c000) libresolv.so.2 => /lib64/libresolv.so.2 (0x00007fc739582000) /lib64/ld-linux-x86-64.so.2 (0x00005557aa3f7000) [dmdba@dms oracle_instance]$ ldd libclntshcore.so.19.1 linux-vdso.so.1 => (0x00007ffd2cbf7000) libdl.so.2 => /lib64/libdl.so.2 (0x00007f5b1b3ae000) libm.so.6 => /lib64/libm.so.6 (0x00007f5b1b0ab000) libpthread.so.0 => /lib64/libpthread.so.0 (0x00007f5b1ae8f000) libnsl.so.1 => /lib64/libnsl.so.1 (0x00007f5b1ac75000) librt.so.1 => /lib64/librt.so.1 (0x00007f5b1aa6c000) libaio.so.1 => /lib64/libaio.so.1 (0x00007f5b1a86a000) libresolv.so.2 => /lib64/libresolv.so.2 (0x00007f5b1a650000) libc.so.6 => /lib64/libc.so.6 (0x00007f5b1a281000) /lib64/ld-linux-x86-64.so.2 (0x0000558e3814d000) [dmdba@dms oracle_instance]$ ldd libclntsh.so.11.1 linux-vdso.so.1 => (0x00007fff2e6dc000) libnnz19.so => /dmdba/dmdbms/bin/libnnz19.so (0x00007fd365a30000) libdl.so.2 => /lib64/libdl.so.2 (0x00007fd36581d000) libm.so.6 => /lib64/libm.so.6 (0x00007fd36551b000) libpthread.so.0 => /lib64/libpthread.so.0 (0x00007fd3652ff000) libnsl.so.1 => /lib64/libnsl.so.1 (0x00007fd3650e4000) librt.so.1 => /lib64/librt.so.1 (0x00007fd364edc000) libaio.so.1 => /lib64/libaio.so.1 (0x00007fd364cda000) libresolv.so.2 => /lib64/libresolv.so.2 (0x00007fd364abf000) libc.so.6 => /lib64/libc.so.6 (0x00007fd3646f1000) /lib64/ld-linux-x86-64.so.2 (0x000055fc9017b000) libclntshcore.so.19.1 => /dmdba/dmdbms/bin/libclntshcore.so.19.1 (0x00007fd36414c000) [dmdba@dms oracle_instance]$复制
2.2 创建DBLINK
SQL> CREATE LINK LINK_O CONNECT 'ORACLE' WITH wang IDENTIFIED BY wang USING '192.168.30.37/xubin'; 操作已执行 已用时间: 16.653(毫秒). 执行号:1729.复制
2.3 操作数据
SQL> select * from t1@LINK_O ; 未选定行 已用时间: 324.879(毫秒). 执行号:1730. SQL> insert into t1@link_o values(1,'a'); 影响行数 1 已用时间: 450.714(毫秒). 执行号:1731. SQL> commit ; 操作已执行 已用时间: 1.659(毫秒). 执行号:1732. SQL> select * from t1@LINK_O ; 行号 ID NAME ---------- -- ---- 1 1 a 已用时间: 47.881(毫秒). 执行号:1733. SQL>复制
注意事项:
1、数据库连接目前只支持 DM、Oracle 或 ODBC。
2、DM-DM 的同构数据库链接不支持 MPP 环境,DM 与异构数据库的数据库链接支持 MPP 环境。
3、增删改不支持 INTO 语句。
4、不支持使用游标进行增删改操作。
5、不支持操作远程表的复合类型列。
6、DBLINK 理论上不支持 LOB 类型列的操作,但支持简单的增删改语句中使用常量来对 LOB 类型列进行操作。




