Oracle闪回原理-Logminer解读redo(r11笔记第17天)
說到閃回日志,我們都知道閃回日志中記錄的都是逆操作,那么就有兩個(gè)問題需要解釋了。
閃回日志和回滾段保存的數(shù)據(jù)有什么差別?
如果做了truncate操作,閃回日志是怎么記錄的,怎么能夠通過閃回恢復(fù)數(shù)據(jù)。
第一個(gè)問題是一個(gè)同學(xué)問的,第二個(gè)問題是我偶然想起來的,當(dāng)然這兩個(gè)問題還是蠻有意思。我們的目標(biāo)就是解釋清楚下面的兩個(gè)問題。
????當(dāng)然要深刻理解這個(gè)問題,一個(gè)重要的部分就是得先明白redo的基本情況。
借用大師Jonathan Lewis的話說,Oracle里面最重要的特性是在V6提出的改變向量,改變向量是描述數(shù)據(jù)塊變化的機(jī)制,是redo和undo的關(guān)鍵內(nèi)容。
????說實(shí)在話要深入解析,非常透徹的理解這部分內(nèi)容得花很多的時(shí)間,冰凍三尺絕非一日之寒,有一種較為快速的理解redo的基本流程,有兩種簡單的途徑,一種是通過dump logfile來得到,另外一種就是解析日志文件來得到。明白了redo里面的一些變化,再回過頭來看看閃回的部分,就會(huì)理解順暢許多。
閃回日志的部分和redo的部分相比有一些相似之處。redo的機(jī)制中有的,閃回的部分也有相應(yīng)的處理方式。
dump logfile其實(shí)輸出還是比較枯燥,晦澀難懂的,另外一種較為清晰的方式就是logminer了。
為了讓Logminer的日志處理信息更全面,還是建議打開supplemental log,這個(gè)在OGG中也有如出一轍的設(shè)置。
當(dāng)然解析工作這么繁瑣,我們想更加自如一些,那就和shell腳本聯(lián)系起來。
腳本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
使用如上的腳本,輸入對(duì)應(yīng)的redo日志就會(huì)解析出里面的內(nèi)容來。
要得到當(dāng)前的日志信息也很容易,寫個(gè)腳本,寫個(gè)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中直接調(diào)用即可,比如
sh showlog.sh /U01/app/oracle/oradata/newtest2/redo02.log我們使用如下的方式來做一個(gè)簡單的測試。創(chuàng)建一個(gè)表,插入1行數(shù)據(jù)。
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.
通過這種方式可以很容易讀到一些關(guān)鍵的日志信息。
最開始的幾個(gè)步驟可以很明顯看到deferred_segment_creation的痕跡,
然后可以看到在基表中插入了元數(shù)據(jù)信息,基本是按照seg$,tab$,seg$的方式插入數(shù)據(jù)的。
通過上面的步驟可以看到,最后的insert,對(duì)應(yīng)的undo_sql會(huì)基于ROWID來做一個(gè)反向的操作,即刪除1條記錄。
在這個(gè)基礎(chǔ)上去解析閃回日志,就有了一些基本的思路。
查看閃回日志的信息可以使用SQL
?select * from v$flashback_database_logfile;
解析閃回日志可以采用如下的方式:
alter system dump flashback logfile '/U01/app/oracle/fast_recovery_area/NEWTEST2/flashback/o1_mf_d2tp6v82_.flb' ;
或者基于對(duì)應(yīng)的dba的方式,也就是數(shù)據(jù)塊地址
?alter system dump flashback logfile '/U01/app/oracle/fast_recovery_area/NEWTEST2/flashback/o1_mf_d2tp6v82_.flb' ? dba 8 594285;
當(dāng)然解讀閃回日志發(fā)現(xiàn)比自己想得還要曲折一些,因?yàn)長ogminer還解析不了閃回日志,想更細(xì)節(jié)的解析還是要花一些功夫,所以上面的兩個(gè)問題還需要不斷的深入理解才可以回答清楚。
個(gè)人公眾號(hào)如下,歡迎掃碼關(guān)注。
總結(jié)
以上是生活随笔為你收集整理的Oracle闪回原理-Logminer解读redo(r11笔记第17天)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 20155203 - 杜可欣 - 预备作
- 下一篇: response生成图片验证码