Chinaunix首页 | 论坛 | 博客
  • 博客访问: 65348
  • 博文数量: 24
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 215
  • 用 户 组: 普通用户
  • 注册时间: 2015-02-10 09:58
个人简介

专业提供linux应用软件开发、oracle数据库底层开发,服务器开发及相关技术支持服务

文章分类

全部博文(24)

文章存档

2015年(24)

我的朋友

分类: 数据库开发技术

2015-02-27 11:19:36

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

2 Redo logfile的结构

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

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

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

3 Redo logfile header

redo logfile头信息中主要记录了seqlow rbahigh rbascn等信息,用来区分该文件中包含了哪个时间段内的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 recordinstancethread编号

RBAredo byte address redo record的地址

LEN:该redo record的大小

SCN:产生该redo record时的SCN

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

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

对于blockclass,常见类别如下

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,
其中rundo 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开始)

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

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

1.生成一系列change vector.

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

3.更改数据快.

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

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

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

转自:
阅读(2061) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~