redo internal

一、什么是redo

redo log记录了数据库所有变更的历史记录,在对数据库做任何的修改之前,都必须先生成redo,在将任何脏数据库写入datafile之前,都必须保证该脏数据库对应的redo已经写入到redo log file中。一个事务commit的时候,必须保证该事务中产生的所有redo都已经写入到redo log file中。

Oracle的redo机制是一种逻辑和物理日志结合的机制,其内容包括:

  • DML语句导致的数据库变更,但是不包括DML语句本身;
  • DDL语句导致的数据字典的变更,同时包含DDL语句本身(?);
  • 递归语句导致的数据库变更

redo logfile是按顺序写入的文件,其块大小不同于数据块大小是有db_block_size参数设置的,而是在Oracle源代码中固定的,和os相关,大部分os中都是512字节。例如,在windows xp32上

SYS@ning>select * from v$version;

BANNER
----------------------------------------------------------------
Oracle Database 10g Enterprise Edition Release 10.2.0.3.0 - Prod
PL/SQL Release 10.2.0.3.0 - Production
CORE 10.2.0.3.0 Production
TNS for 32-bit Windows: Version 10.2.0.3.0 - Production
NLSRTL Version 10.2.0.3.0 - Production

SYS@ning>select max(lebsz) from x$kccle;

MAX(LEBSZ)
----------
512

二、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中保存的具体信息。

SYS@ning>alter system dump logfile '+DG1/ning/redo04.log';

System altered.

找到对应的trace文件,可以看到redo logfile头信息
DUMP OF REDO FROM FILE '+DG1/ning/redo04.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 = 169870080=0xa200300
Db ID=1205950522=0x47e1583a, Db Name='NING'
Activation ID=1205955130=0x47e16a3a
Control Seq=1829=0x725, File size=10240=0x2800
File Number=4, Blksiz=512, File Type=2 LOG
descrip:"Thread 0001, Seq# 0000000469, SCN 0x00000010fc70-0xffffffffffff"
thread: 1 nab: 0xffffffff seq: 0x000001d5 hws: 0x1 eot: 1 dis: 0
resetlogs count: 0x24d574fa scn: 0x0000.00000001 (1)
resetlogs terminal rcv count: 0x0 scn: 0x0000.00000000
prev resetlogs count: 0x0 scn: 0x0000.00000000
prev resetlogs terminal rcv count: 0x0 scn: 0x0000.00000000
Low scn: 0x0000.0010fc70 (1113200) 04/25/2007 16:09:43
Next scn: 0xffff.ffffffff 01/01/1988 00:00:00
Enabled scn: 0x0000.00000001 (1) 03/23/2007 10:01:33
Thread closed scn: 0x0000.0010fc70 (1113200) 04/25/2007 16:09:43
Disk cksum: 0x661f Calc cksum: 0x661f
Terminal recovery stop scn: 0x0000.00000000
Terminal recovery 01/01/1988 00:00:00
Most recent redo scn: 0x0000.00000000
Largest LWN: 0 blocks
End-of-redo stream : No
Unprotected mode
Miscellaneous flags: 0x0
Thread internal enable indicator: thr: 0, seq: 0 scn: 0x0000.00000000

紧接着就是第一条redo record,首先是redo record头记录

REDO RECORD - Thread:1 RBA: 0x0001d5.00000002.0010 LEN: 0x1698 VLD: 0x05
SCN: 0x0000.0010fc70 SUBSCN: 1 04/25/2007 16:09:48

redo redord头记录后面是change vector(由于篇幅的原因,中间省略若干信息)
CHANGE #1 TYP:0 CLS:20 AFN:2 DBA:0x00800021 OBJ:4294967295 SCN:0x0000.0010fc6e SEQ: 4 OP:5.1
ktudb redo: siz: 176 spc: 3904 flg: 0x0022 seq: 0x00ce rec: 0x1e
xid: 0x0002.021.00000153
ktubu redo: slt: 33 rci: 29 opc: 11.1 objn: 12017 objd: 12017 tsn: 0
Undo type: Regular undo Undo type: Last buffer split: No
Tablespace Undo: No
0x00000000
KDO undo record:
KTB Redo
op: 0x02 ver: 0x01
op: C uba: 0x00800021.00ce.1d
KDO Op code: QMD row dependencies Disabled
xtype: XA flags: 0x00000000 bdba: 0x00407974 hdba: 0x004075d9
itli: 1 ispac: 0 maxfr: 4863
tabn: 0 lock: 0 nrow: 55
slot[0]: 21
slot[1]: 22
...
slot[52]: 73
slot[53]: 74
slot[54]: 75

三、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)

SYS@ning>alter system set events 'immediate trace name redohdr level 10';

System altered.

四、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的起始地址。
如RBA: 0x0001d5.00000002.0010

  • log sequence号(0x1d5)
  • redo logfile block编号(0x2)
  • redo logfile block中的字节编号(0x10)

五、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
2 sort block
3 deferred undo segment block
4 segment header block(table)
5 deferred undo segment header block
6 free list block
7 extent map block
8 space management bitmap block
9 space management index block
10 unused
11+2r segment header for undo segment, 其中r为undo segment 的编号
12+2r data block for undo segment r

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

4 块清除
5 事务管理,如commit/rollback
10 索引操作
11 行数据操作
13 段管理操作
14 区块管理操作
17 表空间管理操作
18 块映像(手工热备期间产生)
19 直接路径装载
20 Compatibility Segment
22 本地管理表空间操作
23 block写出
24 DDL语句

比较常见的操作码,比如

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 for update)
11.5 更新记录
11.6 行链接
11.9 cluster键索引操作
11.10 设置cluster键指针
11.11 插入多条记录
11.12 删除多条记录

17.1 end backup
18.1 begin backup

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

23.1 dbwr写出block(9.0.1开始)

六、如何dump logfile

前面使用了语句来dump logfile和logfile header

实际上,不一定需要每次都dump整个logfile,这样会导致trace文件中包含太多的信息,可以通过指定dba/rba/lay code来dump指定范围的redo log

1.dump指定范围内的数据块相关的redo

alter system dump logfile 'path'
dba min file# block#
dba max file# block#

2.dump指定rba范围的redo

alter system dump logfile 'path'
rba min logfile# sequence#
rba max logfile# sequence#

3.dump指定layer code或者sub code(可选)的redo

alter system dump logfile 'path'
layer n
opcode n

4.dump指定SCN范围的redo

alter system dump logfile 'path'
scn min minscn#
scn max maxscn#

5.dump指定时间范围内的redo

alter system dump logfile 'path'
time min value
time max value

注意这里的时间格式从某个时刻起的秒数,不是通常习惯的年/月/日的格式,所以这种方式不太好用,还是使用scn替代比较好^_^


参考:

http://julian.dyke.users.btopenworld.com/com/Presentations/RedoInternals.ppt

Metanlink: 1031381.6

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/193161/viewspace-50338/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/193161/viewspace-50338/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值