3.2 Redo组成结构
Oracle Redo由两部分组成:
日志头(Redo Header):记录Redo的基本概要信息;
日志记录(Redo Record):记录数据库的详细更改。
3.2.1 Redo Header
Redo Header主要记录了Redo基本概要信息,例如数据库名称、控制文件序列号及日志Thread号等信息,如下所示:
3.2.2 Redo Record
日志记录(Redo Record)又被称为日志记录条目,记录了原子级的数据库更改操作。Redo Record由日志记录头(Redo Record Header)、更改矢量(Change Vector)两部分组成。
- Redo Record Header
Redo Record Header位于每个Redo Record头部,记录了Redo Record信息概要,如下所示:
- Change Vector
Redo Record包含一到多个更改矢量。一个Change Vector记录了一个数据块的一次更改。Change Vector由更改矢量头(Change Vector Header)、更改矢量主体结构(Change Vector Body)两部分组成。
(1)Change Vector Header
Change Vector Header结构如下:
其中:
CLS为Block类型,与x$bh.class保持一致。例如示例中的CLS为1,表示数据块的操作。
OP表示数据库操作码,用于记录数据库的操作类型。OP主要特点:
数据库的任何更改操作(OP)都会被记录在Redo中;
数据库更改操作(OP)包含Layer Code和Sub Code,中间使用“.”分开。例如OP(11.2)表示单行插入操作;
Oracle包含多种类型的更改操作(OP)。
Oracle主要的Layer Code如表3-1所示。
Layer Code不同使得Sub Code代表的操作也不一样,我们以常见的索引操作(OP:10)和行操作(OP:11)为例,介绍Sub Code的具体含义。
1)索引操作的Sub Code,如表3-2所示。
2)行操作Sub Code,如表3-3所示。
通过表3-3可以看到,示例中的OP(11.5)代表行更新操作。
Oracle Change Vector包含了多种类型的OP,记录了数据库的所有(类型)更改。
(2)Change Vector Body
Change Vector Body详细描述了数据库块级的更改信息,如下所示:
有关Redo结构的详细介绍,请参考7.1.3节。
(3)Change Vector 与 ITL
Change Vector与事务槽(ITL)的关系如下:
当事务开始时,系统在回滚段头的事务表中分配一个ITL事务槽,在Change Vector中以OP(5.2)表明事务开始;
当事务提交后,Change Vector中以OP(5.4)代表事务结束;
事务XID(Transaction ID)用于唯一标识事务;
UBA(Undo Block Address)记录了事务相关的Undo Record的存储位置;
ITL为XID与UBA组合,描述了事务的详细信息,关系如下所示:
ITL=XID+UBA
其中:
XID组成结构:
USN(Undo Segment Number):事务所在的Undo Segment ID;
TX TABLE SLOT(Undo Segment Header Transaction Table Slot):回滚段头事务表中的事务Slot号;
WRAP(Sequence Number):事务序列号。
UBA组成结构:
Undo Block DBA(Data Block Address):事务相关的Undo Block物理地址;
Sequence Number:Undo Block中的序列号;
Record Number:Undo Block中的记录索引号(Rec#)。
可以通过以下Dump示例查证Change Vector中的事务槽(ITL)。
1)Change Vector中的事务:
其中:OP(5.2)代表事务开始。
2)Change Vector中的ITL:
事务与ITL的详细介绍,请参考4.1.3节。