深入淺出-redo和undo記載02

dotaddjj發表於2011-12-20

Log_buffer中的redo entries的大小是以bytes為單位,LGWR還是以redo block size為單位把redo寫入磁碟,redo block sizeoracle原始碼固定的,跟作業系統有關,通常的作業系統都是以512bytes為單位。例如SolarisAIXWindowsLinux

可以從v$sysstat檢視得到redo bloc size

SQL> select value,name from v$sysstat where name in ('redo size','redo wastage','redo blocks written')

;

2 /

VALUE NAME

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

5065308 redo size

294736 redo wastage

10814 redo blocks written

其中的redo sizeredo資訊大小,redo wastage是浪費redo大小,redo blocks writtenlgwr寫出的redo block數量

SQL> select ceil(16+(5065308+294736)/10814) from dual;

CEIL(16+(5065308+294736)/10814

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

512

日誌檔案頭還佔用了16bytes

Log size可以從oracle內部資料字典獲得x$kccle

SQL> Select max(lebsz) from x$kccle;

MAX(LEBSZ)

----------

512

Linux還提供了dbfsize工具用於檢測block size大小

[oracle@localhost ~]$ dbfsize /opt/oracle/oradata/orcl/redo01.log

Database file: /opt/oracle/oradata/orcl/redo01.log

Database file type: file system

Database file size: 102400 512 byte blocks

[oracle@localhost ~]$ dbfsize /opt/oracle/oradata/orcl/system01.dbf

Database file: /opt/oracle/oradata/orcl/system01.dbf

Database file type: file system

Database file size: 61440 8192 byte blocks

可以看出日誌檔案block size512bytes,而資料檔案的block size8192bytes。此時我們還可以dump日誌檔案看看。

alter system dump logfile 'e:oracleproduct10.2.0oradatatestredo01.log';

獲取trace檔案的指令碼

select a.value||''||b.instance||'_ora_'||c.spid trace_name from

(select value from v$parameter a where a.name='background_dump_dest')a,

(select instance from v$thread)b,

(select spid from v$process x,v$session y,v$mystat z

where x.addr=y.paddr and y.sid=z.sid and z.statistic#=1)c

trace_name

E:ORACLEPRODUCT10.2.0ADMINTESTBDUMPtest_ora_5660

擷取redo的部分dump資訊

DUMP OF REDO FROM FILE 'e:oracleproduct10.2.0oradatatestredo01.log'

Opcodes *.*

RBAs: 0x000000.00000000.0000 thru 0xffffffff.ffffffff.ffff

SCNs: scn: 0x0000.00000000 thru scn: 0xffff.ffffffff

Times: creation thru eternity

FILE HEADER:

Compatibility Vsn = 169869568=0xa200100

Db ID=2059826143=0x7ac673df, Db Name='TEST'

Activation ID=2060847682=0x7ad60a42

Control Seq=8665=0x21d9, File size=102400=0x19000

File Number=1, Blksiz=512, File Type=2 LOG

descrip:"Thread 0001, Seq# 0000000139, SCN 0x0000005dac24-0xffffffffffff"

可以看出塊頭中記載了blksiz=512

以上對redo block size的分析思路均來自於eygle深入淺出書中記載。旨在加深對oracle的理解和探討思路。

這裡簡單說下熱備期間的redo產生量,前篇blog中說到可以利用v$mystatv$statname檢視來計算sql語句執行過程中產生的redo

熱備期間的redo

可以比較下在熱備期間與平常sql語句產生的redo量,由於利用oscp命令熱備資料檔案,在複製過程中以作業系統所在的block來複製,可能該資料檔案會有寫入過程,導致複製的檔案的database block中有部分os block來自寫入前,另一部分os block來自寫入後,此時就出現了所謂的分類塊split block,所以熱備期間oracle會在redo中額外記錄變化的資料塊的前映象,用於以後覆蓋備份的block完成恢復。當然對於os blockdatabase block大小完全一致則可以省略redo記錄變化資料塊的前映象過程(不過很少見),oracle利用隱含引數_log_blocks_during_backup控制redo是否記錄,預設為true記錄,false不記錄。不過利用rman備份可以透過反覆讀取獲得一致的block從而避免split block生成。

[@more@]

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

相關文章