DBLINK使用的思考

为什么使用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;
  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值