查看: 113|回复: 0

[Oracle数据库] oracle database link

发表于 3 天前

database link ,我们习惯称为db link。
作用:用于从a数据库到b数据库之间访问的一种手段。类似于 ogg 中的表同步(用户同步)。如上所述,db link 的主要作用是跨库查询。有很多业务都需要进行跨库查询。在我们公司有时就不得不去去创建一些db link。
优点:创建方式简单、易懂、可以拥有创建用户的所有权限。
缺点:自然,方便的手段就会有更多的不利。
1 大量消耗数据库资源;本地系统每通过DBLINK链接远端系统一次,都会生成一个本地session,如本地session不退出或者手动释放,只有通过session超时才能自动释放,会浪费大量的系统资源
2 容易出现数据库BUG:大量使用DBLINK,本地系统极易出现ORA-02068、ORA-03113、ORA-02080、ORA-02054、ORA-02050等Oracle错误,这种错误大部分会影响当前session正在处理的业务
3 性能较差:由于使用DBLINK,本地系统在获取数据时,每次链接都会对远端数据库进行一次全表扫描,且所有数据都会传输回本地数据库内,导致性能降低并且严重浪费当前系统资源。尤其出现一条sql语句从两个DBLINK中取数,更被称之为“性能杀手”,尤其是OLTP型数据库
4 数据传输不稳定,占用带宽严重,容易产生丢包风险:DBLINK本身没有数据存储、监控等功能,是通过网络中的数据库进行传输时,如果在传输过程中出现数据丢包现象,DBLINK本身不会发现,只用当业务进行完毕才能发现丢包现象,这样会影响当前正在处理的业务;另外,通过DBLINK查询的数据会像数据全部传至本地数据库进行操作,数据传输量很大,占用带宽严重,可能会导致网络堵塞
5 Oracle数据功能受限:DBLINK本身不支持对oracle LOB大对象的操作,在使用PROCDURE时,使用COMMIT等操作时可能会出现错误
6 可扩展性较差:如果多系统之间 使用DBLINK进行传输,每增加一个系统,都会增加一个或多个DBLINK链接或者修改对应的接口程序,如果修改其中一个接口,需要修改所有关联系统内的接口程序
7 维护性差、安全性较低:通过DBLINK进行链接需要将远端数据库用户名、密码、IP地址存在本地数据库,如远端进行密码修改、IP地址变更,本地数据库也需要修改,如果系统较多,每个系统都需要同时修改。切本地数据库管理员能够看到远端数据的密码、IP地址,对系统安全产生影响
可是,即使是在缺点这么这么多的情况下,还是会有人用,归根到底,个人感觉还是oracle对两个库之间的交互做的并不是特别好,ogg 好用是好用,但是在表多的情况下,我们可是深受其害。

用法:创建dblink的先决条件便是两个库要能交互(local database to remote database)网络要能连接正常,其次。要在源端数据库tnsname 文件中配置上访问目标的参数。并且能 tnsping 通。
database link 分为两种:一种为 public(公有) 一种为 private(个人)。顾名思义,公有dblink即源库所有的用户都可以使用,个人dblink则只有创建者用户可以使用。
创建dblink是要有相应的权限的。
select * from user_sys_privs where privilege like upper('%LINK%');
USERNAME PRIVILEGE ADM
------------------------------ ---------------------------------------- ---
SYS CREATE DATABASE LINK NO
SYS DROP PUBLIC DATABASE LINK NO
SYS CREATE PUBLIC DATABASE LINK NO
CREATE DATABASE LINK 为创建个人dblink权限。
CREATE PUBLIC DATABASE LINK 为创建公有dblink 权限。

创建dblink
当tnsnames中有了参数。且有了相应的权限之后,就可以创建dblink。创建方式有以下几种。

创建个人dblink语句为 CREATE database link 开头:
使用当前用户的用户名和密码去连接远程数据库。如果密码不对会报错
create database link test1 using 'test';

创建公有dblink语句CREATE PUBLIC database link
使用指定的用户和密码创建公有 dblink
create public database link test3 connect to scott identified by tiger using 'test';

建一个shared 的数据库连接
create shared public database link test4 connect to scott identified by "tiger" authenticated by username identified by "passwd" using 'test';
使用shared方式的 database link是数据库会限制到远程数据库的连接的数量,这样以避免过多的连接对远程数据库造成太大的压力。

还有一种创建方式是不使用tnsname的情况
CREATE database link link_name
CONNECT TO user IDENTIFIED BY screct
USING '(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = ip)(PORT = 1521))
)
(CONNECT_DATA =
(SERVICE_NAME = sales)
)
)';

删除dblink
首先需要查询出来有哪些dblink
select owner,object_name from dba_objects where object_type='DATABASE LINK';
然后如果为pubilc 则删除方式为 drop public database link
如果为个人则删除方式为:drop database link

其实本质上来说,dblink 并不是一个很复杂的东西。但是鉴于对数据库的影响。本着能少用就少用的原则。如果能用一些导入导出去替换dblink(我们也正在这么做)。是最好的。



回复

使用道具 举报