利用oracle快照dblink解決資料庫表同步問題
--1、在目的資料庫上,建立dblink
drop public database link dblink_orc92_182;
Create public DATABASE LINK dblink_orc92_182 CONNECT TO bst114 IDENTIFIED BY password USING 'orc92_192.168.254.111';
--dblink_orc92_182 是dblink_name
--bst114 是 username
--password 是 password
--'orc92_192.168.254.111' 是遠端資料庫名
--2、在源和目的資料庫上建立要同步的表(最好有主鍵約束,快照才可以快速重新整理)
drop table test_user;
create table test_user(id number(10) primary key,name varchar2(12),age number(3));
--3、在目的資料庫上,測試dblink
select * fromtest_user@dblink_orc92_182; //查詢的是源資料庫的表
select * from test_user;
--4、在源資料庫上,建立要同步表的快照日誌
Create snapshot log on test_user;
--5、建立快照,在目的資料庫上建立快照
Create snapshot sn_test_user as select * fromtest_user@dblink_orc92_182;
--6、設定快照重新整理時間(只能選擇一種重新整理方式,推薦使用快速重新整理,這樣才可以用觸發器雙向同步)
快速重新整理
Alter snapshot sn_test_user refresh fast Start with sysdate next sysdate with primary key;
--oracle馬上自動快速重新整理,以後不停的重新整理,只能在測試時使用.真實專案要正確權衡重新整理時間.
完全重新整理
Alter snapshot sn_test_user refresh complete Start with sysdate+30/24*60*60 next sysdate+30/24*60*60;
--oracle自動在30秒後進行第一次完全重新整理,以後每隔30秒完全重新整理一次
--7、手動重新整理快照,在沒有自動重新整理的情況下,可以手動重新整理快照.
手動重新整理方式1
begin
dbms_refresh.refresh('sn_test_user');
end;
手動重新整理方式2
EXEC DBMS_SNAPSHOT.REFRESH('sn_test_user','F'); //第一個引數是快照名,第二個引數 F 是快速重新整理 C 是完全重新整理.
--8.修改會話時間格式
ALTER SESSION SET NLS_DATE_FORMAT = 'YYYY-MM-DD HH24:MI:SS';
--9.檢視快照最後一次重新整理時間
SELECT NAME,LAST_REFRESH FROM ALL_SNAPSHOT_REFRESH_TIMES;
--10.檢視快照下次執行時間
select last_date,next_date,what from user_jobs order by next_date;
--11.列印除錯資訊
dbms_output.put_line('use '||'plsql');
--12.如果你只想單向同步,那麼在目的資料庫建立以下觸發器(當源資料庫表改變時,目的資料庫表跟著改變,但目的資料庫表改變時,源資料庫表不改變).
create or replace trigger TRI_test_user_AFR
after insert or update or delete on sn_test_user
for each row
begin
if deleting then
delete from test_user where id=:old.id;
end if;
if inserting then
insert into test_user(id,name)
values(:new.id,:new.name);
end if;
if updating then
update test_user set name=:new.name where id=:old.id;
end if;
end TRI_test_user_AFR;
--13.如果你想雙向同步,請在源資料庫中執行前6步,並在雙方都建立以下觸發器(當源資料庫表改變時,目的資料庫表跟著改變,目的資料庫表改變時,源資料庫表也改變)
CREATE OR REPLACE TRIGGER BST114.TRI_TEST_USER_AFR
AFTER DELETE OR INSERT OR UPDATE
ON BST114.SN_TEST_USER
REFERENCING NEW AS NEW OLD AS OLD
FOR EACH ROW
declare
tmp_id number(10):=-1;
begin
dbms_output.put_line('begin');
if inserting then
--select id into tmp_id from test_user where id=:new.id;
for p in(select id from test_user where id=:new.id)
loop
tmp_id:=p.id;
end loop;
dbms_output.put_line(tmp_id||'===------------');
if (tmp_id=-1) then
insert into test_user(id,name,age)
values(:new.id,:new.name,:new.age);
end if;
end if;
if updating then
dbms_output.put_line('updated');
for p in(select name,age from test_user where id=:old.id)
loop
if (p.name!=:new.name) or (p.age!=:new.age) then
update test_user set name=:new.name,age=:new.age where id=:old.id;
end if;
end loop;
end if;
if deleting then
dbms_output.put_line('deleted');
delete from test_user where id=:old.id;
end if;
dbms_output.put_line('end');
end TRI_test_user_AFR;
--為防止雙向同步觸發器死迴圈,所以要在觸發器中增加一些判斷,阻止死迴圈.
--以上同步原理
1.首先建立一個dblink,可以訪問遠端資料庫
2.在本地建立一個快照,對映遠端資料表,當遠端資料表有變化時,會反應到快照中.
3.由於快照類似於檢視表,所以在本地為快照建立一個觸發器,當快照有變化時,會觸發相應事件.
4.在觸發器中寫同步資料的程式碼.
--附:快照重新整理時間引數說明
一天的秒數=24小時*60分鐘*60鈔
所以要想在30秒後重新整理,引數應該這樣寫 sysdate+30/(24*60*60)
1分鐘==sysdate+60/(24*60*60)
一天的分鐘數=24小時*60分鐘
一分鐘也可以這樣寫 sysdate+1/(24*60)
30分鐘==sysdate+30/(24*60)
60分鐘==sysdate+60/(24*60)
以此類推
1小時==sysdate+1/24==sysdate+60/(24*60)
1天==sysdate+1
一個月==sysdate+30
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10701850/viewspace-528598/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 解決兩相同資料庫資料同步的問題 (轉)資料庫
- Oracle DBLink跨資料庫訪問SQL server資料同步 踩坑實錄Oracle資料庫SQLServer
- oracle 資料庫解決問題思路總結Oracle資料庫
- 資料庫同步問題資料庫
- 【資料庫】解決Mysql資料庫提示innodb表不存在的問題!資料庫MySql
- MySQL主從資料庫同步延遲問題怎麼解決MySql資料庫
- 資料庫同步更新問題?資料庫
- Laravel5的資料庫表建立問題 資料庫遷移操作報錯問題解決Laravel資料庫
- Oracle 解決鎖表問題Oracle
- 解決客戶資料庫oracle_sid問題資料庫Oracle
- Oracle資料庫字符集問題解決方案大全Oracle資料庫
- Oracle資料庫基本知識及問題解決(轉)Oracle資料庫
- oracle dblink問題Oracle
- 安裝資料庫和資料庫解決問題資料庫
- 谷歌利用資料解決女性員工流失問題谷歌
- 快照庫MV不能成功重新整理問題的解決
- Oracle資料不同步的問題分析和解決思路Oracle
- 資料庫層面問題解決思路資料庫
- Oracle資料庫頻繁歸檔問題的解決辦法Oracle資料庫
- sqlserver、oracle資料庫排序空值null問題解決辦法SQLServerOracle資料庫排序Null
- 解決hive資料庫 插入資料很慢的問題Hive資料庫
- 利用DB Link實現資料庫間的表同步資料庫
- SqlServer資料庫中文亂碼問題解決SQLServer資料庫
- 解決被掛起的資料庫問題資料庫
- Oracle dblink監聽問題Oracle
- 解決Oracle資料庫日誌檔案丟失恢復問題Oracle資料庫
- Oracle delete資料後的釋放表空間問題的解決 --轉Oracledelete
- Mysql多臺資料庫同步問題(轉)MySql資料庫
- Oracle資料庫訪問限制繞過漏洞 解決Oracle資料庫
- 【SQL】Oracle資料庫通過job定期重建同步表資料SQLOracle資料庫
- 利用errorstack event解決問題Error
- 資料庫映象和資料庫快照資料庫
- 安裝mysql資料庫及問題解決方法MySql資料庫
- 用檢視解決資料庫鏈路問題資料庫
- 解決資料庫高併發訪問瓶頸問題資料庫
- 瞭解這一點輕鬆解決Oracle資料庫系統報錯問題Oracle資料庫
- Oracle資料庫連結(DBLink)中如何訪問包含BLOB欄位的資料Oracle資料庫
- 配置ORACLE資料庫到達夢資料庫的異構DBLINKOracle資料庫