對ORACLE 已提交的事務進行復原之詳細版和操作版

來源:互聯網
上載者:User
 

詳細版:

Logminer是每個Dba都應熟悉的工具,當一天由於使用者的誤操作你需要做不完全的恢複時,由於你無法確定這個操作是哪個時間做的,所以這對你的恢複就帶來的很大的難度,丟失的資料也不能完全恢複回來。而LogMiner就可以幫你確定這個誤操作的準確時間。
一、LogMiner的幾點說明
1、LogMiner可以幫你確定在某段時間所發的各種DML,DDL操作的具體時間和 

SCN號,它所依據的是歸檔記錄檔及聯機記錄檔。
2、它只能在Oracle8i及以後的版本中使用,不過它可以分析Oracle8的日誌。
3、Oracle8i只能用於分析DML操作,到Oracle9i則可以分析DDL操作了。
4、LogMiner不支援索引組織表、Long、LOB及集合類型。
5、MTS的環境也不能使用LogMiner.
二、操作步驟

建立相關dbms_logmnr包時,

以下操作都需要已SYS使用者,以SYSDBA的身份進行操作;其他身份應該是不允許的,現在還沒驗證

1.登陸操作視窗

1.1進到sqlplus操作平台:

 

1.2進入方式:

    1.2.1 cmd進入:(開始->運行cmd->sqlplus)  

    SQL>sys/password@執行個體 as sysdba

 

1.2.2  Oracle應用程式進入:開始->所有程式->Oracle-OraHome92->Application Development->SQL PLUS))

SQL>sys/password@執行個體 as sysdba

 

1.2.3第三方工具:例PL/SQL Developer中的command window

sys/password@執行個體 as sysdba(登陸視窗輸入)

 

2.要安裝LogMiner工具,必須首先要運行下面這樣兩個指令碼


2.1 建立DBMS_LOGMNR包
SQL>@ORACLE_HOME/rdbms/admin/dbmslm.sql

SQL>@ORACLE_HOME/rdbms/admin/dbmslmd.sql

第一個指令碼用來建立DBMS_LOGMNR包,該包用來分析記錄檔

第二個指令碼用來建立DBMS_LOGMNR_D包,該包用來建立資料字典檔案
在1.2.1和1.2.2中用SQL>@ORACLE_HOME/rdbms/admin/dbmslm.sql

這部分操作的時候,往往會出錯(ORACLE_HOME驗證可以用絕對路徑如:d:/oracle/ora92)

而在1.2.3中使用SQL>$ORACLE_HOME/rdbms/admin/dbmslm.sql,這裡一定要區分@和$的區別

3. 建立相關資料字典
(建立資料字典檔案

資料字典檔案是一個文字檔,由dbms_logmnr_d來建立。

首先需要修改參數UTL_FILE_DIR,該參數值為伺服器中放置資料字典檔案的目錄,10g中通過動態修改參數的方式來修改,然後重啟資料庫方生效。其中該目錄必須預先建立好。

SQL> show parameter utl_file_dir;

NAME                                 TYPE        VALUE

------------------------------------ -----------  

utl_file_dir                       string               

 

如果value中的值是空的,說明沒有指定對應的utl_file_dir的值即伺服器中放置資料字典檔案的目錄

4.修改初始化參數UTL_FILE_DIR,指定分析資料的存放處
SQL>alter system set UTL_FILE_DIR='/oracle/logminer' scope=spfile;

操作完之後再查看一下show parameter utl_file_dir
SQL> show parameter utl_file_dir;

NAME                                 TYPE        VALUE

------------------------------------ -----------  

utl_file_dir                       string       /oracle/logminer
5.重啟資料庫
  SQL>shutdown immediate

(如果重啟不了,可以通過管理工具中的服務重啟相關oracle執行個體)

本人測試在cmd中能重啟,在PL/SQL developer中重啟不了;
  SQL>startup

6.建立資料字典檔案

SQL>execute dbms_logmnr_d.build(dictionary_filename =>'sqltrace.ora',dictionary_location =>' /oracle/logminer/');
產生資料字典檔案,是通過dbms_logmnr_d.build()來完成。
dictionary_location指的是Logminer資料字典檔案存放的位置,它必須匹配utl_file_dir的設定。其中的dictionary_filename指的是放於存放位置的字典檔案的名字,名字可以任意取。

7.建立日誌分析表

SQL> execute dbms_logmnr.add_logfile(options =>dbms_logmnr.new,logfilename =>'/ oracle/ora92/rdbms/ARC00009.001');

  a、建立日誌分析表資料庫必須在mount或nomount狀態,啟動資料庫到mount狀態。  

b、建立日誌分析表,使用dbms_logmnr.add_logfile()

c、其中的options有三種取值,dbms_logmnr.new用於建一個日誌分析

表;dbms_logmnr.addfile用於加入用於分析的的記錄檔;dbms_logmnr.removefile用於移出用於分析的記錄檔。

8.添加用於分析的記錄檔

SQL> execute dbms_logmnr.add_logfile(options =>dbms_logmnr.addfile,logfilename=>'/oracle/ora92/rdbms/ARC00010.001');

SQL> execute dbms_logmnr.add_logfile(options =>dbms_logmnr.addfile,logfilename =>'/ /oracle/ora92/rdbms/ARC00011.001');

刪除

SQL> execute dbms_logmnr.add_logfile(options =>dbms_logmnr.removefile,logfilenam

e =>'/oracle/ora92/rdbms/ARC00011.001');


9.啟動LogMiner進行分析

  9.1無限制條件

SQL> execute dbms_logmnr.start_logmnr(

DictFileName=>'/oracle/logminer/ sqltrace.ora');

注意,這裡的sqltrace.ora就是前面建立的字典檔案名稱。

分析過程根據所選取檔案的資料量,可能需要幾個小時。有時候,DBA可能並不需要這些記錄檔中所有的資料,那麼能否只分析部分資料呢。

 

9.2有限制條件

SQL> execute dbms_logmnr.start_logmnr(dictfilename =>'/opt/oracle/logminer/log/sqltrace.ora',starttime =>to_date('20040625 09:00:00','yyyymmdd hh24:mi:ss'),endtime =>to_date('20040625 22:00:00','yyyymmdd hh24:mi:ss'));
即分析20040625 09:00:00至20040625 22:00:00這段時間,並把分析結果放     

到資料字典中以用於查詢。還有兩個參數StartScn(起始scn號)及EndScn(終止Scn)號。

 

也可以通過設定起始SCN和截至SCN來限制要分析日誌的範圍:

SQL> EXECUTE dbms_logmnr.start_logmnr(

DictFileName => '/dataoracle/oracle/logminer/dictionary.ora ',

StartScn => 20,EndScn => 50);

分析結束後,所分析到的資料可以從一個名為 V$LOGMNR_CONTENTS的視圖中查詢到。我們就可以應用這個視圖中的內容來達成目的。

表1 DBMS_LOGMNR.START_LOGMNR過程參數含義

參數

參數類型

預設值

含義

StartScn

數字型(Number)

0

分析重作日誌中SCN≥StartScn記錄檔部分

EndScn

數字型(Number)

0

分析重作日誌中SCN≤EndScn記錄檔部分

StartTime

日期型(Date)

1998-01-01

分析重作日誌中時間戳記≥StartTime的記錄檔部分

EndTime

日期型(Date)

2988-01-01

分析重作日誌中時間戳記≤EndTime的記錄檔部分

DictFileName

字元型(VARCHAR2)

 

字典檔案,該檔案包含一個資料庫目錄的快照。使用該檔案可以使得到的分析結果是可以理解的文本形式,而非系統內部的16進位

Options

BINARY_INTEGER

0

系統調試參數,實際很少使用

 

10.參看分析結果

select operation,sql_redo,sql_undo from v$logmnr_contents;

 

註:其中operation指的是操作,sql_redo指的是實際的操作,sql_undo指的是用於取消的相反的操作。

SQL_REDO 列顯示的是所做的操作(SQL 陳述式),SQL_UNDO 列顯示的是要恢複該操作所需要的SQL語句,只要順序執行SQL_UNDO的內容,就可以恢複到修改前的資料。

使用這個方法恢複資料,好處在於不會有資料損失。否則只能做 incomplete recovery。

由於所有應用中,其實都是利用v$logmnr_contents這個視圖,因此在此介紹一下該視圖中特別有用的幾個欄位:

Seg_name: 表名;

Scn: SCN 號碼

Sql_redo: 所作的sql 語句

Sql_undo: 對應sql_redo, 恢複用的sql 語句

Timestamp: sql 發出的具體時間

Operation: sql 的類型,分為INSERT, UPDATE, START(set …),                COMMIT(commit), INTERNAL等

Session#: 發出該操作的 session 

需要強調一點的是,視圖v$logmnr_contents中的分析結果僅在我們運行過程'dbms_logmrn.start_logmnr'這個會話的生命期中存在。這是因為所有的LogMiner儲存都在PGA記憶體中,所有其他的進程是看不到它的,同時隨著進程的結束,分析結果也隨之消失。

最後,使用過程DBMS_LOGMNR.END_LOGMNR終止日誌分析事務,此時PGA記憶體地區被清除,分析結果也隨之不再存在。



11.結束分析

SQL> execute dbms_logmnr.end_logmnr; 【終止日誌分析事務,釋放記憶體】

一旦結束視圖v$logmnr_contents中的分析結果也隨之不再在。

三、與LogMiner相關的資料字典
1、v$loglist           它用於顯示曆史記錄檔的一些資訊
2、v$logmnr_dictionary 因logmnr可以有多個字典檔案,該視圖用於顯示這方 

面資訊。
3、v$logmnr_parameters 它用於顯示logmnr的參數
4、v$logmnr_logs       它用於顯示用於分析的日誌列表資訊。

 

四、相關參考檔案

http://blog.163.com/angel_yxf/blog/static/115569192008644112615/

http://www.itpub.net/forum.php?mod=viewthread&tid=1051633&highlight

http://dbua.iteye.com/blog/452398

http://blog.csdn.net/wzy126126/article/details/7323810

http://blog.sina.com.cn/s/blog_5e0fba9d0100ua8n.html

http://wenku.baidu.com/view/142b6f20dd36a32d73758193.html

 

操作版:

實際作業碼oracle9i

。遠程telnet TELNET 192.168.0.55    ROOT/密碼

本地CMD

1、登陸cmd

開始->運行->cmd

2、轉到對應應用程式

sqlplus /nolog

3、登陸資料庫

SQL>sys/密碼@資料庫 as sysdba;

4、建立DBMS_LOGMNR包和DBMS_LOGMNR_D包

SQL>/@ e:/oracle/ora92/rdbms/dbmslm.sql;

SQL>/@ e:/oracle/ora92/rdbms/dbmslmd.sql;

5、修改初始化參數UTL_FILE_DIR,指定分析資料的存放處

SQL>alter system set UTL_FILE_DIR=' e:/ oracle/logminer' scope=spfile;

6、重啟資料庫

SQL>shutdown immediate 

SQL>startup

7、建立資料字典檔案

SQL>execute dbms_logmnr_d.build(dictionary_filename =>'sqltrace.ora',dictionary_location =>' e:/ oracle/logminer');

8、建立日誌分析表

SQL>execute dbms_logmnr.add_logfile(options =>dbms_logmnr.new,logfilename =>' e:/ oracle/logminer/redo01.log ');

8.1添加用於分析的記錄檔

SQL>execute dbms_logmnr.add_logfile(options =>dbms_logmnr.addfile,logfilename=>' e:/ oracle/logminer/redo02.log’);

 

SQL>execute dbms_logmnr.add_logfile(options =>dbms_logmnr.addfile,logfilename =>’ e:/ oracle/logminer/redo03.log ');

9、啟動LogMiner進行分析

SQL>execute dbms_logmnr.start_logmnr(dictfilename =>' e:/ oracle/logminer/sqltrace.or

a',starttime =>to_date('20040625 09:00:00','yyyymmdd hh24:mi:ss'),endtime =>to_d

ate('20040625 22:00:00','yyyymmdd hh24:mi:ss'));

10、參看分析結果

SQL>select operation,sql_redo,sql_undo from v$logmnr_contents;

11、得到對應的DML動作陳述式

SQL>create table 表名 as select operation,sql_redo,sql_undo from v$logmnr_contents;

12、結束分析

SQL>execute dbms_logmnr.end_logmnr;

 

本地PL/SQL Developer之

Command Window

 

1、建立DBMS_LOGMNR包和DBMS_LOGMNR_D包

SQL>$ORACLE_HOME/rdbms/admin/dbmslm.sql;

SQL>$ORACLE_HOME/rdbms/admin/dbmslmd.sql;

2.修改初始化參數UTL_FILE_DIR,指定分析資料的存放處

SQL>alter system set UTL_FILE_DIR='/oracle/logminer' scope=spfile;

3.重啟資料庫

SQL>shutdown immediate;

SQL>startup

4.建立資料字典檔案

SQL>execute dbms_logmnr_d.build(dictionary_filename=>'dictionary.ora', dictionary_location =>'/oracle/logminer');

5.建立日誌分析表

SQL>execute dbms_logmnr.add_logfile(options =>dbms_logmnr.new,logfilename =>'/oracle/oradata/zxtwskp/REDO01.LOG');

6.添加用於分析的記錄檔

SQL>execute dbms_logmnr.add_logfile(options =>dbms_logmnr.addfile,logfilename=>'/oracle/oradata/zxtwskp/REDO02.LOG');

7.啟動LogMiner進行分析

SQL>execute dbms_logmnr.start_logmnr(dictfilename =>'/oracle/logminer/dictionary.ora',starttime =>to_date('20120302 17:00:00','yyyymmdd hh24:mi:ss'),endtime =>to_date('20120302 17:10:00','yyyymmdd hh24:mi:ss'));

8.參看分析結果

SQL>select sql_undo from v$logmnr_contents where username='BJWSKP' AND SEG_NAME='JDC_DM_CLZL1' and sql_undo like 'insert into%';

9.建立sql_undo語句

SQL>create table JDC_FPMX as select sql_undo from v$logmnr_contents where username='BJWSKP' AND SEG_NAME='JDC_DM_CLZL1' and sql_undo like 'insert into%';

9.1.處理資料;

處理需要複原的指令碼

9.2.命令執行需要複原的DML/DDL

 

10.結束分析

SQL>execute dbms_logmnr.end_logmnr;

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.