源庫(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...