外部链接对象( LINK )是 DM 中的一种特殊的数据库实体对象,它记录了远程数据库的连接和路径信息,用于建立与远程数据的联系。通过多台数据库主库间的相互通讯,用户可以透明地操作远程数据库的数据,使应用程序看起来只有一个大型数据库。用户远程数据库中的数据请求,都被自动转换为网络请求,并在相应结点上实现相应的操作。用户可以建立一个数据库链接,以说明一个对象在远程数据库中的访问路径。这个链接可以是公用的(数据库中所有用户使用),也可以是私有的(只能被某个用户使用)。
用户可以通过外部链接对远程数据库的表进行查询和增删改操作,以及本地调用远程的存储过程。
DM数据库的DBLINK按类型分类可分为普通 DBLINK 和公用 DBLINK 两类:
普通 DBLINK(默认):只有创建语句中标识的用户才可以访问远程数据库;
公用 DBLINK(public):本地数据的所有用户都可以访问远程数据库。
按照数据库间连接类型划分的话,有以下几种:
DPI、ODBC、GATEWAY、DAMENG或ORACLE,默认为DPI。
DPI 和 DAMENG 用于连接达梦数据库; ODBC 可以连接所有支持 ODBC 协议的数据库; ORACLE 用于连接 ORACLE 数据库; GATEWAY 可以使用达梦的 ODBC 驱动,需配置扩展选项 GWDSN ,指定远程 GATEWAY 的 DSN ,通过 GATEWAY 中转,连接到远程数据库。
软件 | 版本 |
---|---|
操作系统 | Redhat 7 及以上版本 |
DM 数据库 | DM 8.0 及以上版本 |
CPU 架构 | x86、ARM、龙芯、飞腾等国内外主流 CPU |
数据库类型 | 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 |
[dmdba@dms DMTEST]$ grep 'MAL_INI' dm.ini
MAL_INI = 1 #dmmal.ini
[dmdba@dms DMTEST]$
[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]$
DmServiceXXXX restart
[dmdba@slave ~]$ disql sysdba/Dameng123
SQL> CREATE TABLE "SYSDBA"."TEST" ( "C1" INT, "C2" VARCHAR(20));
CREATE PUBLIC LINK LINK01 CONNECT 'DAMENG' WITH SYSDBA IDENTIFIED BY Dameng123 USING '192.168.30.30/5283';
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;
select * from test@link01;
[dmdba@slave ~]$ disql sysdba/Dameng123
SQL> CREATE TABLE TEST ( "C1" INT, "C2" VARCHAR(20)) ;
操作已执行
已用时间: 46.219(毫秒). 执行号:1218.
SQL>
[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>
备端创建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>
[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]$
[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.
https://www.oracle.com/database/technologies/instant-client/linux-x86-64-downloads.html
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/
[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]$
SQL> CREATE LINK LINK_O CONNECT 'ORACLE' WITH wang IDENTIFIED BY wang USING '192.168.30.37/xubin';
操作已执行
已用时间: 16.653(毫秒). 执行号:1729.
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 类型列进行操作。
文章
阅读量
获赞