通过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 InnoDB RR 隔离下二级索引临键锁引发 INSERT 锁超时 全链路解析
java·数据库·mysql
Gh0st_Lx14 分钟前
【2】MySQL 为什么使用 B+树
数据库·b树·mysql
我不会插花弄玉15 分钟前
8. 复合查询【由浅入深-MySQL】
android·数据库·mysql
北风toto22 分钟前
数据库模式分解:如何判定“保持函数依赖”?
数据库
极限挑战哥1 小时前
深度拆解团购多商户分账系统:规则引擎 + 账户体系 + 逆向清算全解析
网络·数据库·人工智能
数据狐(Datafox)1 小时前
一文读懂京东商品详情 API:返回字段解读与 JSON 样例
开发语言·数据库·爬虫·json
zyseo82 小时前
谷歌SEO 抓取日志分析脚本:解析访问日志,看穿 Googlebot 的抓取行为
大数据·数据库·搜索引擎·自动化
ai大模型-探索者2 小时前
Milvus向量数据库(介绍与使用)
数据库·milvus
minglie12 小时前
zynq联网配置
网络·数据库·php