透過Log Miner做Oracle資料同步

luashin發表於2016-03-01
   目前市面上有不少Oracle databasae資料庫同步的軟體,普遍分兩類:Oracle原廠的(OGG)、開源免費的(SymmetricDS)。原廠的原理是讀取redo log和archive log,SDS主要是透過Trigger做同步。實際測試的結果,感覺很臃腫,OGG很貴,其實我們是可以透過archive log做同步的(但是建議,要資深的DBA才能做,因為log miner是需要DBA許可權的。作者在世界500強跨國企業當DBA超過10年)

實驗環境: 

    Source DB: 
    -- RHEL5.8 X64 OS
    -- Oracle11g SE1 DB

    Target DB:
    -- CENTOS6.5 X64 OS
    -- Oracle11g SE1 DB

使用的工具:
     Python2.6、Bshell(Linux自帶), Oracle Client(Oracle11g 自帶)
     比較難的點:
     --  利用log miner讀取log
     --  利用Linux的ls, seq, awk定位最近產生的log(這個難不倒大家吧)
     --  利用Python把SQL, Shell結合在一起,做到real-time

   首先,log miner需要先安裝,網上很多範例,就不多說了。安裝完成後,利用下面的SQL語句,就可以找到相對應的SQL。產生完SQL就直接在target DB執行。
SQL>

alter session set NLS_DATE_FORMAT="YYYY-MM-DD HH24:MI:SS";     -- 如果不設定,就只能看到日期看不到時間
execute dbms_logmnr.add_logfile(LogFileName=>'/home/hadoop/ora11g/dbs/arch/1_204_897823121.dbf', options=>dbms_logmnr.new);                                     -- 需要分析的log
execute dbms_logmnr.start_logmnr(Options=>dbms_logmnr.DICT_FROM_ONLINE_CATALOG+DBMS_LOGMNR.COMMITTED_DATA_ONLY+DBMS_LOGMNR.NO_ROWID_IN_STMT);                         -- 讀取線上的字典,只有commit的語句才讀出來,不要ROWID
set feedback off
set heading off
spool spool.tmp
SELECT sql_redo FROM v$logmnr_contents where seg_name ='TEST';  -- 需要找什麼樣的table就看自己了條件自己把握。
execute dbms_logmnr.end_logmnr;
spool off
exit;

實驗內容:透過對test.test表格的修改,看log miner是否可以從log中找到相關的SQL語句:
Table test.test的內容:
SQL> select * from test.test;
        ID COL1
---------- --------------------------------
         1 a
         2 aa
         3 aaa

1. 增加個欄位:newcol  
PL/SQL procedure successfully completed.
ALTER TABLE TEST.TEST ADD (newcol VARCHAR2(32 BYTE));       《== 這個是從log miner撈到的資料

2. 插入條record
PL/SQL procedure successfully completed.
insert into "TEST"."TEST"("ID","COL1","NEWCOL" values ('4','newa',NULL); 《== 這個是從log miner撈到的資料 

3. truncate table資料
PL/SQL procedure successfully completed.
TRUNCATE TABLE TEST.TEST drop storage;  《== 這個是從log miner撈到的資料

4. delete table
PL/SQL procedure successfully completed.
DROP TABLE TEST.TEST CASCADE CONSTRAINTS PURGE; 《== 這個是從log miner撈到的資料
   以上基本的操作,都可以完全做出來。當然,其他DDL和資料型別,就要按照情況測試了。當然,這個是基本功,需要自動化運維的話,還需要更多的知識,這裡是利用Python做的,Linux+Python+Oracle,可以做到自動化分析archive log,自動化apply to target DB。後續也可以和Hbase結合,或者與Hadoop結合。這樣就可以基本上做到讀寫分離了。也完全可以讀取redo log,不過,自己試試看吧。挺好玩的。

5. 支援CLOB
PL/SQL procedure successfully completed.
insert into "TEST"."TEST"("ID","CLOB") values ('4',EMPTY_CLOB());
DECLARE
loc_c CLOB;
buf_c VARCHAR2(6156);
loc_b BLOB;
buf_b RAW(6156);
loc_nc NCLOB;
buf_nc NVARCHAR2(6156);
BEGIN
select "CLOB" into loc_c from "TEST"."TEST" where "ID" = '4' for update;
  dbms_lob.trim(loc_c, 0);
END;

update "TEST"."TEST" set "CLOB" = 'Hello, Yes, Hello, Yes, Hello, Yes, Hello, Yes, Hello, Yes, Hello, Yes, Hello, Yes, Hello, Yes, Hello, Yes, Hello, Yes, Hello, Yes, Hello, Yes, Hello, Yes, Hello, Yes, Hello, Yes, Hello, Yes, Hello, Yes, Hello, Yes, Hello, Yes, ' where "ID" = '4';

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/9034054/viewspace-2018372/,如需轉載,請註明出處,否則將追究法律責任。

相關文章