redologfile是按顺序写入的文件,其块大小不同于数据块大小是有db_block_size参数设置的,而是在Oracle中固定的,和os相关,大部分os中都是512字节。

2 Redologfile的结构

redologfiledata filecontrolfile一样,都有一个文件头信息。紧随文件头之后,是按照顺序写入的一个个redorecord。一个redo record记录的是一个原子操作的redo

redorecord的结构,则是由一个redo record头记录加上一个个changevector。一个change vector就是对一个block的一次修改的redo。一个原子操作可能包含对相关的几个block的修改,比如data blockundo blockundo headerblock等,所以包含了几条change vector

Oracle提供了dumpredo logfile的功能,可以看到redo file中保存的具体信息。

3Redo logfile header

redologfile头信息中主要记录了seqlow rbahighrbascn等信息,用来区分该文件中包含了哪个时间段内的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:产生该redorecordinstancethread编号

RBAredo byteaddress redo record的地址

LEN:该redorecord的大小

SCN:产生该redorecord时的SCN

其中,RBA10字节,包括三部分组成,记录的是redo record的起始地址。
RBA:0x0001d5.00000002.0010

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 vectorChange 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

对于blockclass,常见类别如下

1data block
2 sort block
3 deferred undo segment block
4 segment headerblock(table)
5 deferred undo segment header block
6 free list block
7extent map block
8 space management bitmap block
9 space management indexblock
10 unused
11+2r segment header for undo segment,
其中rundo segment的编号
12+2r data block for undo segmentr

而对于操作码,其layer code表示了操作的的类型,主要有

4块清除
5
事务管理,如commit/rollback
10
索引操作

11
行数据操作
13
段管理操作

14
区块管理操作
17
表空间管理操作
18
块映像(手工热备期间产生)
19
直接路径装载
20 Compatibility Segment
22
本地管理表空间操作
23block
写出
24DDL
语句

比较常见的操作码,比如

4.1块清除

5.1修改undo header中的事务信息
5.2
事务开始
5.4 commit
5.19
事务审计
5.20
子事务审计

10.2插入页块记录
10.3
清除页块记录
10.4
删除页块中的记录
10.5
还原页块日志
10.6
锁定索引块
10.7
提交时清除块中的操作码
10.8
初始化头部
10.9 ITL1
上应用XAT
10.10
设置页块指向下一个页块的指针

10.11
设置页块指向上一个页块的指针
10.12 root
块分裂后重新初始化
10.13
清空页块
10.15
分支块中插入记录
10.16
清除分支块中的记录
10.18
更新记录中的键值
10.19
清除分裂标志
10.21
撤销分支块操作
10.22
撤销页块操作
10.24
收缩ITL
10.30
更新非键值

10.31
创建/装载索引
10.34
清空页块

11.2插入一条数据
11.3
删除一条数据
11.4
锁定数据(select forupdate)
11.5
更新记录

11.6
行链接
11.9 cluster
键索引操作
11.10
设置cluster键指针
11.11
插入多条记录
11.12
删除多条记录

17.1end backup
18.1 begin backup

19.1直接路径装载(归档模式)
19.2nologging
设置

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 recordundo record ?

当我们发出一个update语句的时候, Oracle会完成以下几步:

1.生成一系列changevector.

2.redobuffer中保存这一系列change vector组成的redo record, redo record最终将被写入到redolog文件中.

3.更改数据快.

对于update语句,典型情况下会包含3change vector.首先,为了保留before image以便undo,需要把数据块的before image放入rollback segment,放入到rollbacksegment, oracle会在rollbacksegmenttransaction(是哪个表呢??与前面的transaction table同个问题)里插入一条记录保存了被修改的数据块的地址.由于这个transaction表本身也是存储在一个数据块里的,因此,这个操作本身也是对数据块的修改,因此,这个修改需要生成一个change vector.其次, oracle把改动的数据块写入到rollbacksegment的目标块也是一个数据块,因此,对该块也需要一个change vector.第三个change vector就是被修改的数据块本身了.这是一条redo record

如果上述update语句刚好修改到了被索引的列,索引也会被修改,同样需要生成一个包含多个change vectorredo record.

commit会生成第三个redorecord.因此,最简单的一个update+commit,会产生上面的三个redorecord.

转自:http://www.360doc.com/content/12/0105/11/8477600_177396315.shtml
09-02 07:04