Oracle创建dblink(实现跨数据库查询)

前言

在分布式架构中,往往会经常遇到跨数据库查询的场景,即两个有关联的表不在一个数据库中。
一般的解决方案有:

  1. 分别查询两张表的数据,业务层进行数据合并处理
    弊端:麻烦,复杂查询条件无法实现分页查询
    优点:实时保证数据一致性
  2. 定时job,定时查询两张表数据或调用接口获取两张表数据,合并保存到一张表中或者MongoDB等数据库中,然后从这张表或MongoDB中进行查询
    弊端:无法保证数据强一致性,适用于最终一致性的场景,定时job出错无法保证数据同步成功
    优点:能实现复杂条件的分页查询
  3. 第三种就是我们要讲的创建dblink实现跨库查询,创建本地数据库对远端数据库的dblink后,就可以像操作本地数据库一样操作远端数据库,这是Oracle给我们提供一个功能,让我们的跨库查询变得非常简单便捷。
    优点:就像操作本地数据库一样,支持分页,保证查结果数据强一致性
    缺点:微服务中,每个服务返回的数据都是经过处理的,跨数据库查询出来需要对数据重新处理

使用dblink

1.查看用户是否有创建dblink的权限(一般管理员用户SYS都有权限)
select * from user_sys_privs t where t.privilege like upper('%link%');
2. 如果创建全局 dblink,必须使用 systm 或 sys 用户,在 database 前加 public。
CREATE PUBLIC DATABASE LINK 数据库链名称 CONNECT TO 登录用户名 IDENTIFIED BY 密码 USING '(DESCRIPTION =
     (ADDRESS_LIST =
       (ADDRESS = (PROTOCOL = TCP)(HOST = 对方Oracle服务器的IP地址)(PORT = 端口号))
     )
     (CONNECT_DATA =
(SERVICE_NAME = 对方Oracle服务器服务名)
     )
   )' 

注:数据库链名称指添加到本地Oracle数据库控制台(Oracle Enterprise Manager Console)树节点的服务名

要查询对方数据库的表TableName语句如下:

SELECT 字段名 FROM TableName@数据链名称;

删除DBLINK

DROP DATABASE LINK [name];  
或  
DROP PUBLIC DATABASE LINK [name];  
3. 创建dblink的两种方式

参考:创建oracle dblink 的两种方式

5. 使用dblink进行查询
SELECT * FROM 远程数据库表名@dblink名;
如:select * from user@dblink;

参考至:
oracle使用dblink跨库查询
oracle dblink详解

------------------------- 纸上得来终觉浅,绝知此事要躬行 ----------------------------

你可能感兴趣的:(Oracle)