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