通过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 

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

相关推荐
handler0124 分钟前
【MySQL】常用命令总结(库与表增删查改)
运维·数据库·mysql·命令·总结
week@eight32 分钟前
Linux - Doris
linux·运维·数据库·mysql
cdbqss11 小时前
VB2026 菜单生成基类 BqGetMenuStrip
数据库·经验分享·学习·oracle·vb
洛水水1 小时前
Redis 分布式锁详解:实现与缺陷
数据库·redis·分布式
韶博雅1 小时前
oracle中表和列转大写
数据库·oracle
暴躁小师兄数据学院2 小时前
【AI大数据工程师特训笔记】第04讲:PostgreSQL 数据库内置函数详解
大数据·数据库·笔记·ai·语言模型
苏渡苇3 小时前
Spring Cloud Alibaba:将 Sentinel 熔断限流规则持久化到 Nacos 配置中心
数据库·spring boot·mysql·spring cloud·nacos·sentinel·持久化
杨云龙UP3 小时前
Oracle Recycle Bin 回收站详解:DROP TABLE 后还能找回吗?
linux·运维·数据库·sql·mysql·oracle
未来之窗软件服务3 小时前
酒店门锁V10SDK接口VB-幽冥大陆(一百26)—东方仙盟
数据库·酒店门锁·仙盟创梦ide·东方仙盟·东方仙盟sdk·东方仙盟幽冥大陆
墨_风4 小时前
MyBatis时间区间查询异常排查(达梦数据库)
数据库·mybatis·达梦