为什么使用DBLINK
项目中遇到了需要从上游系统获取数据的需求,而不同系统的数据存储在不同数据库中(但都是Oracle数据库)。需要一种方式能够提供跨库的数据获取。DBLINK提供了这种需求的实现方式,通过创建DBLINK,我们能够通过table_name@link_name的方式,像在自己数据库上做数据操作一样访问其他物理库的数据。
DBLINK的使用
我们使用DBLINK前需要先创建好我们需要的DBLINK,然后通过@link_name去使用,下面是个简单的例子;
-- 1. 自己的数据库用户需要有创建DBLINK的权限
grant create database link to my_user_name;
-- 2. 创建DBLINK
create database link link_name connect to user_name identified by user_passwd using
'(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = 0.0.0.0 )(PORT = 1521))
(CONNECT_DATA =
(SERVER = server)
(SERVICE_NAME = service_name)
)'
-- a. link_name是我们创建的BDLINK的名字,在使用的时候会用到
-- b. user_name,user_passwd是我们要创建DBLINK的对方数据库的用户名及密码
-- c. using后面跟的是对方数据库的连接串
-- 3. 使用DBLINK,使用起来就像在自己库上的操作
-- 如,查询创建DBLINK数据库上的user_info表
select * from user_info@link_name where user_name='kangkang';
DBLINK使用的局限性及优化思路
Oracle的DBLINK虽然创建和使用简单,但在使用过程中也发现了其一些问题及局限性,例如:
- 不支持lob(BLOB、CLOB) 类型字段的数据查询(有解决方案)
- 仅能在Oracle数据库间使用(不同数据库也可以,需要其他的工具辅助,配置相对复杂)
- 数据库之间耦合度加深,LINK所在数据库的一些变化会直接影响在其上面创建DBLINK的数据库(如修改了DBLINK使用的密码,表名的修改都会导致受影响数据库要跟着修改)
- 直连的方式需要数据库之间网络的顺畅,网络的问题会直接影响数据操作,没有断点续传的支持
- DBLINK滥用会导致目标数据库压力过大,影响目标数据库本身正常的运行
- DBLINK的滥用还可能出现当目标数据库宕机的情况,将导致相关DBLINK不可用,乃至导致相关系统出现大面积的功能瘫痪
- DBLINK连接用户的权限管理不善,存在操作对方数据库非相关数据库对象的风险
针对上述问题,思考了一些建议及优化思路(仅参考)
- 尽量减少DBLINK的使用(避免滥用)
- 频繁使用或实时性较高的数据不建议采用DBLINK(需要频繁访问对方数据库,网络开销大,易对对方数据库造成影响)
- 通过创建己方数据库同名表(不一定完全一致,根据功能需求)来接收对方数据,DBLINK仅作为数据同步使用,己方系统做数据操作仅在同名表上操作(适用实时性要求不高的数据,仅需要对方数据而不对对方数据库进行增删改操作)
- 约定好数据同步的时间,错开双方系统数据库使用高峰期,尤其是大数据量同步的情况(减少对方数据库网络及服务器压力)
- 有轮询作业及检查机制,若数据传输失败,能够有补偿机制(解决网络直连不稳定的弊端)
- DBLINK连接用户约定好,仅授权DBLINK使用者的需要的数据库对象,做好权限控制(权限最小化,控制好外部数据库对目标数据库的影响)
补充——lob类型数据的解决:
可以创建临时表获取对方表数据,再插入数据库--创建临时表并同步数据 create table user_info_temp as select * from user_info@link_name where 条件; --插入临时表数据 insert into user_info values select * from user_info_temp; --记得清理掉临时表 drop table user_info_temp;