ITPub博客

首页 > 数据库 > Oracle > 深入浅出-redo和undo记载02

深入浅出-redo和undo记载02

原创 Oracle 作者:dotaddjj 时间:2011-12-20 21:13:33 0 删除 编辑

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/ ,如需转载,请注明出处,否则将追究法律责任。

上一篇: 丢失redo的solution
请登录后发表评论 登录
全部评论
  • 博文量
    220
  • 访问量
    1662986