這裡通過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)'
這樣就會定時同步兩個表的資料了,經驗分享,大家細節有不懂得歡迎讨論或者度娘.