前言
在分布式架构中,往往会经常遇到跨数据库查询的场景,即两个有关联的表不在一个数据库中。
一般的解决方案有:
- 分别查询两张表的数据,
业务层进行数据合并处理
弊端:麻烦,复杂查询条件无法实现分页查询
优点:实时保证数据一致性 定时job,定时查询两张表数据或调用接口获取两张表数据,合并保存到一张表中或者MongoDB等数据库中
,然后从这张表或MongoDB中进行查询
弊端:无法保证数据强一致性,适用于最终一致性的场景,定时job出错无法保证数据同步成功
优点:能实现复杂条件的分页查询- 第三种就是我们要讲的
创建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的两种方式
5. 使用dblink进行查询
SELECT * FROM 远程数据库表名@dblink名;
如:select * from user@dblink;
参考至:
oracle使用dblink跨库查询
oracle dblink详解
------------------------- 纸上得来终觉浅,绝知此事要躬行 ----------------------------