这两天在搞两个数据库的数据推送同步,当时想到有两个解决方案,在最开始的mapper层再加个数据源,数据插入时两个数据库一起写入,但是被否了,只好用DBlink+定时任务job执行存储过程的方式。
首先我有两个数据库 clgl 和 jjh 如图,任务是将 jjh 的TEST01表同步推送到 clgl 的同名 TEST01 表中:
任务确定之后,我们开始着手准备两个数据库之间的跨库连接,这里我们使用DBlink的方式。
因为是jjh到clgl,所以我们在clgl表里创建DBlink,连接名为:TESTLINK,代码如下:
- --创建一个公共的数据库连接
- create public database link TESTLINK --连接的名字
- connect to jjh --连接的数据库名 jjh
- identified by "123456" --连接的数据库密码 jjh的密码
- using '192.168.10.110:1521/orcl'; --连接的地址 悬停在jjh上即可显示
执行成功:
我们可以在左侧列表看到这个DBlink:
代码如下:
- select * from TEST01;
- --上边的查询不用复制
-
-
- --进行表级别的同步 创建存储过程
- create or replace procedure TestProc --存储过程名为TestProc
- as
- begin
- delete from TEST01; --先删除clgl中的TEST01表
- insert into TEST01(ID,--再insert jjh库中的TEST01表
- NAME,
- SAL) select ID,
- NAME,
- SAL from TEST01@TESTLINK; --@前边是clgl的TEST01表名 @后边是DBlink名 TESTLINK
- dbms_output.put_line('XYB_JZJXSQ_SYQK同步成功!'); --打印
- commit;
- end;
选中存储过程部分开始执行得到:
- --创建任务JOB testJob
-
- variable job01 number; --任务名为job01
-
-
- --两段分开执行
- begin
- dbms_job.submit(job => :job01, --任务名
- what => 'TestProc;', --执行的存储过程名
- next_date => to_date('3-11-2022 01:00:00', 'dd-mm-yyyy hh24:mi:ss'),--执行开始时间为11.3的凌晨1点
- interval => 'sysdate+12/24'); --执行间隔为12个小时 即下次执行时间为11.3的中午1点
- commit;
- end;
执行:
这里时间搞错了,当时时间为10::39,而写的凌晨1点早就过了,所以会自动间隔12小时到3号晚上的22:39才会执行。
目前笔者都是直接通过SQLdeveloper工具进行直接点点点操作的,方便又好使。
遇到这种纯经验性的需求一定要多做笔记。
参考链接:
https://blog.csdn.net/UniRong/article/details/78671917
http://ttps://segmentfault.com/a/1190000023044236