分类: Oracle
2011-04-26 15:41:57
参考文档
<
<
<
<
<
<< dump命令的使用_20091207.doc>>
<<一个事务的整个流程,datafile,undo,redo的内容_20091208.doc>>
目录
1 redo log file overview
2 Redo logfile的结构
3 Redo logfile header
4 Redo record header
6相关views
7 Notes
1 redo log file overview
1.1 The primary function of the redo log is to record all changes made to data. The information in a redo log file is used only to recover the database from a system or media failure that prevents database data from being written to the datafiles.
1.2 Online redo log files are filled with redo records. A redo record, also called a redo entry, is made up of a group of change vectors, each of which is a description of a change made to a single block in the database. (一个change vectors描述一个block的变化,多个change vectors构成一个redo record,通过Dump命令可以看到详细)
For example, if you change a salary value in an employee table, you generate a redo record containing change vectors that describe changes to the data segment block for the table, the rollback segment data block, and the transaction table of the rollback segments.
1.3 Redo entries record data that you can use to reconstruct all changes made to the database, including the rollback segments. Therefore, the online redo log also protects rollback data. when you recover the database using redo data, Oracle reads the change vectors in the redo records and applies the changes to the relevant blocks.
1.4 Oracle properly applies redo log files in ascending order by using the log sequence number of necessary archived and online redo log files.(以升序的方式应用日志?假定有3,4,5日志要应用,从3开始应用)
1.5 Oracle的redo机制是一种逻辑和物理日志结合的机制,其内容包括:
DML语句导致的变更,但是不包括DML语句本身;
DDL语句导致的数据字典的变更,同时包含DDL语句本身;
递归语句导致的数据库变更
redo logfile是按顺序写入的文件,其块大小不同于数据块大小是有db_block_size参数设置的,而是在Oracle中固定的,和os相关,大部分os中都是512字节。
2 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中保存的具体信息。
3 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)
SQL>alter system set events 'immediate trace name redohdr level 10';
System altered.
4 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)
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 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开始)
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 record和undo record ?
当我们发出一个update语句的时候, Oracle会完成以下几步:
1.生成一系列change vector.
2.在redo buffer中保存这一系列change vector组成的redo record, redo record最终将被写入到redolog文件中.
3.更改数据快.
对于update语句,典型情况下会包含3个change vector.首先,为了保留before image以便undo,需要把数据块的before image放入rollback segment,放入到rollback segment时, oracle会在rollback segment的transaction表(是哪个表呢??与前面的transaction table同个问题)里插入一条记录保存了被修改的数据块的地址.由于这个transaction表本身也是存储在一个数据块里的,因此,这个操作本身也是对数据块的修改,因此,这个修改需要生成一个change vector.其次, oracle把改动的数据块写入到rollback segment的目标块也是一个数据块,因此,对该块也需要一个change vector.第三个change vector就是被修改的数据块本身了.这是一条redo record。
如果上述update语句刚好修改到了被索引的列,索引也会被修改,同样需要生成一个包含多个change vector的redo record.
commit会生成第三个redo record.因此,最简单的一个update+commit,会产生上面的三个redo record.