Oracle閃回原理-Logminer解讀redo(r11筆記第17天)

jeanron100發表於2016-12-18

說到閃回日誌,我們都知道閃回日誌中記錄的都是逆操作,那麼就有兩個問題需要解釋了。

閃回日誌和回滾段儲存的資料有什麼差別?

如果做了truncate操作,閃回日誌是怎麼記錄的,怎麼能夠透過閃回恢復資料。

第一個問題是一個同學問的,第二個問題是我偶然想起來的,當然這兩個問題還是蠻有意思。我們的目標就是解釋清楚下面的兩個問題。

    當然要深刻理解這個問題,一個重要的部分就是得先明白redo的基本情況。

借用大師Jonathan Lewis的話說,Oracle裡面最重要的特性是在V6提出的改變向量,改變向量是描述資料塊變化的機制,是redo和undo的關鍵內容。

    說實在話要深入解析,非常透徹的理解這部分內容得花很多的時間,冰凍三尺絕非一日之寒,有一種較為快速的理解redo的基本流程,有兩種簡單的途徑,一種是透過dump logfile來得到,另外一種就是解析日誌檔案來得到。明白了redo裡面的一些變化,再回過頭來看看閃回的部分,就會理解順暢許多。

閃回日誌的部分和redo的部分相比有一些相似之處。redo的機制中有的,閃回的部分也有相應的處理方式。

Oracle閃回原理-Logminer解讀redo(r11筆記第17天)
dump logfile其實輸出還是比較枯燥,晦澀難懂的,另外一種較為清晰的方式就是logminer了。

為了讓Logminer的日誌處理資訊更全面,還是建議開啟supplemental log,這個在OGG中也有如出一轍的設定。

當然解析工作這麼繁瑣,我們想更加自如一些,那就和shell指令碼聯絡起來。

指令碼1:

sqlplus -s / as sysdba <<EOF
execute dbms_logmnr.add_logfile(logfilename=>'$1',options=>dbms_logmnr.new);
execute dbms_logmnr.start_logmnr(options=>dbms_logmnr.dict_from_online_catalog);
alter session set nls_date_format='yyyy-mm-dd hh24:mi:ss';
col xid_scn format a30
col username format a10
col timestamp format a20
col sql_redo format a35
col sql_undo format a35
set pages 1500
set linesize 200
select username,xid||':'||scn xid_scn,timestamp,sql_redo,sql_undo from v\$logmnr_contents where  sql_redo not like '%AUD$%';
execute dbms_logmnr.end_logmnr;
EOF

使用如上的指令碼,輸入對應的redo日誌就會解析出裡面的內容來。

要得到當前的日誌資訊也很容易,寫個指令碼,寫個SQL分分鐘搞定。

指令碼2:

sqlplus -s / as sysdba <<EOF
set linesize 150
col member format a50
select l.sequence#,l.status ,l.bytes/1024/1024 size_MB,f.member from v\$log l ,v\$logfile f  where l.group#=f.group#;
EOF

指令碼1中直接呼叫即可,比如

sh showlog.sh /U01/app/oracle/oradata/newtest2/redo02.log我們使用如下的方式來做一個簡單的測試。建立一個表,插入1行資料。

SQL> create table test_log (id number,name varchar2(30));
Table created.
SQL> insert into test_log values(100,'aaa');
1 row created.
SQL> commit;
Commit complete.

透過這種方式可以很容易讀到一些關鍵的日誌資訊。

Oracle閃回原理-Logminer解讀redo(r11筆記第17天)
最開始的幾個步驟可以很明顯看到deferred_segment_creation的痕跡,

Oracle閃回原理-Logminer解讀redo(r11筆記第17天)
然後可以看到在基表中插入了後設資料資訊,基本是按照seg$,tab$,seg$的方式插入資料的。

Oracle閃回原理-Logminer解讀redo(r11筆記第17天)
透過上面的步驟可以看到,最後的insert,對應的undo_sql會基於ROWID來做一個反向的操作,即刪除1條記錄。

在這個基礎上去解析閃回日誌,就有了一些基本的思路。

檢視閃回日誌的資訊可以使用SQL

 select * from v$flashback_database_logfile;

解析閃回日誌可以採用如下的方式:

alter system dump flashback logfile '/U01/app/oracle/fast_recovery_area/NEWTEST2/flashback/o1_mf_d2tp6v82_.flb' ;

或者基於對應的dba的方式,也就是資料塊地址

 alter system dump flashback logfile '/U01/app/oracle/fast_recovery_area/NEWTEST2/flashback/o1_mf_d2tp6v82_.flb'   dba 8 594285;

當然解讀閃回日誌發現比自己想得還要曲折一些,因為Logminer還解析不了閃回日誌,想更細節的解析還是要花一些功夫,所以上面的兩個問題還需要不斷的深入理解才可以回答清楚。



個人公眾號如下,歡迎掃碼關注。

Oracle閃回原理-Logminer解讀redo(r11筆記第17天)



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

相關文章