达梦7同构(DM-DM)DBLINK

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

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

语法格式
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=< 服务名>)))
::=

参数
1. OR REPLACE 使用OR REPLACE选项的好处是,如果系统中已经有同名的数据库链接名,服务器会自动用新的代码覆盖原来的代码。如果不使用OR REPLACE选项,当创建的新外部链接名称与系统中已有的外部链接名称同名时,服务器会报错。
2. PUBLIC 此链接对象是否能够被创建者之外的用户引用;
3. < 外部链接名> 数据库链接的名称;
4. < 连接库类型> 目前只支持DAMENG、ORACLE或ODBC,默认为DAMENG;
5. < 登录名> 登录用户名称;
6. < 登录口令> 登录用户口令;
7. 支持三种格式,分别对应目标节点在dmmal.ini中的配置项,具体如下:
l mal_inst_host/mal_inst_port
l mal_host/mal_port
l mal_inst_name
8. 可以使用配置的网络服务名tsn_name(网络服务名需要配置),或者连接描述符description(连接描述符是网络连接目标特殊格式的描述,它包括网络协议、主库IP地址、端口号和服务名),或者/< 服务名>;
9. DSN需要用户手动配置。

语句功能
创建一个外部链接。
使用说明
1.要创建到DM数据库的外部链接,必须首先配置dmmal.ini,才能使用LINK。DM的连接串有两种格式:
INSTANCE_NAME:直接使用远程库的实例名(该实例名必须配置到dmmal.ini中);
/< 端口号>:其中端口号为DM外部链接服务器的dmmal.ini配置中的MAL_PORT端口号。
dmmal.ini的详细配置可参考《DM7系统管理员手册》的2.1节,需要注意同时将dm.ini中的MAL_INI参数置为1以开启MAL系统。
2. 要创建到ORACLE的外部链接,可以使用配置的网络服务名;如果没有配置tsn_name,可以使用连接描述符或者/< 服务名>作为连接串。
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.

发表评论

电子邮件地址不会被公开。