工具:Oracle官方工具sqldeveloper
题目描述:
这两天在搞两个数据库的数据推送同步,当时想到有两个解决方案,在最开始的mapper层再加个数据源,数据插入时两个数据库一起写入,但是被否了,只好用DBlink+定时任务job执行存储过程的方式。
实操解决:
1、任务
首先我有两个数据库 clgl 和 jjh 如图,任务是将 jjh 的TEST01表同步推送到 clgl 的同名 TEST01 表中:
2、 DBlink
任务确定之后,我们开始着手准备两个数据库之间的跨库连接,这里我们使用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:
3、 创建同步的存储过程 存储过程名为TestProc
代码如下:
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;
选中存储过程部分开始执行得到:
4、创建任务job
--创建任务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才会执行。
5、删除和修改
目前笔者都是直接通过SQLdeveloper工具进行直接点点点操作的,方便又好使。
笔记总结:
遇到这种纯经验性的需求一定要多做笔记。
参考链接:
https://blog.youkuaiyun.com/UniRong/article/details/78671917
http://ttps://segmentfault.com/a/1190000023044236