oracle logminer分析線上 離線日誌方法

season0891發表於2010-04-23
   縱觀當前的資料複製產品,為shareplex為最牛,它自己捕捉了oracle redo log的檔案內容的變化,然後將資料的變化傳輸於對方,透過tcp/ip協議和socket技術,僅僅依賴於資料庫的redo log檔案,不透過資料庫本身,節省了資料庫的資源.

      由於我們無法監視redo log檔案的變化,所以我們無法獲得redo log的內容,而且redo log檔案內容加密,我們無法解密,所以我的想法是透過logminer來解析oracle的redo log,利用logminer的優點是:
1.我們可以傳入當前的redo log解析,準實時的獲得DML語句.
2.我們再解析redo log的時候可以加上時間和SCN的約束,使logminer的解析加快.
3.獲得SQL語句,使放在SGA區的,隨著下一次的解析或者程式的退出,動態表的資料也會丟失,也就是基於session級,因此不必害怕資料的不正 確.
缺點:
1.logminer安裝包僅僅再oracle8i以後才有,所以以前的,必須手動copy安裝.
2.獲得sql的時間是準實時的,速度比shareplex較慢.
3.依賴於資料庫,需要對資料庫的初始話引數修改.
既然說道了logminer,我就列出其安裝過程:
要安裝LogMiner工具,必須首先要執行下面這樣兩個指令碼,
l $ORACLE_HOME/rdbms/admin/dbmslm.sql
2 $ORACLE_HOME/rdbms/admin/dbmslmd.sql.
建立資料字典的目的就是讓LogMiner引用涉及到內部資料字典中的部分時為他們實際的名字,而不是系統內部的16進位制。資料字典檔案是一個文字檔案, 使用包DBMS_LOGMNR_D來建立。如果我們要分析的資料庫中的表有變化,影響到庫的資料字典也發生變化,這時就需要重新建立該字典檔案。另外一種 情況是在分析另外一個資料庫檔案的重作日誌時,也必須要重新生成一遍被分析資料庫的資料字典檔案。
  首先在init.ora初始化引數檔案中,指定資料字典檔案的位置,也就是新增一個引數UTL_FILE_DIR,該引數值為伺服器中放置資料字典文 件的目錄。如:
  UTL_FILE_DIR = (e:\Oracle\logs)

   重新啟動資料庫,使新加的引數生效,然後建立資料字典檔案:
  SQL> CONNECT SYS
  SQL> EXECUTE dbms_logmnr_d.build(
  dictionary_filename => ' v816dict.ora',
  dictionary_location => 'e:\oracle\logs');
2、建立要分析的日誌檔案列表
  >  Oracle的重作日誌分為兩種,線上(online)和離線 (offline)歸檔日誌檔案,下面就分別來討論這兩種不同日誌檔案的列表建立。
  (1)分析線上重作日誌檔案
  A. 建立列表
  SQL> EXECUTE dbms_logmnr.add_logfile(
  LogFileName=>' e:\Oracle\oradata\sxf\redo01.log',
  Options=>dbms_logmnr.new);
  B. 新增其他日誌檔案到列表
  SQL> EXECUTE dbms_logmnr.add_logfile(
  LogFileName=>' e:\Oracle\oradata\sxf\redo02.log',
  Options=>dbms_logmnr.addfile);(2)分析離線日誌檔案
  A.建立列表
  SQL> EXECUTE dbms_logmnr.add_logfile(
  LogFileName=>' E:\Oracle\oradata\sxf\archive\ARCARC09108.001',
  Options=>dbms_logmnr.new);
  B.新增另外的日誌檔案到列表
  SQL> EXECUTE dbms_logmnr.add_logfile(
  LogFileName=>' E:\Oracle\oradata\sxf\archive\ARCARC09109.001',
  Options=>dbms_logmnr.addfile);關於這個日誌檔案列表中需要分析日誌檔案的個數完全由你自己決定,但這裡建議最 好是每次只新增一個需要分析的日誌檔案,在對該檔案分析完畢後,再新增另外的檔案。
  和新增日誌分析列表相對應,使用過程 'dbms_logmnr.removefile' 也可以從列表中移去一個日誌檔案。下面的例子移去上面新增的日誌檔案e:\Oracle\oradata \sxf\redo02.log。
  SQL> EXECUTE dbms_logmnr.add_logfile(
  LogFileName=>' e:\Oracle\oradata\sxf\redo02.log',
  Options=>dbms_logmnr. REMOVEFILE);
  建立了要分析的日誌檔案列表,下面就可以對其進行分析了。
3、使用LogMiner進行日誌分析
  (1)無限制條件
  SQL> EXECUTE dbms_logmnr.start_logmnr(
  DictFileName=>' e:\oracle\logs\ v816dict.ora ');
  (2)有限制條件
  透過對過程DBMS_ LOGMNR.START_LOGMNR中幾個不同引數的設定(引數含義見表1),可以縮小要分析日誌檔案的範圍。透過設定起始時間和終止時間引數我們可 以限制只分析某一時間範圍的日誌。如下面的例子,我們僅僅分析2001年9月18日的日誌,:
  SQL> EXECUTE dbms_logmnr.start_logmnr(
  DictFileName => ' e:\oracle\logs\ v816dict.ora ',
  StartTime => to_date('2001-9-18 00:00:00','YYYY-MM-DD HH24:MI:SS')
  EndTime => to_date(''2001-9-18 23:59:59','YYYY-MM-DD HH24:MI:SS '));
  也可以透過設定起始SCN和截至SCN來限制要分析日誌的範圍:
  SQL> EXECUTE dbms_logmnr.start_logmnr(
  DictFileName => ' e:\oracle\logs\ v816dict.ora ',
  StartScn => 20,
  EndScn => 50);
4、觀察分析結果(v$logmnr_conte
nts)
  到現在為止,我們已經分析得到了重作日誌檔案中的內容。動態效能檢視v$logmnr_contents包含LogMiner分析得到的所有的資訊。
  SELECT sql_redo FROM v$logmnr_contents;
  如果我們僅僅想知道某個使用者對於某張表的操作,可以透過下面的SQL查詢得到,該查詢可以得到使用者DB_ZGXT對錶SB_DJJL所作的一切工作。
  SQL> SELECT sql_redo FROM v$logmnr_contents WHERE username='DB_ZGXT' AND tablename='SB_DJJL';

安裝完logminer,我們就可以獲得變化的DML SQL語句,那麼我們就可以透過occi或者proc去獲得變化的sql語句,透過unix c解析config的檔案,congfig檔案中記載了表名和資料庫的源端和目標端資訊以及解析的其他條件.
使用occi或proc的目的是加快速度,利用unxi c解析配置檔案也是提高速度.
到此為止,一個資料複製的工具產生.

come from:廣告.com/blog/499365

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

相關文章