需求是需要將Database_A中的dev_test表中的數據同步到Database_B中的dev_test表中。
因為是通過Database_B去同步Database_A庫中的數據,所以操作都建立在Database_B中,這樣不會對Database_A做任何修改。業務應用場景主要是需要拉取第三方數據庫中的數據。下面所有腳本都是建立在Database_B中
第一步:建立DBLink
在Database_B中建立DBLink;
本文是通過pl/sql來編寫的腳本;
create database link dblink_datapull connect to 對方數據庫賬號 identified by "對方數據庫密碼" using '(DESCRIPTION = (ADDRESS_LIST = (ADDRESS = (PROTOCOL = TCP)(HOST=對方數據庫地址)(PORT = 1521))) (CONNECT_DATA = (SERVICE_NAME = 對方數據庫實例名) ) )'
select * from dual@dblink_datapull //測試是否與Database_A聯通
create public synonym hw_test for dev_test@dblink_datapull //通過語句對需要同步的表建立別名
第二步:創建同步數據的存儲過程
CREATE OR REPLACE PROCEDURE TEST_JOB_DataPull AS SCOTT_ID NUMBER; BEGIN SELECT NVL (MAX (ID), 0) INTO SCOTT_ID FROM dev_test; INSERT INTO dev_test SELECT * FROM hw_test WHERE hw_test.ID > SCOTT_ID; COMMIT; EXCEPTION WHEN OTHERS THEN DBMS_OUTPUT.PUT_LINE ('Exception happened,data was rollback'); ROLLBACK; END;
//dev_test 是Database_B中的數據表
//hw_test 是針對Database_A中DBlink建立的別名
第三步:創建定時任務
declare job_num number; begin dbms_job.submit(job=>job_num,what=>'TEST_JOB_DataPull;',next_date=>SYSDATE,interval=>'sysdate+1/(60*24*60)'); commit; end;
//what 需要執行的存儲過程
//next_date 執行時間
//interval 執行時間間隔
SELECT * FROM USER_JOBS //查看定時任務創建是否成功
oracle JOB常見的執行時間 1、每分鍾執行 TRUNC(sysdate,'mi')+1/(24*60) 2、每天定時執行 例如: 每天凌晨0點執行 TRUNC(sysdate+1) 每天凌晨1點執行 TRUNC(sysdate+1)+1/24 每天早上8點30分執行 TRUNC(SYSDATE+1)+(8*60+30)/(24*60) 3、每周定時執行 例如: 每周一凌晨2點執行 TRUNC(next_day(sysdate,1))+2/24 TRUNC(next_day(sysdate,'星期一'))+2/24 每周二中午12點執行 TRUNC(next_day(sysdate,2))+12/24 TRUNC(next_day(sysdate,'星期二'))+12/24 4、每月定時執行 例如: 每月1日凌晨0點執行 TRUNC(LAST_DAY(SYSDATE)+1) 每月1日凌晨1點執行 TRUNC(LAST_DAY(SYSDATE)+1)+1/24 5、每季度定時執行 每季度的第一天凌晨0點執行 TRUNC(ADD_MONTHS(SYSDATE,3),'q') 每季度的第一天凌晨2點執行 TRUNC(ADD_MONTHS(SYSDATE,3),'q')+2/24 每季度的最后一天的晚上11點執行 TRUNC(ADD_MONTHS(SYSDATE+ 2/24,3),'q')-1/24 6、每半年定時執行 例如: 每年7月1日和1月1日凌晨1點執行 ADD_MONTHS(TRUNC(sysdate,'yyyy'),6)+1/24 7、每年定時執行 例如: 每年1月1日凌晨2點執行 ADD_MONTHS(TRUNC(sysdate,'yyyy'),12)+2/24
第四步:查看數據是否同步
select * from dev_test //查詢數據是否已經同步過來