天天看點

利用DBLink+JOB實作兩個Oracle資料庫之間的資料同步



這裡通過DBLink+JOB實作兩個Oracle資料庫之間的資料同步,我自己測試了兩個資料庫之間的一個表同步沒有問題,下面寫個詳細例子供大家參考;

第一步:建立DBLink

 兩個資料庫,源資料庫test中的表資料同步到目标資料庫scott的同一個表(表不相同也可以,不影響的),在PL/SQL工具裡輸入:

create database link link名稱

connect to 對方資料庫使用者名 identified by 對方資料庫使用者密碼

using '對方資料庫ip:端口/執行個體名';

例如:本例子的

-- Create database link

create public database linkSCOTT_LINK

 connect to SCOTT identified by密碼

 using 'gwssi';

可用 select * from [email protected]SCOTT_LINK;來測試是否連接配接成功

第二步:資料同步的存儲過程

CREATE OR REPLACE PROCEDURE TEST_JOB_SCOTT

AS SCOTT_ID  NUMBER;

BEGIN

  SELECT  NVL (MAX (ID), 0) INTO SCOTT_ID FROM [email protected]_LINK;

   INSERT INTO [email protected]_LINK

     SELECT  *

         FROM  T_OPD_CQZXXB

       WHERE  T_OPD_CQZXXB.ID > SCOTT_ID;

    COMMIT;

EXCEPTION

   WHEN OTHERS

   THEN

     DBMS_OUTPUT.PUT_LINE ('Exceptionhappened,data was rollback');

     ROLLBACK;

END;

這是我的例子,T_OPD_CQZXXB是表名,具體需要怎麼同步看各自的需求,明白怎麼一個流程就行

第三步:建立JOB任務,定時同步資料

在PL/SQL的command window輸入以下語句:

var job_num number; 

begin 

   dbms_job.submit(:job_num,'TEST_JOB_SCOTT;',SYSDATE,'sysdate+1/24/60'); 

end; 

/

查詢你的job語句:SELECT * FROM USER_JOBS; 

ps:下面來講講定時任務的時間間隔怎麼算的。

第一種排程任務需求的日期算法比較簡單,即'SYSDATE+n',這裡n是一個以天為機關的時間間隔。

描述 Interval參數值

每天運作一次    'SYSDATE + 1'

每小時運作一次    'SYSDATE + 1/24'

每10分鐘運作一次    'SYSDATE+ 10/(60*24)'

每30秒運作一次    'SYSDATE+ 30/(60*24*60)'

每隔一星期運作一次    'SYSDATE + 7'

不再運作該任務并删除它 NULL

第二種排程任務需求相對于第一種就需要更複雜的時間間隔(interval)表達式

描述 INTERVAL參數值

每天午夜12點   'TRUNC(SYSDATE +1)'

每天早上8點30分   'TRUNC(SYSDATE + 1) +(8*60+30)/(24*60)'

每星期二中午12點     'NEXT_DAY(TRUNC(SYSDATE ), ''TUESDAY'' ) + 12/24'

每個月第一天的午夜12點   'TRUNC(LAST_DAY(SYSDATE ) + 1)'

每個季度最後一天的晚上11點   'TRUNC(ADD_MONTHS(SYSDATE + 2/24, 3 ), 'Q' ) -1/24'

每星期六和日早上6點10分    'TRUNC(LEAST(NEXT_DAY(SYSDATE, ''SATURDAY"),NEXT_DAY(SYSDATE, "SUNDAY"))) +(6×60+10)/(24×60)'

這樣就會定時同步兩個表的資料了,經驗分享,大家細節有不懂得歡迎讨論或者度娘.



繼續閱讀