1. 程式人生 > >利用oracle快照dblink解決資料庫表同步問題

利用oracle快照dblink解決資料庫表同步問題

本例項已完全通過測試,單向,雙向同步都可使用.

--名詞說明:源——被同步的資料庫
            目的——要同步到的資料庫

前6步必須執行,第6以後是一些輔助資訊.

--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 * from [email protected]_orc92_182;    //查詢的是源資料庫的表
select * from test_user;

--4、在源資料庫上,建立要同步表的快照日誌
Create snapshot log on test_user;

--5、建立快照,在目的資料庫上建立快照
Create snapshot sn_test_user as select * from [email protected]_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

相關推薦

利用oracle快照dblink解決資料庫同步問題

本例項已完全通過測試,單向,雙向同步都可使用. --名詞說明:源——被同步的資料庫            目的——要同步到的資料庫 前6步必須執行,第6以後是一些輔助資訊. --1、在目的資料庫上,建立dblinkdrop public database link dblink_orc92_182;Crea

利用OracledbLink進行同步

場景:從ORACLE A  同步表到ORACLE B 一、建立database link(B端) create public database link dblink_name connect t

如何利用報表工具快速實現資料庫維護

在各種產品直銷系統中,隨時可能更新產品資訊,例如將過時產品資訊下架、新開發產品上新、根據不同節假日修改產品價格,等等等等。傳統的做法中,如果沒有面向業務人員的專門維護介面,或者資料修改的策略常常發生變化,業務人員就只能求助開發人員,讓他們去資料庫中執行查詢或更新 sql 語句來實現產品資訊的維護,這

SQL SERVER 資料庫同步複製 筆記 SqlServer2008 資料庫同步的兩種方式 (釋出、訂閱)

SQL SERVER 資料庫表同步複製 筆記 同步複製可執行在不同版本的SQL Server服務之間 環境模擬需要兩臺資料庫192.168.1.1(釋出),192.168.1.10(訂閱) 1、在釋出和訂閱機中建立兩個相同的賬戶(如: sqladmin),使用者名稱和密碼都一致,隸屬於administr

oracle使用dblink進行資料庫直連操作

1.若多個數據庫之間有業務連線的需求,最簡單的辦法是進行資料庫的直連(DbLink)(而非採用程式程式碼開發)】  (1)oracle連線sqlserver   有兩張方案可選:在伺服器建立透明閘道器,或建立關於sqlserver的資料來源,具體配置如下: &n

oracle匯出已存在資料庫語句

第一步:安裝pl/sql Developer (此程式Oracle必備軟體,在此不再討論) 第二步:登入pl/sql Developer                                             登入介面 第三步在左側選單選擇Tables

example:利用impdp通過dblink匯入資料庫

說明 本地資料庫需要10g 以上版本 本地資料庫沒有新建賬戶,直接匯入到scott 使用者; impdp 特色 只需要一個dblink ,就能實現將資料庫從一臺機器匯入到另外一臺機器 以下是測試全過程, 每個小格子,代表了一次嘗試 準備工作

實現跨資料庫同步的方法

描述:資料庫A中的表table1,實時同步到資料庫B 1、在資料庫A中設定訪問資料庫B的連結伺服器。 2、在兩個資料庫之間表中,選擇一個表,對其新增、刪除、修改操作設定觸發器,通過觸發器實現資料同步到其他資料庫的表。 -建立觸發器,同步遠端表_新增操作CREATE TRIGG

利用Oracle審計功能記錄資料庫操作

8.1、啟用審計 sqlplus / as sysdba  SQL> show parameter audit NAME                                 TYPE        VALUE ----------------------

利用oracle儲存過程向資料庫批量插入資料

create or replace procedure test is begin for i in 1 ..100 loop insert into 表名(id,name) values

利用資料泵匯出匯入資料庫

平時開發中我們經常要備份資料庫或者還原資料庫的操作:而常用的資料庫的備份方式基本上分為三種:匯出/匯入(EXPORT/IMPORT)、冷備份、熱備份方式。匯出備份是一種邏輯備份,冷備份和熱備份是物理備份。 具體大家可以參考 http://suleeair.iteye.com/

oracle 用plsql刪除資料庫列的comments

oracle 用plsql刪除表的comments select 'comment on column '||t.table_name||'.'||t.column_name||' is '''';' from user_col_comments t;這種方法是拼成sql語

利用DB Link搞定Oracle兩個資料庫間的同步

資料庫之間的連結建立在DATABASE LINK上。要建立一個DB LINK,必須先在每個資料庫伺服器上設定連結字串。 1、 連結字串即服務名,首先在本地配置一個服務名,地址指向遠端的資料庫地址,服務名取為將來你要使用的資料庫鏈名: 2、建立資料庫連結,進入系統管理員SQL>操作符下,執行命令:

利用DB Link兩步搞定Oracle兩個資料庫間的同步

一、實現目標:          要實現從源表:AAA到目標表:BBB的資料同步。 二、在目標機上建立Oracle DB Link:      1、 在network/admin/tnsname.ora檔案中加入源庫的連線資訊,如: AAA=  (DESCRIPTION 

Oracle 12c 插鏈式資料庫下建空間,新建使用者及賦權SQL,解決導不出的問題,使用者鎖定問題,密碼過期問題。

1、連線SQLPLUS sqlplus /nolog 2、SYSDBA登入 conn / as sysdba 3、檢視PDB show pdbs; 4、將會話轉到具體某個DB下 alter session set container=dbname; 5、建立表

利用hibernate的對映檔案,自動生成oracle資料庫

第一種:利用hibernate根據對映檔案生成表 1、首先下載oracle的jdbc驅動包,本例子採用的oracle 11g,所以需要下載ojdbc6.jar版本。 2、在class根目錄下建立hibernate.cfg.xml檔案,內容如下: <?xml versi

oracle不同資料庫資料同步

--在外部資料庫上建立物化檢視日誌 create materialized view log on users; --在本地資料庫上建立dblink訪問所需的外部資料庫 --dblinkname為dblink名,zbx為資料庫的使用者名稱和登入密碼 creat

利用Oracle DBLink現實資料庫更新功能

1、DBLink作用:將多個不同地點的伺服器的Oracle資料庫連線起來,邏輯上可看成一個數據庫來對待,實現資料庫之間的單向操控。 2、要使用DBLink,首先你要有操作DBLink的許可權; grant CREATE DATABASE LINK to ywgl; 3、建立

oracle通過DBLink訪問遠端資料庫的LOB欄位報ORA-22992的解決方法

oracle通過DBLink訪問遠端資料庫的LOB欄位報ORA-22992的解決方法 最近在做資料庫遷移,從一個數據庫匯入表到另外一個數據庫,同時為了更換表空間,在匯入的過程中出現包含BLOB型別的表不能匯入,(欄位是BLOB型別),如果本地資料庫直接通過select語

Oracle資料庫--解決單張中資料量巨大(大資料、資料量上百萬級別,後查詢,更新資料等耗時劇增)

思路1:採用備份表 備份表中儲存不活躍的資料eg:只有查詢操作的資料(資料的部分屬性欄位不再更改)且查詢次數也較少; 備份表可以是一張或者多張備份表,若採用多張備份表,則定期建立備份表(備份表的命名要規範,可以考慮使用原表名稱+時間戳命名) 採用多張備份表:定期建立一個備份