dblink(Database Link)数据库连接,可以理解为是一个提供本地数据库远程访问另一个数据库中的表的通道,本地数据库创建了dblink后,就可以通过dblink管理远程数据库中的表,进行增删改查操作。
(1) 达梦本地端安装oracle客户端(必须):
将intantclient的三个压缩包basic、sdk、sqlplus解压:解压后将linstantclient包里的所有lib拷贝到$DM_HOME/bin目录下(主要是libclntsh.so.11.1和libnnz11.so这两个动态库,可以ldd查看一下这两个动态库的依赖包有哪些,为了方便起见,建议将instantclient包里的全部lib库cp到达梦bin目录下,顺便将libclntsh.so.11.1建立软连接名为libclntsh.so):
[root@qiqi223 ~]# mkdir -p /opt/dblink/instantclient
[root@qiqi223 opt]# unzip instantclient-basic-linux.x64-11.2.0.4.0 && unzip instantclient-sdk-linux.x64-11.2.0.4.0 && unzip instantclient-sqlplus-linux.x64-11.2.0.4.0
[root@qiqi223 instantclient]# cp lib* /opt/dmdbms/bin
[root@qiqi223 bin]# ln -s libclintsh.so.11.1 libclintsh.so
(2) 远程Oracle端静态注册监听:
进入到$ORACLE_HOME/network/admin目录下,添加或修改listener.ora监听文件内容(如果原本在创建Oracle数据库时已经注册,则不需要改动):
SID_LIST_LISTENER =
(SID_LIST =
(SID_DESC=
(GLOBAL_DBNAME=orcl11g)
(ORACLE_HOME=/u02/app/oracle11g)
(SID_NAME=orcl11g)
)
)
(3)达梦本地端配置服务名:
将远程Oracle端的$ORACLE_HOME/network/admin/tnsnames.ora文件scp到达梦主机上(单独存放到一个目录下/opt/dblink/network/admin),并修改成以下内容:
orcl11g =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.222.223)(PORT = 1521))
(CONNECT_DATA =
(SERVICE_NAME = orcl11g)
(SID = orcl11g)
)
)
(4)达梦本地端修改环境变量:
dmdba用户环境变量添加一下内容:
[dmdba@qiqi221 ~]$ vim .bash_profile
添加以下内容:
export ORACLE_HOME=/u02/app/oracle11g ## 远程Oracle端的$ORACLE_HOME;
export ORACLE_SID=orcl11g ## 远程Oracle端的SID;
export TNS_ADMIN=/opt/dblink/network/admin ## 服务名文件所在目录;
export NLS_LANG=AMERICAN_AMERICA.ZHS32GB18030 ## 远程Oracle端的字符集;
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$ORACLE_HOME:/opt/dmhs/bin
export PATH=$PATH:$ORACLE_HOME:$DM_HOME/bin
export LANG=zh_CN.UTF8
unset USERNAME
[dmdba@qiqi221 ~]$ source .bash_profile
(5)重启达梦数据库和测试使用Oracle客户端:
[dmdba@qiqi221 bin]$ ./DmServiceSVR restart
重启达梦数据库目的是为了让达梦数据库能加载到dblink访问Oracle数据库所需要的动态库,否则在查询dblink时,会出现[-2245]:DBLINK加载库文件失败的报错。重启后,可以使用sqlplus命令测试远程连接Oracle数据库,看看是否能成功连接:
[dmdba@qiqi221 ~]$ sqlplus SCOTT/SCOTT123@orcl11g
(6)达梦本地创建dblink:(三种方法)
(私有dblink:只有创建语句中标识的用户才可以访问远程数据库;公有dblink:本地数据的所有用户都可以访问远程数据库)
方式一:IP/服务名方式连接
-- 创建私有dblink;
CREATE LINK "DMTEST"."SCOTTLINK" CONNECT 'ORACLE' WITH "SCOTT" IDENTIFIED BY "SCOTT123" USING '192.168.222.223/orcl11g';
-- 创建公有dblink;
CREATE PUBLIC LINK "SCOTTLINK" CONNECT 'ORACLE' WITH "SCOTT" IDENTIFIED BY "SCOTT123" USING '192.168.222.223/orcl11g';
方式二:网络服务名方式连接(推荐)
-- 创建私有dblink;
CREATE LINK "DMTEST"."SCOTTLINK" CONNECT 'ORACLE' WITH "SCOTT" IDENTIFIED BY "SCOTT123" USING 'orcl11g';
-- 创建公有dblink;
CREATE PUBLIC LINK "SCOTTLINK" CONNECT 'ORACLE' WITH "SCOTT" IDENTIFIED BY "SCOTT123" USING 'orcl11g';
方式三:连接描述符连接
-- 创建私有dblink;
CREATE LINK "DMTEST"."SCOTTLINK" CONNECT 'ORACLE' WITH "SCOTT" IDENTIFIED BY "SCOTT123" USING
'(DESCRIPTION =
(ADDRESS_LIST = (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.222.223)(PORT = 1521)))
(CONNECT_DATA = (SERVICE_NAME = orcl11g))
)';
-- 创建公有dblink;
CREATE PUBLIC LINK "SCOTTLINK" CONNECT 'ORACLE' WITH "SCOTT" IDENTIFIED BY "SCOTT123" USING
'(DESCRIPTION =
(ADDRESS_LIST = (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.222.223)(PORT = 1521)))
(CONNECT_DATA = (SERVICE_NAME = orcl11g))
)';
通过连接描述符连接的方式的优点是可以不用配置网络服务名文件tnsnames.ora,这种方式相当于把tnsnames.ora文件内容放到创建dblink语句上,其本质与上述两种方式无异,适用于需要创建dblink数量少的情形。
(注意:Oracle客户端一定要安装上,如果删除掉Oracle客户端,虽然对dblink的使用不影响,但如果重启达梦数据库后,dblink会出现报Can’t match object[USER_OBJECTS] in dblink remote server错误)
达梦搭建同构dblink是通过达梦MAL系统进行数据传输,达梦通过mal系统实现redo日志传输,以及其他实例间的消息通讯。开启MAL功能后,本地达梦数据库创建dblink即可实现访问;相对而言达梦之间的dblink搭建较为简单。
搭建步骤
(1)两台达梦主机修改dm.ini配置文件参数MAL_INI值为1:
[dmdba@qiqi221 ~]$ vim /opt/dm8/data/DAMENG/dm.ini
将MAL_INI参数设置为1;
MAL_INI = 1
(2)两台达梦主机配置dmmal.ini文件内容:
[MAL_INST1]
MAL_INST_NAME =SVR # 本地端实例名;
MAL_HOST = 10.0.0.221 # 内网IP;
MAL_PORT = 5536 # MAL系统端口号;
MAL_INST_HOST = 192.168.222.221 # 外网IP(数据库实例IP);
MAL_INST_PORT = 5236 # 数据库端口号;
[MAL_INST2]
MAL_INST_NAME = SR # 远程端实例名;
MAL_HOST = 10.0.0.222 # 内网IP;
MAL_PORT = 5537 # MAL系统端口号;
MAL_INST_HOST = 192.168.222.222 # 外网IP(数据库实例IP);
MAL_INST_PORT = 5236 # 数据库端口号;
注意:两台达梦主机的dmmal.ini文件内容要一致;dmmal.ini配置项中的MAL_INST_NAM是实例名,两边的实例名不能相同;为得到dblink的使用效果,在测试环境下,选择关闭防火墙和SELINUX,设置为开启不自启;
(3)达梦两边主机重启数据库服务:
# 本地端重启服务:
[dmdba@qiqi129 bin]$ ./DmServerSVR restart
# 远程端重启服务:
[dmdba@qiqi137 bin]$ ./DmServerSR restart
(4)创建dblink语句:
-- 创建私有dblink;
CREATE LINK "DMTEST"."SRLINK" CONNECT WITH "DMSR" IDENTIFIED BY "DMSR12345" USING '192.168.222.222/5236';
-- 创建公有dblink;
CREATE PUBLIC LINK "DMTEST"."SRLINK" CONNECT WITH "DMSR" IDENTIFIED BY "DMSR12345" USING '192.168.222.222/5236';
1. 查看dblink信息
SELECT * FROM SYS.DBA_OBJECTS WHERE DBA_OBJECTS.OBJECT_TYPE='DBLINK';
2. 本地dblink查看远程数据
SELECT * FROM EMP@SCOTTLINK;
3. 执行DML语句
INSERT INTO DEPT@SCOTTLINK VALUES (50,'TECH','BEIJING');
UPDATE DEPT@SCOTTLINK SET DNAME='TEACH' WHERE DEPTNO=50;
DELETE FROM DEPT@SCOTTLINK WHERE DEPTNO=50;
4. 执行存储过程
在Oracle远程端创建存储过程:
CREATE OR REPLACE SCOTT.SP_HW(STR IN VARCHAR2(23))
AS
BEGIN
DBMS_OUTPUT.PUT_LINE(STR);
END;
达梦本地端调用存储过程:
CALL SP_HW@SCOTTLINK('hello_world');
注意
1、数据库连接目前只支持 DM、Oracle 或 ODBC。
2、DM-DM 的同构数据库链接不支持 MPP 环境,DM 与异构数据库的数据库链接支持 MPP 环境。
3、增删改不支持 INTO 语句。
4、不支持使用游标进行增删改操作。
5、不支持操作远程表的复合类型列。
7、DBLINK 理论上不支持 LOB 类型列的操作,但支持简单的增删改语句中使用常量来对 LOB 类型列进行操作。
文章
阅读量
获赞