Oracle闪回原理-Logminer解读redo(r11笔记第17天)
說到閃回日志,我們都知道閃回日志中記錄的都是逆操作,那么就有兩個問題需要解釋了。
閃回日志和回滾段保存的數據有什么差別?
如果做了truncate操作,閃回日志是怎么記錄的,怎么能夠通過閃回恢復數據。
第一個問題是一個同學問的,第二個問題是我偶然想起來的,當然這兩個問題還是蠻有意思。我們的目標就是解釋清楚下面的兩個問題。
????當然要深刻理解這個問題,一個重要的部分就是得先明白redo的基本情況。
借用大師Jonathan Lewis的話說,Oracle里面最重要的特性是在V6提出的改變向量,改變向量是描述數據塊變化的機制,是redo和undo的關鍵內容。
????說實在話要深入解析,非常透徹的理解這部分內容得花很多的時間,冰凍三尺絕非一日之寒,有一種較為快速的理解redo的基本流程,有兩種簡單的途徑,一種是通過dump logfile來得到,另外一種就是解析日志文件來得到。明白了redo里面的一些變化,再回過頭來看看閃回的部分,就會理解順暢許多。
閃回日志的部分和redo的部分相比有一些相似之處。redo的機制中有的,閃回的部分也有相應的處理方式。
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.
通過這種方式可以很容易讀到一些關鍵的日志信息。
最開始的幾個步驟可以很明顯看到deferred_segment_creation的痕跡,
然后可以看到在基表中插入了元數據信息,基本是按照seg$,tab$,seg$的方式插入數據的。
通過上面的步驟可以看到,最后的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天)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 20155203 - 杜可欣 - 预备作
- 下一篇: response生成图片验证码