dblink概述
dblink(Database Link)数据库连接,可以理解为是一个提供本地数据库远程访问另一个数据库中的表的通道,本地数据库创建了dblink后,就可以通过dblink管理远程数据库中的表,进行增删改查操作。
目录
一、配置异构dblink(dm8访问oracle11g)
1. 所需材料
(1)达梦数据库主机:
OS版本:CentOS7 x86_64
内网IP:10.0.0.221
外网IP:192.168.222.221
达梦数据库版本与架构:DM8-ENT 单机
(2)Oracle远程主机:
OS版本:CentOS7 x86_64
内网IP:10.0.0.223
外网IP:192.168.222.223
Oracle数据库版本与架构:11g-Enterprise-Edition 单机
(3)Oracle客户端
oracle官网上下载对应数据库版本的intantclient包(11.2.0.4.0 版),包括basic、sdk、sqlplus三个包一起解压到同一个目录下,下载连接👇:
2. 说明
在达梦配置访问Oracle的dblink的时候,需要事先了解一下Oracle网络服务的相关知识。Oracle的数据库访问有两种,一种称为本地访问,即在oracle服务器上进行访问管理,另一种是通过网络进行管理,需要安装Oracle客户端。在通过客户端进行管理的过程中,需要对网络进行配置,通过不同的配置,用户可以连接到不同的oracle数据库。
如上图所示:在客户端配置好tnsnames.ora文件,在listener.ora中配置监听器。就可以实现远程客户端的网络访问。在同一台服务器上可以配置多个监听器,但监听的端口号不能相同。不同的监听器可以监听对同一个数据库的请求,同一个监听器也可以监听对不同数据库的请求。listener.ora默认存放在%ORALCE_HOME/network/admin下,可以通过设置环境变量tns_admin来修改监听器的位置。可以使用oracle图形界面进行配置(命令netmgr),注意,要在命令行下启动图形界面,有几个步骤:
(1)在shell上输入:export DISPLAY=192.168.222.223:0.0(这个IP地址是客户端的IP地址,即设置该全局变量。告诉 oracle服务器,图形界面显示在该IP地址所在的客户端。)
(2)打开Xmanager-passive,使用这个工具打开图形界面。
(3)输入命令netmgr。
在配置的过程中,注册的概念很重要。注册就是将该数据库作为一个服务注册到监听程序。客户端不需要知道数据库名和实例名,只需要知道该数据库对外提供的服务名就可以申请到数据库连接。这个服务名可能与实例名一样,也有可能不一样。
相当于是这样:在数据库服务器和客户端之间有一个监听程序(LISTENER),在监听程序中,会记录相应数据库对应的服务名(一个数据库可能对应多个服务名),当客户端需要连接数据库时,只需要提供服务名(tnsname.ora),就可以建立客户端与服务器之间的连接。在监听器的配置文件listener.ora中,instance_name表示注册到监听器中的实例值从参数文件中的instance_name参数取得,如果该参数没有取定值,那么它将取参数db_name的值。service_names表示注册到监听器中的服务名从参数文件中的参数service_names取得,如果该参数没有设定值,数据库将拼接参数文件中的db_name.db_domain的值来注册。
3. 搭建步骤
(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
SQL*Plus: Release 11.2.0.4.0 Production on Thu Jul 14 16:51:58 2022
Copyright (c) 1982, 2013, Oracle. All rights reserved.
Connected to:
Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - 64bit Production
With the Partitioning, OLAP, Data Mining and Real Application Testing options
SQL>
(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(DM8访问DM8)
1. 所需材料
(1)达梦数据库主机:
OS版本:CentOS7 x86_64
内网IP:10.0.0.221
外网IP:192.168.222.221
达梦数据库版本与架构:DM8-ENT 单机
(2)达梦数据库远程主机:
OS版本:CentOS7 x86_64
内网IP:10.0.0.222
外网IP:192.168.222.222
达梦数据库版本与架构:DM8-ENT 单机
2. 说明
达梦搭建同构dblink是通过达梦MAL系统进行数据传输,达梦通过mal系统实现redo日志传输,以及其他实例间的消息通讯。开启MAL功能后,本地达梦数据库创建dblink即可实现访问;相对而言达梦之间的dblink搭建较为简单。
3. 搭建步骤
(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@qiqi221 bin]$ ./DmServerSVR restart
# 远程端重启服务:
[dmdba@qiqi222 bin]$ ./DmServerSR restart
(4)创建dblink语句:
-- 创建私有dblink;
CREATE LINK "DMTEST"."SRLINK" CONNECT WITH "DMSR" IDENTIFIED BY "DMSR12345" USING '192.168.222.223/5236';
-- 创建公有dblink;
CREATE PUBLIC LINK "DMTEST"."SRLINK" CONNECT WITH "DMSR" IDENTIFIED BY "DMSR12345" USING '192.168.222.223/5236';
三、DBLINK管理与DML操作
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');
更多资讯请上达梦技术社区了解: https://eco.dameng.com