首页 > 数据库 > Oracle > 深入浅出-redo和undo记载02
Log_buffer中的redo entries的大小是以bytes为单位,LGWR还是以redo block size为单位把redo写入磁盘,redo block size是oracle源代码固定的,跟操作系统有关,通常的操作系统都是以512bytes为单位。例如Solaris,AIX,Windows,Linux等
可以从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 size是redo信息大小,redo wastage是浪费redo大小,redo blocks written是lgwr写出的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 size是512bytes,而数据文件的block size是8192bytes。此时我们还可以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$mystat和v$statname视图来计算sql语句执行过程中产生的redo。
热备期间的redo
可以比较下在热备期间与平常sql语句产生的redo量,由于利用os的cp命令热备数据文件,在拷贝过程中以操作系统所在的block来拷贝,可能该数据文件会有写入过程,导致拷贝的文件的database block中有部分os block来自写入前,另一部分os block来自写入后,此时就出现了所谓的分类块split block,所以热备期间oracle会在redo中额外记录变化的数据块的前镜像,用于以后覆盖备份的block完成恢复。当然对于os block和database block大小完全一致则可以省略redo记录变化数据块的前镜像过程(不过很少见),oracle利用隐含参数_log_blocks_during_backup控制redo是否记录,缺省为true记录,false不记录。不过利用rman备份可以通过反复读取获得一致的block从而避免split block生成。
[@more@]来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/25362835/viewspace-1056906/ ,如需转载,请注明出处,否则将追究法律责任。