Oracle資料庫之間資料同步

2021-10-09 14:24:28 字數 4209 閱讀 2505

源庫(env庫)中定義如下包:

包定義如下:

create or replace package pkg_data_report is

— author : johnfnash

— created : 2017/6/8 17:48:03

— purpose : data report to yw

–資料同步儲存過程

procedure sp_data_resport;

–資料增量同步儲存過程

procedure sp_data_incremental_report;

end pkg_data_report;

包具體實現如下:

create or replace package body pkg_data_report is

–資料同步儲存過程

procedure sp_data_resport is

node_name varchar(40) := 『basic_data_sync』;

v_start_time date;

v_end_time date := sysdate;

data_row t_data_sync_record%rowtype;

v_errortext varchar(200);

begin

–鎖住記錄防止併發上報

select *

into data_row

from t_data_sync_record r

where r.data_sync_name = node_name

and r.num = 1

for update;

if data_row.result is null then

–如果上一次資料同步成功,則開始本次資料同步

v_start_time := data_row.end_time;

else

–如果上一次資料同步失敗,則繼續上一次資料同步

v_start_time := data_row.start_time;

v_end_time := data_row.end_time;

end if;

——————- 部門資料同步 ——————-

–刪除之前的記錄

proc_truncate_remote_tab@dbl_yw(『t_department』);

–delete from t_department@dbl_yw;

–重新寫入記錄

insert into t_department@dbl_yw

select d.id,

d.namecn,

d.nameen,

d.code,

d.parentid,

d.namenpath,

d.namcnpath

from t_department d;

——————- 裝置資料同步 ——————-

–寫入記錄

merge into t_device@dbl_lcmyw t1

using (select * from t_device) t2

on ( t1.id=t2.id)

when matched then

update set t1.status = t2.status, t1.timestamep=t2.timestamep

when not matched then

insert (id, name, labid, region, status, createtime, timestamep, creator)

values(t2.id,t2.name,t2.labid,t2.region,t2.status,t2.createtime,t2.timestamep,t2.creator);

–寫入本次資料同步結果

insert into t_data_sync_record

values

(node_name, sysdate, v_start_time, v_end_time, null, 0);

–執行序號加1

update t_data_sync_record

set num = num + 1

where data_sync_name = node_name;

commit;

exception

when others then

rollback; –事物回滾

v_errortext := substr(sqlerrm, 1, 200); –錯誤資訊

–寫入本次資料同步結果

insert into t_data_sync_record

values

(node_name, sysdate, v_start_time, v_end_time, v_errortext, 0);

–執行序號加1

update t_data_sync_record

set num = num + 1

where data_sync_name = node_name;

commit;

end;

end sp_env_opy_report;

end pkg_data_report

其中涉及到的目標庫(yw庫) truncate表的儲存過程 proc_truncate_remote_tab@dbl_yw 定義如下:

的truncate。換個方式,在遠端庫建立儲存過程,執行對該庫中資料表的truncate操作,其它庫建立dblink之後

,可以呼叫該儲存過程,實現對遠端庫表的truncate操作。

下面對上面的比較關鍵的地方進行說明:

1) t_data_sysnc_record

剛進入儲存過程時,鎖住該錶的記錄,防止併發上報;然後根據上一次的執行結果確定本次執行的起始時間

、結束時間,特別是對於增量同步,每次只將時間段內的資料同步到目標庫

(詳見sp_data_incremental_report儲存過程)

表的定義如下:

— create table

create table t_data_sync_record

(data_sync_name varchar2(40) not null,

timestamp date,

start_time date,

end_time date,

result varchar2(200),

num number

);— add comments to the columns

comment on column t_data_sync_record.data_sync_name

is 『資料同步任務名稱』;

comment on column t_data_sync_record.timestamp

is 『任務執行時間』;

comment on column t_data_sync_record.start_time

is 『資料同步開始時間』;

comment on column t_data_sync_record.end_time

is 『資料同步結束時間』;

comment on column t_data_sync_record.result

is 『資料同步執行結果,為空表示成功』;

comment on column t_data_sync_record.num

is 『序號,從1開始,每執行一次之前同一同步任務的序號加1』;

2) 源庫中需建立與目標庫的dblink

create database link create database link dbl_yw connect to yw

identified by password

using 『ilcm』;

3) 資料同步的形式

根據業務的不同,同步的方式可能有好幾種,如刪除目標庫之前所有資料,重新寫入(如果只是少量字段

的值可能有修改,可以使用merge into進行資料同步,如上);增量同步,每次只同步新增的記錄到目標庫

(適用於歷史資料唯讀的情況)

4) 當有多個庫的資料要彙總到同乙個目標庫時,可以在資料庫新增乙個表示**於哪個節點的字段,每個庫

的同步儲存過程為這個字段設定不同的值,就可以區分資料是**於哪個資料庫。不過這種情況下,直接對

目標庫進行truncate操作就不合適了,因為可能會導致資料丟失。這種情況怎麼處理,這裡就不敘述了。

oracle資料庫之間資料同步

這段時間負責某個專案開發的資料庫管理工作,這個專案中開發庫與測試資料庫分離,其中某些系統表資料與基礎資料資料經常需要進行同步,為方便完成指定資料表的同步操作,可以採用dblink與merge結合的方法完成,簡單方便。操作環境 此資料庫伺服器ip為192.168.196.76,有center與bran...

Oracle資料庫之間資料同步

源庫 env庫 中定義如下包 包定義如下 create or replace package pkg data report is author johnfnash created 2017 6 8 17 48 03 purpose data report to yw 資料同步儲存過程 proced...

oracle資料庫之間資料同步

這段時間負責某個專案開發的資料庫管理工作,這個專案中開發庫與測試資料庫分離,其中某些系統表資料與基礎資料資料經常需要進行同步,為方便完成指定資料表的同步操作,可以採用dblink與merge結合的方法完成,簡單方便。操作環境 此資料庫伺服器ip為192.168.196.76,有center與bran...