Oracle 通過dblink和job方式實現兩個數據庫表之間數據同步


需求是需要將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 //查詢數據是否已經同步過來

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM