外部链接对象(LINK)是DM中的一种特殊的数据库实体对象,它记录了远程数据库的连接和路径信息,用于建立与远程数据的联系。通过多台数据库主库间的相互通讯,用户可以透明地操作远程数据库的数据,使应用程序看起来只有一个大型数据库。用户远程数据库中的数据请求,都被自动转换为网络请求,并在相应结点上实现相应的操作。用户可以建立一个数据库链接,以说明一个对象在远程数据库中的访问路径。这个链接可以是公用的(数据库中所有用户使用),也可以是私有的(只能被某个用户使用)。
用户可以通过外部链接对远程数据库的表进行查询和增删改操作,以及本地调用远程的存储过程。
语法格式
CREATE [OR REPLACE] [PUBLIC] LINK < 外部链接名> CONNECT [‘< 连接库类型>‘] WITH < 登录名> IDENTIFIED BY < 登录口令> USING ‘< 连接串> ‘;
< 连接库类型> ::= DAMENG | ORACLE | ODBC
< 连接串> ::=< 外部链接串>
< 外部链接串>::=< DAMENG外部链接串>| < ORACLE外部链接串> |
< DAMENG外部链接串>::=< 实例IP地址>/< 实例端口号> |
< ORACLE外部链接串>::=
参数
1. OR REPLACE 使用OR REPLACE选项的好处是,如果系统中已经有同名的数据库链接名,服务器会自动用新的代码覆盖原来的代码。如果不使用OR REPLACE选项,当创建的新外部链接名称与系统中已有的外部链接名称同名时,服务器会报错。
2. PUBLIC 此链接对象是否能够被创建者之外的用户引用;
3. < 外部链接名> 数据库链接的名称;
4. < 连接库类型> 目前只支持DAMENG、ORACLE或ODBC,默认为DAMENG;
5. < 登录名> 登录用户名称;
6. < 登录口令> 登录用户口令;
7.
l mal_inst_host/mal_inst_port
l mal_host/mal_port
l mal_inst_name
8.
9.
语句功能
创建一个外部链接。
使用说明
1.要创建到DM数据库的外部链接,必须首先配置dmmal.ini,才能使用LINK。DM的连接串有两种格式:
INSTANCE_NAME:直接使用远程库的实例名(该实例名必须配置到dmmal.ini中);
dmmal.ini的详细配置可参考《DM7系统管理员手册》的2.1节,需要注意同时将dm.ini中的MAL_INI参数置为1以开启MAL系统。
2. 要创建到ORACLE的外部链接,可以使用配置的网络服务名
3.通过LINK对远程服务器所作的修改,由用户在本地服务器通过commit或rollback进行提交或回滚。
4.只支持普通用户,不支持SSL和Kerberos认证。
5.DM7不支持连接自身实例的LINK。
6.支持在CREATE SCHEMA中CREATE LINK,但是不支持CREATE PUBLIC LINK。
7.只有DBA和具有CREATE LINK权限的用户可以创建外部链接。
举例说明 例1 使用DM数据库,创建一个连接到IP地址为10.10.10.186,MAL_PORT端口号为5336的MAL站点的外部链接,登录到此站点使用的用户名为sysdba,密码为dameng123,实例名为:dmks。
先对远程DM数据库设置dmmai.in文件,并设置MAL_INI参数为1,然后重启dmks数据库
[dmdba@dmks dmks]$ vi dmmal.ini MAL_CHECK_INTERVAL = 5 MAL_CONN_FAIL_INTERVAL = 5 [MAL_dmks] MAL_INST_NAME = dmks MAL_HOST = 10.10.10.187 MAL_PORT = 5337 MAL_INST_PORT = 5236 MAL_INST_HOST = 10.10.10.187 [MAL_jydm] MAL_INST_NAME = jydm MAL_HOST = 10.10.10.180 MAL_PORT = 5336 MAL_INST_PORT = 5236 MAL_INST_HOST = 10.10.10.180 SQL> select sf_get_para_value(1,'MAL_INI'); LINEID SF_GET_PARA_VALUE(1,'MAL_INI') ---------- ------------------------------ 1 0 used time: 7.852(ms). Execute id is 1609. SQL> select * from v$dm_ini where para_name='MAL_INI'; LINEID PARA_NAME PARA_VALUE MIN_VALUE MAX_VALUE MPP_CHK SESS_VALUE FILE_VALUE DESCRIPTION PARA_TYPE ---------- --------- ---------- --------- --------- ------- ---------- ---------- ----------- --------- 1 MAL_INI 0 0 1 N 0 0 dmmal.ini IN FILE used time: 8.395(ms). Execute id is 1610. SQL> alter system set 'MAL_INI'=1 spfile; DMSQL executed successfully used time: 8.209(ms). Execute id is 1611. SQL> select sf_get_para_value(1,'MAL_INI'); LINEID SF_GET_PARA_VALUE(1,'MAL_INI') ---------- ------------------------------ 1 1 used time: 5.533(ms). Execute id is 1612. SQL> select * from v$dm_ini where para_name='MAL_INI'; LINEID PARA_NAME PARA_VALUE MIN_VALUE MAX_VALUE MPP_CHK SESS_VALUE FILE_VALUE DESCRIPTION PARA_TYPE ---------- --------- ---------- --------- --------- ------- ---------- ---------- ----------- --------- 1 MAL_INI 0 0 1 N 0 1 dmmal.ini IN FILE used time: 7.583(ms). Execute id is 1613. [root@dmks ~]# netstat -nltp Active Internet connections (only servers) Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name tcp 0 0 0.0.0.0:5901 0.0.0.0:* LISTEN 24268/Xvnc tcp 0 0 0.0.0.0:111 0.0.0.0:* LISTEN 1738/rpcbind tcp 0 0 0.0.0.0:39792 0.0.0.0:* LISTEN 1964/rpc.statd tcp 0 0 0.0.0.0:6001 0.0.0.0:* LISTEN 24268/Xvnc tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 2191/sshd tcp 0 0 127.0.0.1:631 0.0.0.0:* LISTEN 2027/cupsd tcp 0 0 127.0.0.1:25 0.0.0.0:* LISTEN 2290/master tcp 0 0 :::38955 :::* LISTEN 1964/rpc.statd tcp 0 0 :::111 :::* LISTEN 1738/rpcbind tcp 0 0 :::6001 :::* LISTEN 24268/Xvnc tcp 0 0 :::5236 :::* LISTEN 21657/dmserver tcp 0 0 :::22 :::* LISTEN 2191/sshd tcp 0 0 ::1:631 :::* LISTEN 2027/cupsd tcp 0 0 ::1:25 :::* LISTEN 2290/master [root@dmks ~]# service DmServicedmks restart Stopping DmServicedmks: [ OK ] Starting DmServicedmks: [ OK ] [root@dmks ~]# netstat -nltp Active Internet connections (only servers) Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name tcp 0 0 0.0.0.0:5901 0.0.0.0:* LISTEN 24268/Xvnc tcp 0 0 0.0.0.0:111 0.0.0.0:* LISTEN 1738/rpcbind tcp 0 0 0.0.0.0:39792 0.0.0.0:* LISTEN 1964/rpc.statd tcp 0 0 0.0.0.0:6001 0.0.0.0:* LISTEN 24268/Xvnc tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 2191/sshd tcp 0 0 127.0.0.1:631 0.0.0.0:* LISTEN 2027/cupsd tcp 0 0 127.0.0.1:25 0.0.0.0:* LISTEN 2290/master tcp 0 0 :::38955 :::* LISTEN 1964/rpc.statd tcp 0 0 :::111 :::* LISTEN 1738/rpcbind tcp 0 0 :::6001 :::* LISTEN 24268/Xvnc tcp 0 0 :::5236 :::* LISTEN 840/dmserver tcp 0 0 :::22 :::* LISTEN 2191/sshd tcp 0 0 ::1:631 :::* LISTEN 2027/cupsd tcp 0 0 :::5337 :::* LISTEN 840/dmserver tcp 0 0 ::1:25 :::* LISTEN 2290/master
从上面的输出可以看到端口5336实战启用了
SQL> select * from v$dm_ini where para_name='MAL_INI'; LINEID PARA_NAME PARA_VALUE MIN_VALUE MAX_VALUE MPP_CHK SESS_VALUE FILE_VALUE DESCRIPTION PARA_TYPE ---------- --------- ---------- --------- --------- ------- ---------- ---------- ----------- --------- 1 MAL_INI 1 0 1 N 1 1 dmmal.ini IN FILE used time: 12.648(ms). Execute id is 3. SQL> select sf_get_para_value(2,'MAL_INI'); LINEID SF_GET_PARA_VALUE(2,'MAL_INI') ---------- ------------------------------ 1 1 used time: 1.191(ms). Execute id is 4.
对本地DM数据库配置dmmal.ini,注意这里还要添加远程数据库的信息,否则在创建外部link时会提示实例不存在
[dmdba@shard1 jydm]$ cat dmmal.ini MAL_CHECK_INTERVAL = 5 MAL_CONN_FAIL_INTERVAL = 5 [MAL_dmks] MAL_INST_NAME = dmks MAL_HOST = 10.10.10.187 MAL_PORT = 5337 MAL_INST_PORT = 5236 MAL_INST_HOST = 10.10.10.187 [MAL_jydm] MAL_INST_NAME = jydm MAL_HOST = 10.10.10.180 MAL_PORT = 5336 MAL_INST_PORT = 5236 MAL_INST_HOST = 10.10.10.180 SQL> select * from v$dm_ini where para_name='MAL_INI'; LINEID PARA_NAME PARA_VALUE MIN_VALUE MAX_VALUE MPP_CHK SESS_VALUE FILE_VALUE DESCRIPTION PARA_TYPE ---------- --------- ---------- --------- --------- ------- ---------- ---------- ----------- --------- 1 MAL_INI 1 0 1 N 1 1 dmmal.ini IN FILE used time: 8.629(ms). Execute id is 6. SQL> select sf_get_para_value(2,'MAL_INI'); LINEID SF_GET_PARA_VALUE(2,'MAL_INI') ---------- ------------------------------ 1 1 used time: 1.302(ms). Execute id is 8. SQL>
重启本地数据库
[root@shard1 tmp]# systemctl start DmServicejydm.service SQL> create public link link1 connect 'dameng' with sysdba identified by "dameng123" using '10.10.10.180/5336'; executed successfully used time: 19.417(ms). Execute id is 9.
或者
SQL> create or replace public link link2 connect 'dameng' with sysdba identified by "dameng123" using 'jydm'; executed successfully used time: 35.346(ms). Execute id is 12.
在远程数据库中创建jy.t1表
SQL> insert into jy.t1 values(1,'JY'); affect rows 1 used time: 1.019(ms). Execute id is 2809. SQL> commit; executed successfully used time: 13.274(ms). Execute id is 2810.
在本地数据库中通过外部link来查询远程数据库的sysdba.t1表
SQL> select * from jy.t1@link1; LINEID C1 C2 ---------- ----------- -- 1 1 JY used time: 5.955(ms). Execute id is 134. SQL> select * from jy.t1@link2; LINEID C1 C2 ---------- ----------- -- 1 1 JY used time: 2.538(ms). Execute id is 135.
在本地数据库中通过外部link向远程数据库的jy.t1表插入数据
SQL> insert into jy.t1@link1 values(2,'HY'); affect rows 1 used time: 2.611(ms). Execute id is 136. SQL> commit; executed successfully used time: 13.105(ms). Execute id is 137.
在远程数据库中使用sysdba来查询t1表的记录来验证记录是否被插入
SQL> select * from jy.t1; LINEID C1 C2 ---------- ----------- -- 1 1 JY 2 2 HY used time: 0.906(ms). Execute id is 2819.