通过DBLink连接实现Oracle数据库同步,完美解决了小组长头疼已久的问题,记录一下

文编|JavaBuild

大家好呀,我是JavaBuild,以后可以喊我鸟哥,嘿嘿!俺滴座右铭是不在沉默中爆发,就在沉默中灭亡,一起加油学习,厚积薄发!

场景介绍:

最近,系统拆分后发生了一件令人困扰的事情,我们由母系统中的一个数据采集报表汇总的模块独立出来成为一个独立的系统后,母系统变成了我们的上游系统,主要作用就是供数,但考虑到很多报表都是实时出表的,系统之间数据传输就出现了问题。

公司内部原有方案有两种:

  1. 可以通过ETL作业,通过一定的SQL逻辑,从数据源抽数到目的库中,这个类似于navicat所支持的数据传输功能,但这种弊端是千万级数据表的插入非常慢,性能太差。

  2. 通过数据中台(数据仓库)将源数据库索取到,我们再从数据仓库进行取数,由于数据仓库都是每天通过定时批量去索取各系统数据的,所以这种方案最大的弊端就是时效性不够,比如在出报表的过程中,有些数据不对,需要调整数据源数据,这时候很难同时在我们下游系统取到实时同步的数据。

Oracle环境下通过DBLink+同义词(synonyms)的方式,可以完美解决这种问题场景

DBLink(DabaBaseLink),一种跨数据库连接技术,可以实现本地数据库实时操作(增删改查)相关联数据库,数据表、视图、函数等均可。

操作步骤:

**1,dblink创建,**sys用户默认有创建dblink的权限,若无权限,可通过grant命令进行赋权操作

Linux环境下的参考命令如下:

sql 复制代码
-- 切换用户至oracle
su - oracle
-- sys用户登录sqlplus
sqlplus / as sysdba
-- 查看当前用户下所有的db_links
select * from ALL_DB_LINKS;
-- 与指定ip的数据库建议dblink连接
create public database link test_lk(连接名,自定义) connect to testuser(想连接的数据库用户名) identified
by password(密码) using '(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST=10.11.121.88(想要连接的数据库ip)
)(PORT=1521)))(CONNECT_DATA=(SERVICE_NAME=orcl(实例名))))';
-- 创建完后可通过查询语句看一下,有没有创建成功,下面语句若可以查出结果,即创建成功。
select * from table(想要连接的数据库下表名)@test_lk(上面创建的连接名)   
-- 删除dblink
drop public database link linkname(连接名);

很多企业都要求所有脚本都不可以出现明文密码,所以这里再提供一种shell脚本来创建dblink连接

bash 复制代码
#!/bin/bash
pwd=`echo base64加密后密码|base64 -d`

sqlplus / as sysdba << !
create public database link test_lk connect to testuser identified
by password using '(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST=10.11.121.88)(PORT=1521)))(CONNECT_DATA=(SERVICE_NAME=orcl)))';
exit
!
echo 'create success!!!'

网上有很多提供dblink的操作,但我们不可能在我们的代码中使用上游系统数据库表时,还要在后面加个@连接名,这对现有代码的改动量太大了,可读性也很差,所以这时候我们可以再加上一步操作,那就是建立同义词!

2,同义词建立

sql 复制代码
grant create any synonym to 用户名
create or replace synonym tablename for tablename@test_lk 

通过以上两步操作就实现了,在不该表当先系统代码中表名的情况下,直接读取上游系统数据库数据啦。

相关推荐
剩下了什么8 小时前
MySQL JSON_SET() 函数
数据库·mysql·json
山峰哥8 小时前
数据库工程与SQL调优——从索引策略到查询优化的深度实践
数据库·sql·性能优化·编辑器
较劲男子汉9 小时前
CANN Runtime零拷贝传输技术源码实战 彻底打通Host与Device的数据传输壁垒
运维·服务器·数据库·cann
java搬砖工-苤-初心不变9 小时前
MySQL 主从复制配置完全指南:从原理到实践
数据库·mysql
山岚的运维笔记10 小时前
SQL Server笔记 -- 第18章:Views
数据库·笔记·sql·microsoft·sqlserver
roman_日积跬步-终至千里11 小时前
【LangGraph4j】LangGraph4j 核心概念与图编排原理
java·服务器·数据库
汇智信科11 小时前
打破信息孤岛,重构企业效率:汇智信科企业信息系统一体化运营平台
数据库·重构
野犬寒鸦12 小时前
从零起步学习并发编程 || 第六章:ReentrantLock与synchronized 的辨析及运用
java·服务器·数据库·后端·学习·算法
晚霞的不甘13 小时前
揭秘 CANN 内存管理:如何让大模型在小设备上“轻装上阵”?
前端·数据库·经验分享·flutter·3d
市场部需要一个软件开发岗位13 小时前
JAVA开发常见安全问题:纵向越权
java·数据库·安全