分类: 数据库开发技术
2015-02-27 11:19:36
redo logfile是按顺序写入的文件,其块大小不同于数据块大小是有db_block_size参数设置的,而是在Oracle中固定的,和os相关,大部分os中都是512字节。
2 Redo logfile的结构 redo logfile和data file,control file一样,都有一个文件头信息。紧随文件头之后,是按照顺序写入的一个个redo record。一个redo record记录的是一个原子操作的redo。 redo record的结构,则是由一个redo record头记录加上一个个change vector。一个change vector就是对一个block的一次修改的redo。一个原子操作可能包含对相关的几个block的修改,比如data block,undo block,undo header block等,所以包含了几条change vector。 Oracle提供了dump redo logfile的功能,可以看到redo file中保存的具体信息。
3 Redo logfile header redo logfile头信息中主要记录了seq,low rba,high rba,scn等信息,用来区分该文件中包含了哪个时间段内的redo记录。另外还包括了当前实例中可用的所有redo logfile的一个链表,主要用于日志切换时找到下一个可用的redo logfile。 另外,前面说到的redo block size的大小在redo logfile header中也是有记录的,注意到Blksiz=512 redo logfile header也可以单独的dump出来(包括整个实例中可用的redo logfile header)
SQL>alter system set events 'immediate trace name redohdr level 10'; System altered.
4 Redo record header
redo record header中的信息比较简单,主要包括: Thread:产生该redo record的instance的thread编号 RBA:redo byte address redo record的地址 LEN:该redo record的大小 SCN:产生该redo record时的SCN
其中,RBA长10字节,包括三部分组成,记录的是redo record的起始地址。 log sequence号(0x1d5) redo logfile block编号(0x2) redo logfile block中的字节编号(0x10)
5 Change vector
Change vector包含哪些信息呢?基本上,它包含了来自于数据块的版本号,操作的类型以及数据块的地址.每个redo record是由多个change vector组成的. oracle在恢复过程中,会保证一个transaction要么被全部恢复,要么全部不恢复,实际上就是通过恢复redo record中的全部change vector来做到的,只要有一个change vector恢复失败,这个redo record的所有change vector都将失败.
change vector保存的是对单个block的修改记录,这些block可以是: 数据块data block 回滚块undo block 数据段头块data segment header block 回滚段头块undo header block 每次修改cache buffer中的这些block时,需要先在PGA中生成对应的change vector。Change vector的结构,包含一个头信息,和一组修改记录的长度加上修改的值信息。 change vector header主要包括: change #n同一个redo record中的change vector的编号 TYP变更类型 CLS本次修改对应的block的类别,等于x$bh.class AFN绝对文件号 DBA本次修改对应的block的地址 SCN修改时的SCN SEQ同一个SCN的不同修改以seq编号 OP操作码,由两部分组成,layer code. sub code
对于block的class,常见类别如下
1
data block
而对于操作码,其layer code表示了操作的的类型,主要有
4块清除
比较常见的操作码,比如 4.1块清除
5.1修改undo header中的事务信息
10.2插入页块记录
11.2插入一条数据
17.1
end backup
19.1直接路径装载(归档模式) 23.1 dbwr写出block(9.0.1开始)
6相关views
V$log V$logfile V$log_history 查看redo log状态: idle> select a.group#,a.status, b.member from v$log a, v$logfile b where a.group# = b.group#;
GROUP# STATUS ---------- ---------------- MEMBER ---------------------------------------------------------------------------------------------------- 1 INACTIVE /u01/app/oracle/oradata/mydb/redo01.log
2 INACTIVE /u01/app/oracle/oradata/mydb/redo02.log
3 CURRENT /u01/app/oracle/oradata/mydb/redo03.log
7 Notes 1) What is transaction table?
2) Oracle如何应用redo?哪个进程做的,SMON?过程怎么样的,checkpoint position
3)如何来跟踪一个事务产生undo/redo的过程? 参考<<一个事务的整个流程,datafile,undo,redo的内容_ 20091208.doc>>
4)一个update语句会产生多少个redo record和undo record ?
当我们发出一个update语句的时候, Oracle会完成以下几步: 1.生成一系列change vector. 2.在redo buffer中保存这一系列change vector组成的redo record, redo record最终将被写入到redolog文件中. 3.更改数据快.
对于update语句,典型情况下会包含3个change vector.首先,为了保留before image以便undo,需要把数据块的before image放入rollback segment,放入到rollback segment时, oracle会在rollback segment的transaction表(是哪个表呢??与前面的transaction table同个问题)里插入一条记录保存了被修改的数据块的地址.由于这个transaction表本身也是存储在一个数据块里的,因此,这个操作本身也是对数据块的修改,因此,这个修改需要生成一个change vector.其次, oracle把改动的数据块写入到rollback segment的目标块也是一个数据块,因此,对该块也需要一个change vector.第三个change vector就是被修改的数据块本身了.这是一条redo record。 如果上述update语句刚好修改到了被索引的列,索引也会被修改,同样需要生成一个包含多个change vector的redo record. commit会生成第三个redo record.因此,最简单的一个update+commit,会产生上面的三个redo record. |