日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Oracle闪回原理-Logminer解读redo(r11笔记第17天)

發布時間:2025/3/18 编程问答 22 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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天)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。