一、外部链接对象是什么

外部链接对象(LINK)是 DM 中的一种特殊的数据库实体对象,它记录了远程数据库的连接和路径信息,用于建立与远程数据的联系。通过多台数据库主库间的相互通讯,用户可以透明地操作远程数据库的数据,使应用程序看起来只有一个大型数据库。用户远程数据库中的数据请求,都被自动转换为网络请求,并在相应结点上实现相应的操作。用户可以建立一个数据库链接,以说明一个对象在远程数据库中的访问路径。这个链接可以是公用的(数据库中所有用户使用),也可以是私有的(只能被某个用户使用)。

用户可以通过外部链接对远程数据库的表进行查询和增删改操作,以及本地调用远程的存储过程。

二、如何创建外部连接对象

语法如下:

CREATE [OR REPLACE] [PUBLIC] LINK <外部链接名> CONNECT ['<连接库类型>'] WITH < 登录名> IDENTIFIED BY <登录口令> USING '<外部连接串>';
<连接库类型> ::= DAMENG | ORACLE | ODBC
<外部链接串>::=< DAMENG 外部链接串>| < ORACLE 外部链接串> | <ODBC 外部链接串>
<DAMENG 外部链接串>::=[<连接类型>;]<服务器列表>
<连接类型>::= PRIMARY FIRST |
STANDBY FIRST |
PRIMARY ONLY |
STANDBY ONLY
<服务器列表>::=<服务器地址> |
<服务器地址>{,<服务器地址>}
<服务器地址>::=<实例 IP 地址>/<实例端口号> |
<MAL IP 地址>/<MAL 端口号> |
<实例名>
<ORACLE 外部链接串>::= <tsn_name> |<description>|<IP 地址>/<服务名>
<description>::=(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST=
<IP 地址>)(PORT=<端口号>)))(CONNECT_DATA=(SERVICE_NAME=<服务名>)))
<ODBC 外部链接串>::= <ODBC 数据源 DSN>

参数说明:

1. OR REPLACE 使用 OR REPLACE 选项的好处是,如果系统中已经有同名的数据库链接名,服务器会自动用新的代码覆盖原来的代码。如果不使用 OR REPLACE 选项,当创建的新外部链接名称与系统中已有的外部链接名称同名时,服务器会报错。
2. PUBLIC 此链接对象是否能够被创建者之外的用户引用;
3. <外部链接名> 数据库链接的名称;
4. <连接库类型> 目前只支持 DAMENG、ORACLE 或 ODBC,默认为 DAMENG;
5. <登录名> 登录用户名称;
6. <登录口令> 登录用户口令;
7. <连接类型> 当 DBLINK 连接到多机环境时,可以设定<连接类型>和指定多台<服务器地址>。<连接类型>用来指定 DBLINK 将采用何种优先级别连接到<服务器列表>中的机器,共四种连接类型:PRIMARY FIRST 为主机优先连接;STANDBY FIRST 为备机优先连接;PRIMARY ONLY 为只连主机;STANDBY ONLY 为只连备机。缺省为 PRIMARY FIRST。<连接类型>为可选项,一旦指定了<连接类型>,则必须指定<服务器地址>数大于等于 2;
8. <DAMENG 外部链接串>支持三种格式,分别对应目标节点在 dmmal.ini 中的配置项,具体如下:
     1)<实例 IP 地址>/<实例端口号> 对应 mal_inst_host/mal_inst_port
     2)<MAL IP 地址>/<MAL 端口号> 对应 mal_host/mal_port
     3)实例名 对应 mal_inst_name
9. <ORACLE外部链接串>可以使用配置的网络服务名tsn_name(网络服务名需要配置),或者连接描述符 description(连接描述符是网络连接目标特殊格式的描述,它包括网络协议、主库 IP 地址、端口号和服务名),或者<IP 地址>/<服务名>;
10. <ODBC 外部链接串>DSN 需要用户手动配置。

三、实操

3.1、DM7-DM7

1、打开配置文件dm.ini 开启MAL,打通两台主机之间的通信链路

MAL_INI = 1   #dmmal.ini

2、配置dmmal.ini 文件,设置MAL相关参数

[MAL_INST1]
MAL_INST_NAME = DMSERVER        #实例名和dm.ini中的INSTANCE_NAME保持一致
MAL_INST_HOST = 192.168.31.38   #对外开放的服务IP地址
MAL_INST_PORT = 5236            #对外开放的服务端口和dm.ini中的PORT_NUM保持一致
MAL_HOST = 192.168.31.38                #系统监听TCP连接IP地址
MAL_PORT = 15236                        #系统监听TCP连接端口

[MAL_INST2]
MAL_INST_NAME = DMSERVER2
MAL_INST_HOST = 192.168.31.40
MAL_INST_PORT = 5236
MAL_HOST = 192.168.31.40
MAL_PORT = 15236

 3、重启dmserver服务

dmdba@dmdsc01:~$ cd dmdbms/bin
dmdba@dmdsc01:~/dmdbms/bin$ ./DmServiceDMSERVER restart

 4、打开达梦数据库客户端或者disql工具登陆,创建外部链接

1. <远程实例IP地址 >/ < 远程实例端口号> mal_inst_host/mal_inst_port
create or replace  public link "link01" connect 'DAMENG' with "SYSDBA" identified by "SYSDBA" using '192.168.31.40/5236';

 2. <MAL IP 地址> / <MAL 端口号> mal_host/mal_port
create or replace  public link "link02" connect 'DAMENG' with "SYSDBA" identified by "SYSDBA" using '192.168.31.40/15236';

 3. <远程实例名> mal_inst_name
create or replace  public link "link03" connect 'DAMENG' with "SYSDBA" identified by "SYSDBA" using 'DMSERVER2';

5、测试

dmdba@dmdsc01:~/dmdbms/bin$ ./disql SYSDBA/SYSDBA
服务器[LOCALHOST:5236]:处于普通打开状态
 登录使用时间: 7.884(毫秒)
 disql V7.6.1.92-Build(2021.02.26-135621)ENT 
 SQL> SELECT * FROM v$version@"link01";行号     BANNER                                                        
 ---------- --------------------------------------------------------------
 1          DM Database Server x64 V7.6.1.92-Build(2021.02.26-135621)ENT  
 2          DB Version: 0x7000a已用时间: 19.350(毫秒). 执行号:50.
 SQL> SELECT * FROM v$version@"link02";         行号     BANNER                                                        
 ---------- --------------------------------------------------------------
 1          DM Database Server x64 V7.6.1.92-Build(2021.02.26-135621)ENT  
 2          DB Version: 0x7000a已用时间: 6.633(毫秒). 执行号:51.
 SQL> SELECT * FROM v$version@"link03";行号     BANNER                                                        
 ---------- --------------------------------------------------------------
 1          DM Database Server x64 V7.6.1.92-Build(2021.02.26-135621)ENT  
 2          DB Version: 0x7000a已用时间: 8.660(毫秒). 执行号:52.

3.2、dm7-dm8/dm8-dm7

配置方法和dm7-dm7的前提下,测试出现bug,获取对象失败或者查询一直卡住,无法获取结果

SQL> select * from v$version@test_link;
 select * from v$version@test_link;
 第1 行附近出现错误[-2251]:DBLINK远程服务器获取对象[V$VERSION]失败.

采取ODBC外部连接串,先安装ODBC,查看版本

[dmdba@dmdsc02 ~]$odbcinst -j
 unixODBC 2.3.1
 DRIVERS............: /etc/odbcinst.ini
 SYSTEM DATA SOURCES: /etc/odbc.ini
 FILE DATA SOURCES..: /etc/ODBCDataSources
 USER DATA SOURCES..: /home/dmdba/.odbc.ini
 SQLULEN Size.......: 8
 SQLLEN Size........: 8
 SQLSETPOSIROW Size.: 8

测试连接

[dmdba@dmdsc01 ~]$isql dm8
 open fail! path:./libcrypto.so
 +---------------------------------------+
 | Connected!                            |
 |                                       |
 | sql-statement                         |
 | help [tablename]                      |
 | quit                                  |
 |                                       |
 +---------------------------------------+

创建外部链接

create or replace  public link "link_odbc" connect 'ODBC' with "SYSDBA" identified by "dameng123" using 'dm8';

测试

dmdba@dmdsc01:~/dmdbms/bin$ ./disql SYSDBA/SYSDBA
服务器[LOCALHOST:5236]:处于普通打开状态
 登录使用时间: 7.884(毫秒)
 disql V7.6.1.92-Build(2021.02.26-135621)ENT 
 SQL> SELECT * FROM v$version@"link_odbc";行号     BANNER                                                        
 ---------- --------------------------------------------------------------
 1          DM Database Server 64 V8  
 2          DB Version: 0x7000c已用时间: 15.350(毫秒). 执行号:701.