达梦数据库的外部链接是一种数据库的实体对象,记录了远程数据库的连接信息,用于建立与远程数据的联系。用户可以通过数据库的外部链接对象透明地操作远程数据库的数据,对远程数据库的表进行查询和增删改操作,也可以调用远程的存储过程。数据库的外部链接对象可以是公用的(数据库中所有用户使用),也可以是私有的(特定用户使用)。
CREATE [OR REPLACE] [PUBLIC] LINK < 外部链接名> CONNECT ['< 连接库类型>'] WITH < 登录名> IDENTIFIED BY < 登录口令> USING '< 连接串> ';
< 连接库类型> ::= DAMENG | ORACLE | ODBC
< 连接串> ::=< 外部链接串>
< 外部链接串>::=< DAMENG外部链接串>| < ORACLE外部链接串> |
< DAMENG外部链接串>::=< 实例IP地址>/< 实例端口号> |
/ |
< ORACLE外部链接串>::= ||/< 服务名>
::=(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST=)(PORT=< 端口号>)))(CONNECT_DATA=(SERVICE_NAME=< 服务名>)))
::=
参数
OR REPLACE 使用OR REPLACE选项的好处是,如果系统中已经有同名的数据库链接名,服务器会自动用新的代码覆盖原来的代码。如果不使用OR REPLACE选项,当创建的新外部链接名称与系统中已有的外部链接名称同名时,服务器会报错。
PUBLIC 此链接对象是否能够被创建者之外的用户引用;
< 外部链接名> 数据库链接的名称;
< 连接库类型> 目前只支持DAMENG、ORACLE或ODBC,默认为DAMENG;
< 登录名> 登录用户名称;
< 登录口令> 登录用户口令;
支持三种格式,分别对应目标节点在dmmal.ini中的配置项,具体如下:
l mal_inst_host/mal_inst_port
l mal_host/mal_port
l mal_inst_name
可以使用配置的网络服务名tsn_name(网络服务名需要配置),或者连接描述符description(连接描述符是网络连接目标特殊格式的描述,它包括网络协议、主库IP地址、端口号和服务名),或者/< 服务名>;
DSN需要用户手动配置。
1、两台数据库机器A 、B,均安装了达梦数据库。
2、两台数据库机器A 、B,均关闭了防火墙和selinux。
3、两台数据库机器A 、B的实例名不能一致,两个数据库的字符集必须一致。
在两台机器的数据库实例下面创建dmmal.ini 文件,文件内容如下:
[dmlink1] #自定义
mal_inst_name = DBSERVER #A主机的实例名,和dm.ini中的INSTANCE_NAME保持一致
mal_inst_host = 192.168.23.88 #A主机的ip地址
mal_inst_port = 5236 #A主机的实例端口,和dm.ini中的PORT_NUM保持一致
mal_host = 192.168.23.88 #A主机的ip地址
mal_port = 61142 #系统监听TCP连接端口(自定义)
[dmlink2] #自定义
mal_inst_name = DBSERVER1 #B主机的实例名,和dm.ini中的INSTANCE_NAME保持一致
mal_inst_host = 192.168.23.99 #B主机的ip地址
mal_inst_port = 5236 #B主机的实例端口,和dm.ini中的PORT_NUM保持一致
mal_host = 192.168.23.99 #B主机的ip地址
mal_port = 61142 #系统监听TCP连接端口(自定义)
注意:两台机器的dmmal.ini必须一致,A和B的实例名不能一样
修改两台数据库实例的dm.ini的参数,MAL_INI参数改为1
两台机器均需重启
cd /home/dmdba/dmdbms/bin
./DmServiceDMSERVER restart
在主机A中创建表后,使用主机B来连接进行操作:
主机A:create table test_link(id int,name text);
建立外部连接语法如下:
create public link 外部连接名 connect with A主机登录用户 identified by A主机登录用户密码 using 'A主机ip/a主机系统监听TCP连接端口';
主机B创建dblink:
create public link dmlink1 connect with "SYSDBA" identified by "SYSDBA" using '192.168.23.88/61142';
主机B:insert into test_link@dmlink1 values(1,'a');
insert into test_link@dmlink1 values(2,'b');
commit;
主机A:select * from test_link;