Skip to content

未分类 - 3. page

1.检查点概念–chkpoint
检查点是一个数据库事件,存在的意义在于减少崩溃恢复crash recovery时间.
检查点事件由后台进程CKPT触发,当检查点发生时,CKPT通知DBWR进程将脏数据库dirtybuffer写出到数据文件上,更新数据文件头及控制文件上的检查点信息。
数据文件头的SCN是CHECKPOINT SCN.

检查点工作原理:
在数据库中,进行数据修改时,需要先将数据读和内存中buffer cache,修改数据同时,ORACLE会记录重做redo信息用于恢复,有了重做日志信息存在,ORACLE不需要在事务提交时commit立刻将变化的数据写回磁盘,因为立刻写效率会低。重做信息存在也为数据崩溃后,数据可以恢复。如断电,内存中修改过未写入数据文件的数据丢失,下一次数据库启动时,可以通过重做日志进行事务重演(不管是否提交),即前滚。将数据库恢复至崩溃前状态,然后数据库可以打开提供使用,之后ORACLE将未提交的事务回滚。
检查点存在是为了缩短上述数据恢复的时间。
当检查点发生时,此时的SCN称为checkpoint scn,ORACLE会通知DBWR,把修改过的数据,即此checkpoint scn之前的脏数据dirty data从buffer cache写入磁盘,写入完成后,CKPT进程会相应更新控制文件和数据文件头,记录此检查点信息,标识变更。
检查点完成后,此检查点之前修改过后 数据都已经写出到数据文件,重做日志中的相应重做记录对于实例恢复已经无用(物理恢复有用)。
######################################################################
2.增量检查点概念 incremental checkpoint 及CKPTQ,FILEQ
检查点队列,checkpoint queue,CKPTQ;
在数据库内部,每个脏数据块会被记录到检查点队列,按LRBA(LOW RBA 第一次修改数据块对应的redo block address,后面修改的RBA称为HRBA)顺序排列,如果一个数据块多次修改,该数据块在检查点队列上顺序不变化。
非脏块的buffer header中的CKPTQ信息为空。
执行增量检查点时,DBWR从检查点队列按照LOW RBA顺序写出,先修改的数据可以被按优先顺序写出,实例检查点因此可以不被增进。
同时CKPT进程阶段性使用轻量级控制文件更新协议将当前最低RBA写入控制文件,CKPT在进行轻量级更新时,不改写控制文件中数据文件中检查点信息以及数据文件头信息,只记录控制文件检查点SCN,controlfile checkpointed at scn 并根据增量检查点写出增进RBA信息。
通过增量检查点,数据库可以将全部写出改为增量渐进写出,从而极大减少对于数据库性能的影响, 而检查点队列进一步将RBA和检查点关联起来,从而可以通过检查点确定恢复的起点。
与CKPTQ相关的是:文件检查点队列 file queue FILEQ与对象队列Obj-Q
文件检查点提高了表空间检查点TABLESPACE CHECKPOINT的性能,每个dirty buffer同时链接到CKPTQ和FILEQ,CKPTQ包含实例所有需要执行检查点的BUFFER,FILEQ包含属于特定文件需要执行检查点的BUFFER,每个文件都包含一个文件队列,在执行表空间检查点请求时使用FILEQ。–表空间OFFLINE会触发表空间检查点。

3.CKPT进程在增量检查点中的作用:
CKPT进程监控着检查点队列的长度,当检查点队列长度达到一定限制时,CKPT会通知DBWR写脏块
CKPT会根据参数的设置和I/O的速度以及繁忙程度,计算出来一个Target rba(目标rba),DBWR会沿着检查点队列,将所有Target rba之前的脏块刷新到磁盘.当CKPT通知完DBWR Target rba后,CKPT的任务就结束了.并不会等待DBWR写完所有的Target rba之前的脏块.

通知DBWR写脏块,这是CKPT的任务之一,CKPT另一个任务,就是每3秒,检测一次DBWR的写进度.
检查点队列最前面的块被称为检查点位置.DBWR是沿着检查点队列写脏块的,CKPT每3秒钟查看一下DBWR沿检查点队列写到了哪里,并且将这个位置设置为检查点位置.也就是说检查点位置之前的块,都是已被DBWR刷新到磁盘上的块.
这个3秒一次检查DBWR进度的工作,也是CKPT的一个重要的任务.CKPT每3秒一次将检查点位置记录进控制文件,当然同时被记录进控制文件的还有’心跳’等其他信息.

CKPT每3秒一次的工作和CKPT定期触发DBWR,这两项操作合一起被称为–增量检查点.

4.dbwr 写CKPTQ上脏块的方式:
在检查点队列中,脏块根据按LRBA顺序排列,DBWR每到一定的时机,被触发。
硬件能力、脏块数、Redo数三个指标,是DBWR是否写脏块的依据。
DBWR什么时候(多久)判断一次这三个值标: 3s
也就是:DBWR 3秒醒来,依据三个指标判断是否触发—— “增量检查点写”

5.fast_start_mttr_target与增量检查点
一、关于FAST_START_MTTR_TARGET概念: –此段百度哈哈
是一个加快实例恢复的参数,我们可以根据服务级别来定义一个合理的、可接受的值,该值的单位为秒。比如设定为60s,即2分钟。
假定该值处于合理的情况之下,则一旦实例崩溃,在60s以内实例应当能够被恢复。合理即是该值不能太大,也不能太小。太大则实例恢复所需的时间较长,太小则导致大量数据的及时写入,增加了系统的I/O。
影响实例恢复时间长短的主要因素即是从最近检查点位置到联机重做日志尾部之间的距离。距离越长则所需要的cache recovery 和undo、redo的时间越长。所以如何有效的缩短最近检查点位置与联机重做日志尾部之间的距离,这正是FAST_START_MTTR_TARGET的目的。

关于检查点的触发条件有很多,比如日志切换、数据库shutdown、开始结束备份表空间等。检查点的分类也很多,比如完全检查点、部分检查点、增量检查点等。
FAST_START_MTTR_TARGET的值实际上也是触发检查点的一个触发条件。当内存中产生的dirty buffer所需的恢复时间(estimated_mttr)如果到达FAST_START_MTTR_TARGET的指定时间,则检查点进程被触发。检查点进程一旦被触发,将通知DBWn进程将按检查点队列顺序将脏数据写入到数据文件,从而缩短了最后检查点位置与联机重做日志间的距离,减少了实例恢复所需的时间。

二、FAST_START_MTTR_TARGET参数的设置
9i之后(包括9i):fast_start_mttr_target:以实例恢复时间为单位(硬件能力、脏块数、Redo数)
10G之后,fast_start_mttr_target默认值为0,即开启自调节检查点:self tune checkpoint ,自调节检查点的受影响因素有:硬件能力、脏块数、Redo数
自调节检查点对应隐含参数:_disable_selftune_checkpointing:
_disable_selftune_checkpointing Disable self-tune checkpointing FALSE
SYS@ bys3>show parameter statistics_level –此参数为typical 或者all,再加上FAST_START_MTTR_TARGET 设置为非零值就启用MTTR Advisory

NAME TYPE VALUE
———————————— ———– ——————————
statistics_level string TYPICAL
SYS@ bys3>show parameter mttr
NAME TYPE VALUE
———————————— ———– ——————————
fast_start_mttr_target integer 0
从alert日志中数据库启动时的信息可以发现:
[oracle@bys3 ~]$ cat alert_bys3.log |grep MTTR
MTTR advisory is disabled because FAST_START_MTTR_TARGET is not set

显式的设置alter system set FAST_START_MTTR_TARGET=0会关闭自动调节,重启数据库在alter日志中可以发现:
MTTR advisory is disabled because FAST_START_MTTR_TARGET is not set

当FAST_START_MTTR_TARGET显示设为非零
SYS@ bys3>alter system set fast_start_mttr_target=25;
即: statistics_level参数为typical 或者all,再加上FAST_START_MTTR_TARGET 设置为非零值就启用MTTR Advisory
此时alert日志中不会有MTTR信息–因为已经正常启动MTTR Advisory

三、关于启动MTTR Advisory时v$instance_recovery;视图的使用: –未开启MTTR Advisory时此视图内容为空。
SYS@ bys3>select mttr_target_for_estimate ,dirty_limit,estd_cache_writes ,estd_cache_write_factor ,estd_total_writes ,estd_total_write_factor from v$mttr_target_advice;
MTTR_TARGET_FOR_ESTIMATE DIRTY_LIMIT ESTD_CACHE_WRITES ESTD_CACHE_WRITE_FACTOR ESTD_TOTAL_WRITES ESTD_TOTAL_WRITE_FACTOR
———————— ———– —————– ———————– —————– ———————–
18 1067 57 1 806 1
17 1000 57 1 806 1
19 1268 57 1 806 1
20 1507 57 1 806 1
SYS@ bys3>select target_mttr,estimated_mttr from v$instance_recovery;
TARGET_MTTR ESTIMATED_MTTR
———– ————–
20 12
–mttr_target_for_estimate有一个值为的最接近设定的目标时间20,以及由系统计算出的的target_mttr时间20
–同时也给出了几组不同的mttr_target值及dirty_limit,cache_write,io 等来供选择,设定合适的mttr值

buffer cache实验4-ckptq的工作机制与增量检查点及fast_start_mttr_target参数

Buffer Header结构图及简介
图1:


buffer header:每一个数据块在被读入buffer cache时,都会先在buffer cache中构造一个buffer header,buffer header与数据块一一对应。buffer header包含的主要信息有:
1) 该数据块在buffer cache中实际的内存地址。就是上图中的虚线箭头所表示的意思。
2) 该数据块的类型,包括data、segment header、undo header、undo block等等。
3) 该buffer header所在的hash chain,是通过在buffer header里保存指向前一个buffer header的指针和指向后一个buffer header的指针的方式实现的。
4) 该buffer header所在的LRU、LRUW、CKPTQ等链表(这些链表我们后面都会详细说明)。也是通过记录前后buffer header指针的方式实现。
5) 当前该buffer header所对应的数据块的状态以及标记。
6) 该buffer header被访问(touch)的次数。
7) 正在等待该buffer header的进程列表(waiter list)和正在使用该buffer header的进程列表(user list)。
DUMP 指定的BUFFER BLOCK–含BH方法如下: –数据库版本:11.2.0.4
–补充下,如果是要DUMP整个BUFFER CACHE,可以参考:http://blog.csdn.net/haibusuanyun/article/details/17439845

BYS@ bys3>select dept.*,dbms_rowid.rowid_object(rowid) object#,dbms_rowid.rowid_relative_fno(rowid) file#,dbms_rowid.rowid_block_number(rowid) block#,dbms_rowid.rowid_row_number(rowid) row# from dept;
DEPTNO DNAME LOC OBJECT# FILE# BLOCK# ROW#
———- ————– ————- ———- ———- ———- ———-
10 ACCOUNTING NEW YORK 22327 4 251 0
20 RESEARCH DALLAS 22327 4 251 1
40 OPERATIONS BOSTON 22327 4 251 2
99 chedan bj 22327 4 251 3
BYS@ bys3>select dbms_utility.make_data_block_address(4,251) from dual;
DBMS_UTILITY.MAKE_DATA_BLOCK_ADDRESS(4,251)
——————————————-
16777467

alter session set events ‘immediate trace name set_tsn_p1 level 5’;
alter session set events ‘immediate trace name buffer level 16777467’;
select value from v$diag_info where name like ‘De%’;

select * from x$bh where DBARFIL=4 and DBABLK=251; 用SYS用户从X$BH查看相应信息对照DUMP文件查看。
#########################################################
解读Buffer Header –结合X$BH
说明:DUMP BUFFER中一个块方法就是上一步的,可以先从多个会话对此块进行查询或DML之类,然后DUMP此块。下面的两段BH的内容是不是从同一个DUMP生成的文件中截取的已经记不清了。这里只是介绍了DUMP文件的BH中各个字段的意义,对已经知道的BH中各个字段与X$BH,V$BH中字段的对应也有写上。关于X$BH中字段,可以参考: X$BH中各字段意义
而对于像:什么情况下 lru-flags: hot_buffer或lru-flags: moved_to_tail,什么情况下st: CR或 st: XCURRENT,暂不在本文讨论范围了!
后面尽量按照DUMP的BH中一句一句的顺序进行解读,但是因为ru-flags: flags: obj-flags:这种并不在每一次DUMP中出现,所以这一块内容汇总在一起了–注意我下面的ru-flags: flags: obj-flags:等在下面贴出来的两个BH中可能没出现,是从其它DUMP文件中贴过来的。
最后,这方面参考资料较少,难免有疏漏之处,欢迎补充、指错!!
######
Dump of buffer cache at level 10 for tsn=4 rdba=16777467
1. BH (0x213e6ad0) file#: 4 rdba: 0x010000fb (4/251) class: 1 ba: 0x210b0000
2. set: 3 pool: 3 bsz: 8192 bsi: 0 sflg: 1 pwc: 0,0
3. dbwrid: 0 obj: 22327 objn: 22327 tsn: 4 afn: 4 hint: f
4. hash: [0x2bbfddf4,0x213e7680] lru: [0x213e76b0,0x22ff07ec]
5. lru-flags: moved_to_tail
6. ckptq: [NULL] fileq: [NULL] objq: [NULL] objaq: [NULL]
7. st: CR md: NULL fpin: ‘kdswh11: kdst_fetch’ tch: 1
8. cr: [scn: 0x0.3a9dcc],[xid: 0x0.0.0],[uba: 0x0.0.0],[cls: 0x0.3a9dcc],[sfl: 0x0],[lc: 0x0.359e7e]
9. flags: only_sequential_access
10. buffer tsn: 4 rdba: 0x010000fb (4/251)
11. scn: 0x0000.00359e7e seq: 0x01 flg: 0x04 tail: 0x9e7e0601
12. frmt: 0x02 chkval: 0x8cd6 type: 0x06=trans data
Hex dump of block: st=0, typ_found=1
第二个
BH (0x21fe5dec) file#: 4 rdba: 0x010000fb (4/251) class: 1 ba: 0x21c92000
set: 3 pool: 3 bsz: 8192 bsi: 0 sflg: 1 pwc: 0,0
dbwrid: 0 obj: 22327 objn: 22327 tsn: 4 afn: 4 hint: f
hash: [0x213e7680,0x233f2418] lru: [0x233f76c8,0x233f2448]
ckptq: [NULL] fileq: [NULL] objq: [0x233f76e0,0x240796ec] objaq: [0x233f76e8,0x240796e4]
use: [NULL] wait: [NULL]
st: XCURRENT md: NULL fpin: ‘kdswh11: kdst_fetch’ tch: 2 txn: 0x293d0380
flags: private
LRBA: [0x0.0.0] LSCN: [0x0.3a9dcd] HSCN: [0x0.3a9dcd] HSUB: [65535]
buffer tsn: 4 rdba: 0x010000fb (4/251)
scn: 0x0000.00359e7e seq: 0x01 flg: 0x04 tail: 0x9e7e0601
frmt: 0x02 chkval: 0x8cd6 type: 0x06=trans data
Hex dump of corrupt header 3 = CHKVAL
Dump of memory from 0x21C92000 to 0x21C92014
#############################################
解读Buffer Header,也是对X$BH中相应字段的更详解读
第一句:
BH (0x213e6ad0) file#: 4 rdba: 0x010000fb (4/251) class: 1 ba: 0x210b0000
BH (0x213e6ad0) ,这是BH的HASH值
file#: 4 ,对应X$BH.FILE#,此块在4号文件里,通过v$dbfile.FILE#可以查出来对应的数据文件
rdba: 0x010000fb (4/251),rdba就是rowid中的相对文件号rfile#+block#块号。通过DBMS_ROWID查出块的rfile#+block#,使用select dbms_utility.make_data_block_address(4,251) from dual;这种方法可以计算出来十进制的rdba。这里的10000fb用to_number函数转换为10进制就是前面计算出来的:16777467。。0x010000fb转成二进制时,由相对文件号10位 block号22位。
class: 1,对应X$BH.class –表示buffer header对应block的类型,1=data block。详见本段Buffer Header解析最后。
ba: 0x210b0000 对应X$BH.BA,这是BUFFER中block address,是块在内存中的物理地址。
第二句:
set: 3 pool: 3 bsz: 8192 bsi: 0 sflg: 1 pwc: 0,0
set: 3:对应X$BH.STATE,CR(3)=作为一致性读镜像的数据块,详见本段Buffer Header解析最后。
bsz: 8192,块大小8192KB。这个可以在 dba_tablespaces.BLOCK_SIZE 查询出数据文件的块大小。
第三句:
dbwrid: 0 obj: 22327 objn: 22327 tsn: 4 afn: 4 hint: f
obj: 22327,对应X$BH.OBJ ,也就是块上数据在哪个对象里– dba_objects.DATA_OBJECT_ID,这个查询渠道很多。
第四句:
hash: [0x2bbfddf4,0x213e7680] lru: [0x213e76b0,0x22ff07ec]
hash: [0x2bbfddf4,0x213e7680] 一一对应x$bh.nxt_hash x$bh.prv_hash这里用链表,指出下一个及前一个BH的HASH值。如果这个hash chain上只有一个bh,则这里的前一个及后一个BH的hash值都是此BH。
lru: [0x213e76b0,0x22ff07ec] 一一对应x$bh.nxt_repl x$bh.prv_repl这里用链表,指出下一个及前一个BH的在LRU链上HASH值。
第五句:
lru-flags: moved_to_tail 对应x$bh. LRU_FLAG 表示该数据块经历了依次全表扫描,它被移到LRU的冷端,随时都可能被age out。
lru-flags为0时,在DUMP BUFFER时可能不显示lru-flags: 这一行。
lru-flags: on_auxiliary_list
可能出现的:
obj-flags: object_ckpt_list 对应 x$bh.OBJ_FLAG,,文件队列的对应对应 x$bh.RFLAG
flags: only_sequential_access 对应x$bh. FLAG
flags: buffer_dirty block_written_once redo_since_read –在DML后可能会出现这种状态的 flags
flags: buffer_dirty redo_since_read
第六句:
ckptq: [NULL] fileq: [NULL] objq: [0x22ff8054,0x24839390] objaq: [0x22ff805c,0x24839388]
ckptq: [NULL] 在检查点队列上的HASH值,这里为空
fileq: [NULL] 在文件队列上的HASH值
objq: [0x22ff8054,0x24839390] 对应x$bh.oq_nxt x$bh.oq_prv .对象队列HASH值
objaq: [0x22ff805c,0x24839388] 对应x$bh.aq_nxt x$bh.aq_prv.辅助对象队列HASH值

第七句
st: CR md: NULL fpin: ‘kdswh11: kdst_fetch’ tch: 1
st: CR :对应x$bh.state CR, a consistent read (stale) block image 一致读。 详见本段Buffer Header解析最后。
tch: 1 对应X$BH.TCH,Touch的缩写,表示一个Buffer的访问次数–不过不是绝对,3秒内访问同一块,TCH不增加。与此相关的一个字段是: X$BH.tim –Touch Time

第八句
cr: [scn: 0x0.3a9dcc],[xid: 0x0.0.0],[uba: 0x0.0.0],[cls: 0x0.3a9dcc],[sfl: 0x0],[lc: 0x0.359e7e]
[scn: 0x0.3a9dcc] 产生此CR块时的SCN

第九句:
buffer tsn: 4 rdba: 0x010000fb (4/251)
这个块的TSN 表空间号和RDBA
第十句:
scn: 0x0000.00359e7e seq: 0x01 flg: 0x04 tail: 0x9e7e0601
scn: 0x0000.00359e7e,SCN直接转换为用to_number函数转换为10进制就是数据库内查出的SCN了,是这个块的状态改变时的SCN。详见:http://blog.csdn.net/haibusuanyun/article/details/17029517
seq: 0x01
flg: 0x04 flg:0x01 (新建块)0x2(数据块延迟清洗推进scn和seq) 0X04(设置校验和) 0x08(临时块) 0x00普通块
第十一句:
frmt: 0x02 chkval: 0x8cd6 type: 0x06=trans data
type:0x06(表/索引块)
frmt: 0x01(v7) 0x02(v8)
##############################
第二个块BH与不同的有:
LRBA: [0xe3.e8e5.0] LSCN: [0x0.3a9dcd] HSCN: [0x0.3a9dcd] HSUB: [65535]
LSCN: [0x0.3a9dcd] HSCN: [0x0.3a9dcd] 修改时的SCN–如记录有修改时的SCN,可以转换此十六进制为SCN进行对比
LRBA: [0xe3.e8e5.0] 应该是最低REDO BYTE ADDRES,[0xe3.e8e5.0]对应 日志号,块号,第几字节起。也可能会有HRBA ,recovery rba 。
use: [NULL] wait: [NULL] 对应BH中的 users list ; waiters list
################################################################
附:
flag中,每位代表如下含义:

bit bit
0 buffer_dirty 14 stale
1 notify_after_change 15 deferred_ping
2 mod_started 16 direct_access
3 block_has_been_logged 17 hash_chain_dump
4 temp_data 18 ignore_redo
5 being_written 19 only_sequential_access
6 waiting_for_write 20 prefetched_block
7 multiple_waiters 21 block_written_once
8 recovery_reading 22 logically_flushed
9 unlink_from_lock 23 resilvered_already
10 down_grade_lock 25 redo_since_read
11 clone_being_written 29 plugged_from_foreign_db
12 reading_as_CR 30 flush_after_writing
13 gotten_in_current_mode
class:表示buffer header对应block的类型:
1=data block, 9=2nd level bmb,
2=sort block, 10=3rd level bmb,
3=save undo block, 11=bitmap block,
4=segment header, 12=bitmap index block,
5=save undo header, 13=unused,
6=free list, 14=undo header,
7=extent map, 15=undo block
state:
0, FREE, no valid block image
1, XCUR, a current mode block, exclusive to this instance 正在被当前的instance独占。
2, SCUR, a current mode block, shared with other instances正在被当前的instance共享
3, CR, a consistent read (stale) block image 一致读
4, READ, buffer is reserved for a block being read from disk 正在从磁盘上读取块
5, MREC, a block in media recovery mode 处于介质恢复模式
6, IREC, a block in instance (crash) recovery mode处于实例恢复模式

0,’free’,1,’xcur’,2,’scur’,
3,’cr’, 4,’read’,5,’mrec’,
6,’irec’,7,’write’,8,’pi’, 9,’memory’
10,’mwrite’,11,’donated’, 12,’protected’,
13,’securefile’, 14,’siop’,15,’recckpt’,
16, ‘flashfree’, 17, ‘flashcur’, 18, ‘flashna’

lru_flag

SYS@ bys3>select distinct(lru_flag) from x$bh;

LRU_FLAG
———-
6
4
8
0

select lru_flag,tch,BA,decode(state,0,’free’,1,’xcur’,2,’scur’,3,’cr’, 4,’read’,5,’mrec’,6,’irec’,7,’write’,8,’pi’, 9,’memory’,10,’mwrite’,11,’donated’, 12,’protected’, 13,’securefile’, 14,’siop’,15,’recckpt’, 16, ‘flashfree’, 17, ‘flashcur’, 18, ‘flashna’) status from x$bh where FILE#=4 and DBABLK=251;

select file#,block#,status from v$bh where objd=(select data_object_id from dba_objects where owner=’bys’ and object_name=’TEST’) and block#=341892 order by block#;

buffer cache实验2-详解Buffer Header–DUMP buffer结合X$BH视图各字段

1.为什么要使用buffer cache???
buffer cache就是一块含有许多数据块的内存区域,这些数据块主要都是数据文件里的数据块内容的拷贝。
从buffer cache中读取一个数据块一般需要100ns左右,从一般的存储硬盘中读取一个数据块需要10ms;所以大概算一下,从内存中读取数据块比从硬盘中快近十万倍。
故oracle在读取数据块时,先在buffer cache中查找,如存在,则读取–逻辑读;如果数据块不存在,则发生物理读,从物理文件中将数据读入buffer cache(不考虑直接读的情况)。
在初始化参数中,设置buffer cache大小的参数是db_cache_size
在11.2.0.4.0中此参数支持动态修改:
BYS@ bys3>show parameter db_cache_size
NAME TYPE VALUE
———————————— ———– ——————————
db_cache_size big integer 48M
BYS@ bys3>alter system set db_cache_size=40M;
System altered.
BYS@ bys3>show parameter db_cache_size
NAME TYPE VALUE
———————————— ———– ——————————
db_cache_size big integer 40M

buffer cache所提供的功能主要包括:
1) 通过缓存数据块,从而减少I/O。
2) 通过构造CR块,从而提供读一致性功能。
3) 通过提供各种lock、latch机制,从而提供多个进程并发访问同一个数据块的功能。

2.buffer cache的内存结构图解
话说大神们都用WORD画图,为了模仿大神, 我也用WORD画了好久的原创:

从这张buffer cache的内存结构图,用一句话来说明
buffer cache中 结构大致是:buffer pool—>working set—>CBC latch—>hash bucket—>hash chain—>buffer header—>buffer dba
下面就把这些结构的概念大致说明一下: –更详细的的在之后

1.buffer header:
每一个数据块在被读入buffer cache时,都会先在buffer cache中构造一个buffer header,buffer header与数据块一一对应(buffer header 中有指定buffer 具体内存地址的信息)。

buffer header包含的主要信息有: 详见:
1) 该数据块在buffer cache中实际的内存地址。
2) 该数据块的类型,包括data、segment header、undo header、undo block等等。
3) 该buffer header所在的hash chain,是通过在buffer header里保存指向前一个buffer header的指针和指向后一个buffer header的指针的方式实现的。
4) 该buffer header所在的LRU、LRUW、CKPTQ等链表(这些链表我们后面都会详细说明)。也是通过记录前后buffer header指针的方式实现。
5) 当前该buffer header所对应的数据块的状态以及标记。
6) 该buffer header被访问(touch)的次数。
7) 正在等待该buffer header的进程列表(waiter list)和正在使用该buffer header的进程列表(user list)。

我的测试环境:buffer cache大小是40M,buffer的个数是4936(每个buffer在x$bh中都存在一条记录)。 在11G中db_cache_size 是一个动态参数,可以手动更改此参数后再查询x$bh,可以发现buffer的个数也会随之变化的。
SYS@ bys3>show parameter db_cache_si 如果是动态SGA管理,应该查:select * from v$sga_dynamic_components;
NAME TYPE VALUE
———————————— ———– ——————————
db_cache_size big integer 40M
SYS@ bys3>select count(*) from x$bh; –用这句查出buffer的个数,也就是可以存放4936个数据块(因为还有一部分空间是生成buffer header),db_cache_size/4936-8K就能算出一个buffer header的大致大小
COUNT(*)
———-
4936

BH buffer header—-block_buffers块个数是一一对应的,事实上相等
BH的大小计算– 即db_cache_size的大小减去block_buffers*8K –这里数据库的默认块大小是8K

10G中BH的大小:9I据说是 188byte.
SYS@ ocm1>select 48*1024*1024/5988-8192 from dual;
48*1024*1024/5988-8192
———————-
213.418838

在数据库中知道 FILE# BLOCK#如何查询ba buffer address
SYS@ bys3> select ba from x$bh where dbarfil=4 and dbablk=171; –32位LINUX,需要用SYS用户查X$BH
BA
——–
207A4000 —内存中的位置,16进制,一个16进制表示4bit,对应32位OS
################################
2.hash chain与hash bucket:
从上图中可以看到,一个hash bucket是对应着一条hash chain的。Hash Bucket-直译叫hash桶
Hash Bucket 一个逻辑上的概念,通过对buffer header 里记录的数据块地址和数据块类型运用hash算法以后,得到的组号。
hash chain 将属于同一个hash bucket的所有buffer header串起来的链表

服务器进程将数据块读取到buffer cache后,将数据块的DBA进行HASH运算,将具有相同HASH值的数据块的buffer header挂载到同一个hash bucket下(可能多个块的HASH值相同),并用hash chain串联起来。
buffer cache中,缺省的hash bucket的数量或者说缺省有多少条hash chain链表,是由一个隐藏参数: _db_block_hash_buckets决定的。
关于_db_block_hash_buckets参数的取值:据说在8i下,该参数缺省为db_block_buffers×2;但是到了9i以后,该参数似乎取的是小于且最接近于db_block_buffers×2的素数。
在ORACLE 10G和11G中,默认值是大于2倍的buffer数量的最小的2的幂的值。举例如buffer数量是500,2倍就是1000,那么大于1000的最小的2的幂的值是1024,也就是就会有1024个hash bucket。

在我测试系统中:buffer 数量是4936,2倍是9872,从隐含参数_db_block_hash_buckets 查出bufket数量是16384 ,完全符合。
SYS@ bys3>select count(*) from x$bh; –用这句查出buffer的个数
COUNT(*)
———-
4936
P_NAME P_DESCRIPTION P_VALUE ISDEFAULT ISMODIFIED ISADJ
—————————————- ————————————————– —————————— ——— ———- —–
_db_block_hash_buckets Number of database block hash buckets 16384 TRUE FALSE FALSE
_db_block_hash_latches Number of database block hash latches 1024 TRUE FALSE FALSE
SYS@ bys3>show parameter db_block_size
NAME TYPE VALUE
———————————— ———– ——————————
db_block_size integer 8192

而一条hash chain上的buffer header数量,没有固定限制(CR块有限制,一条hash chain上的CR块不能超过6个)。从隐含参数 _db_block_max_cr_dba中可以查到这个限制:
P_NAME P_DESCRIPTION P_VALUE ISDEFAULT ISMODIFIED ISADJ
—————————————- ————————————————– —————————— ——— ———- —–
_db_block_max_cr_dba Maximum Allowed Number of CR buffers per dba 6 TRUE FALSE FALSE

判断是否有过长的hash chain的语句:过长的hash chain更容易引起热链进而引起CBC LATCH
SYS@ bys3>select * from (select hladdr,count(*) from x$bh group by hladdr order by 2 desc) where rownum<5; –x$bh.hladdr表示的是hash chain latch address
HLADDR COUNT(*)
——– ———-
2A3A46CC 14
2A7F0864 14
2A3A4EAC 13
2A7F26EC 12
在热链问题发生时,可以通过两种方法来增加hash chain数量:1、调整隐含参数_db_block_hash_buckets –有风险 2.按ORACLE 10G和11G中,bucket数量的默认值是大于2倍的buffer数量的最小的2的幂的值的公式,来计算出让系统自动调整bucket数量时buffer cache需要增加到的大小。–查出现在的_db_block_hash_buckets 数量,除以2,将得出值乘以当前数据块大小(暂不考虑bh大小,也可以把一个bh大小按1K或512bytes来计算),就可以得出要调整到的buffer cache大小。– 注意注意:这个调整重启后才生效。
按我测试环境中值来计算:_db_block_hash_buckets 16384 ,db_block_size 8192,一个buffer header按512bytes。想让系统自动调整hash bucket的数量,需要将buffer cache大小调整为大于68M,计算方法如下:
SYS@ bys3>select 16384/2*(8192+512)/1024/1024 “Desired size” from dual;
Desired size
————
68
当然了,这种调整buffer cache大小进而增大hash bucket数量的方法是治标了,引起热链问题,不良SQL语句或者高并发是主因,要想从根本上解决热链问题,就要从这些方面入手解决了。–不过要真是buffer cache过小,还是要在系统内存资源允许情况下增大点好。
###########################
3.hash latch:就是latch:cache buffers chains –CBC LATCH
用于保护hash chain结构,一个CBC LATCH管理着多个hash chain。
用到此LATCH的场景:
1.服务进程需要扫描hash chain上的buffer header时或者叫要读取buffer cache中数据块,
2.服务器进程要将新读入的数据块挂载到hash chain上时,

我的测试系统中:hash_buckets 个数是16384 ,CBC LATCH数量是1024,计算出一个CBC LATCH要管理16个hash_chain

P_NAME P_DESCRIPTION P_VALUE ISDEFAULT ISMODIFIED ISADJ
—————————————- ————————————————– —————————— ——— ———- —–
_db_block_hash_buckets Number of database block hash buckets 16384 TRUE FALSE FALSE
_db_block_hash_latches Number of database block hash latches 1024 TRUE FALSE FALSE
SYS@ bys3>select count(*) from v$latch_children where name like ‘%cache buffers chains%’;
COUNT(*)
———-
1024
SYS@ bys3>select 16384/1024 from dual;
16384/1024
———-
16

#############################################################################

4.Data Buffer Cache多缓冲池技术:

指根据数据的不同访问方式,将Data Buffer Cache分为Default,Keep,Recycle. Default 池则存放未指定存储池 的数据,按照LRU算法管理。Keep 池中 数据倾向于一直保存,可存放经常使用的数据,Recycle池中数据倾向于即时老化,可以存放一次性读取使用的数据。默认所有表(未指定存储的池)使用Default池,大小是数据缓冲区大小。
创建或修改表进指定:alter table test storage(buffer_pool keep);
BUFFER_POOL { KEEP | RECYCLE | DEFAULT }
语句在10G官方文档-SQL Reference—alter table—storage_clause
ORACLE 9I后一个数据库可以存在2K/4K/8K/16K/32K这五种大小的block,db_block_size 定义的是主block_size。
如果要在数据库中创建不同block_size的表空间,就要设置db_nk_cache_size参数。
每个pool会有至少8个“Latch:cache buffers lru chain”.

5.working set:
每个working set都具有它自己的一组LRU和LRUW链表(LRU和LRUW链表总是成对出现的)。
ORACLE为了提高buffer cache性能(大内存),使用了多个working set
每个working set都由一个名为“Latch:cache buffers lru chain”的latch来保护,每一个lru latch对应一个working set。
而每个被加载到buffer cache的buffer header都以轮询的方式挂到working set上去。
而每个被加载到buffer cache的buffer header都以轮询的方式挂到working set上去。也就是说,当buffer cache加载一个新的数据块时,其对应的buffer header会去找一个可用的lru latch,如果没有找到,则再找下一个lru latch,直到找到为止。如果轮询完所有的lru latch也没能找到可用的lru latch,该进程只有等待latch free等待事件,同时出现在v$session_wait中,并增加“latch misses”。
如果启用了多个DBWR后台进程的话,每个DBWR进程都会对应一个不同的working set,而且每个DBWR只会处理分配给它的working set,不会处理其他的working set。

虚拟机中,CPU是一个,在10G中是有8个LRU LATCH,在11GR2中,是16个LRU LATCH.
SYS@ bys3>select * from v$version;
BANNER
——————————————————————————–
Oracle Database 11g Enterprise Edition Release 11.2.0.4.0 – Production
PL/SQL Release 11.2.0.4.0 – Production
CORE 11.2.0.4.0 Production
TNS for Linux: Version 11.2.0.4.0 – Production
NLSRTL Version 11.2.0.4.0 – Production

SYS@ bys3>@?/rdbms/admin/show_para
Enter value for p: lru_latch
old 3: WHERE i.inst_id = USERENV (‘Instance’) AND CV.inst_id = USERENV (‘Instance’) AND i.indx = CV.indx AND upper(i.ksppinm) LIKE upper(‘%&p%’) ORDER BY REPLACE (i.ksppinm, ‘_’, ”)
new 3: WHERE i.inst_id = USERENV (‘Instance’) AND CV.inst_id = USERENV (‘Instance’) AND i.indx = CV.indx AND upper(i.ksppinm) LIKE upper(‘%lru_latch%’) ORDER BY REPLACE (i.ksppinm, ‘_’, ”)

P_NAME P_DESCRIPTION P_VALUE ISDEFAULT ISMODIFIED ISADJ
—————————————- ————————————————– —————————— ——— ———- —–
_db_block_lru_latches number of lru latches 8 TRUE FALSE FALSE

BYS@ bys3>show parameter cpu_c
NAME TYPE VALUE
———————————— ———– ——————————
cpu_count integer 1
BYS@ bys3>select addr,child#,name from v$latch_children where name =’cache buffers lru chain’;

ADDR CHILD# NAME
——– ———- —————————————————————-
290A80DC 16 cache buffers lru chain
290A8058 15 cache buffers lru chain
297FC670 14 cache buffers lru chain
297FC5EC 13 cache buffers lru chain
297883B8 12 cache buffers lru chain
29788334 11 cache buffers lru chain
29714100 10 cache buffers lru chain
2971407C 9 cache buffers lru chain
2969FE48 8 cache buffers lru chain
2969FDC4 7 cache buffers lru chain
2962BB90 6 cache buffers lru chain
2962BB0C 5 cache buffers lru chain
295B78D8 4 cache buffers lru chain
295B7854 3 cache buffers lru chain
29543620 2 cache buffers lru chain
2954359C 1 cache buffers lru chain
SYS@ bys3>select id,name,block_size,current_size,target_size from v$buffer_pool;

ID NAME BLOCK_SIZE CURRENT_SIZE TARGET_SIZE
———- ——————– ———- ———— ———–
3 DEFAULT 8192 36 36
###################3
SYS@ ocm1>select * from v$version;
BANNER
—————————————————————-
Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 – Prod
PL/SQL Release 10.2.0.1.0 – Production
CORE 10.2.0.1.0 Production
TNS for Linux: Version 10.2.0.1.0 – Production
NLSRTL Version 10.2.0.1.0 – Production

SYS@ ocm1>@?/rdbms/admin/show_para
Enter value for p: lru_latch
old 3: WHERE i.inst_id = USERENV (‘Instance’) AND CV.inst_id = USERENV (‘Instance’) AND i.indx = CV.indx AND upper(i.ksppinm) LIKE upper(‘%&p%’) ORDER BY REPLACE (i.ksppinm, ‘_’, ”)
new 3: WHERE i.inst_id = USERENV (‘Instance’) AND CV.inst_id = USERENV (‘Instance’) AND i.indx = CV.indx AND upper(i.ksppinm) LIKE upper(‘%lru_latch%’) ORDER BY REPLACE (i.ksppinm, ‘_’, ”)
P_NAME P_DESCRIPTION P_VALUE ISDEFAULT ISMODIFIED ISADJ
—————————————- ————————————————– —————————— ——— ———- —–
_db_block_lru_latches number of lru latches 8 TRUE FALSE FALSE

SYS@ ocm1>show parameter cpu_c
NAME TYPE VALUE
———————————— ———– ——————————
cpu_count integer 1
SYS@ ocm1>
SYS@ ocm1>select name from v$latch_children where name =’cache buffers lru chain’;
NAME
————————————————–
cache buffers lru chain
cache buffers lru chain
cache buffers lru chain
cache buffers lru chain
cache buffers lru chain
cache buffers lru chain
cache buffers lru chain
cache buffers lru chain
8 rows selected.

SYS@ ocm1>select id,name,block_size,current_size,target_size from v$buffer_pool;
ID NAME BLOCK_SIZE CURRENT_SIZE TARGET_SIZE
———- ——————– ———- ———— ———–
3 DEFAULT 8192 48 48

每个working set中,还有其它的队列:ckpt queue,ObjectQ、FileQ等,根据块的不同,也可能会同时挂载在这些队列下。
working set与lru latch一一对应。lru latch的数量是由一个隐藏参数:_db_block_lru_latches决定的。
该参数缺省值为DBWR进程的数量×8。该参数最小必须为8,如果强行设置比8小的数值,oracle将忽略你设置的值,而使用8作为该参数值。
###############################################
6.最后结合上图:用一段话来简洁的概括buffer cache的内存结构:

buffer cache中有pool,每个buffer pool使用自己的cache buffers lru chain LATCH,一个数据库实例可以配置:DEFAULT,2KB,4KB,8KB,16KB,32KB,KEEP,RECYCLE 这8种类型的buffer pool,故cache buffers lru chain LATCH的数量最少为8个。每个Latch:cache buffers lru chain对应着一个working set,
每个working set中,有多个CBC LATCH来,每个CBC LATCH管理着多个hash bucket,每个hash bucket对应着一条hash chain。
数据块在读入buffer cache中时,同时会在buffer cache中构造一个buffer header,ORACLE对数据块的DBA进行hash运算,根据运算结果将buffer header挂载到相应的hash chain上。
同时,每个working set中,有一对LRU和LRUW链表,buffer cache中的数据块,胜块会挂载到LRUW链表,其它块在LRU链表。也就是buffer cache中的数据块,肯定在LRU和LRUW链表之一:不能同时存在这两个链表上。

buffer cache实验1-内存结构图解

数据读取之逻辑读简单解析–BUFFER CACHE 关于 consistent read–一致性读–Logical read-逻辑读-current read当前读–物理读,详见:http://blog.csdn.net/haibusuanyun/article/details/11489091
一、实验数据准备–查出一条数据的ROWID,及FILE_ID,BLOCK_ID等信息
BYS@ bys3>select rowid,test.* from test where rownum=1;
ROWID OBJECT_NAME OBJECT_ID STATUS
—————— ———— ———- ——-
AAAFSJAAEAAAACrAAA UNDO$ 15 VALID
使用下面语句查出相应行的FILE_ID,BLOCK_ID,关于ROWID,详见:http://blog.csdn.net/q947817003/article/details/11490051
col object_name for a12
col colname for a10
select a.rowid,a.object_id,a.file_id,a.block_id,a.row_num,b.object_name,a.colname from
(select rowid,
dbms_rowid.rowid_object(rowid) object_id,
dbms_rowid.rowid_relative_fno(rowid) file_id,
dbms_rowid.rowid_block_number(rowid) block_id,
dbms_rowid.rowid_row_number(rowid) row_num,
&colname as colname from &tablename t) a,
dba_objects b
where a.object_id=b.object_id;
运行上述语句,按提示输入:&colname 列名 ;&tablename 表名即可显示类似以下信息: 我这里是输入 test 表的object_name列
ROWID OBJECT_ID FILE_ID BLOCK_ID ROW_NUM OBJECT_NAME COLNAME
—————— ———- ———- ———- ———- ———— ———-
AAAFSJAAEAAAACrAAD 21641 4 171 3 TEST I_USER1
AAAFSJAAEAAAACrAAC 21641 4 171 2 TEST CON$
AAAFSJAAEAAAACrAAB 21641 4 171 1 TEST ICOL$
AAAFSJAAEAAAACrAAA 21641 4 171 0 TEST UNDO$
#############################
二、关于BH buffer header,buckets,block_buffers介绍:
详见: buffer cache实验1-内存结构图解

#############################

三.结合图1,解析发出查询语句,ORACLE如何读数据?
select a from b where rownum=1;语句发出后, —只涉及buffer cache中的读取,语句的解析暂不考虑,以后补充吧。
–>>首先查出第一行数据的ROWID–使用有dbms_rowid.ROWID_BLOCK_NUMBER(rowid),
–>>根据ROWID得出DBA
–>>到SGA中BUFFER CACHE查找此数据。
–>>首先把DBA信息使用内部HASH函数进行运算
–>>根据生成值找到相应HASH BUCKET(包含首、尾BH地址) –共享池
–>>通过HASH BACKET找到cache buffers chains- -此步需要先要获取latch:cache buffers chains
–>>在cache buffers chains上顺序查询到所需BH buffer header –通过内部表x$bh,在BH中找到BA信息 buffer address
–>>根据BH中的BA信息,就找到了BUFFER CACHE中存放所要查询数据块具体数据的内存块— 此步需要先获取Buffer pin S (0–>1)–在BH上加此锁
–>>返回数据至相应的查询进程; 一次逻辑读的读取操作到此完成。 此后还需要释放在BH上的Buffer pin S 锁
–>> 此时需要先获取latch:cache buffers chains,
–>>在上一步获取的 latch:cache buffers chains保护下,将BH上的 BH上的Buffer pin S 锁释放(1–>0)
–>>释放 latch:cache buffers chains,至此一次逻辑读的操作才全部完成。。

四、总结:一次逻辑读时CBC latch锁及Buffer pin锁的获取和释放过程如下:
1.加Latch X
2.进入hash chain,在相应的BH上加Buffer pin S (0–>1)
3.释放Latch X
4.进行逻辑读–也就是通过BH中的buffer adderss找到数据块在内存中真实位置 —假如读了1MS
5.加Latch X
6.释放Buffer pin S (1–>0) 0:没锁 1:共享锁 2:独占锁
7.释放Latch X

数据读取之逻辑读简单解析–关于BUFFER CACHE

—友情提示,内容较多,可以从博文左上的+目录选择小节方便阅读。
实验思路: –实验相关TRACE文件:http://download.csdn.net/detail/q947817003/6646723
1.数据库OPEN,,做DML操作不提交,查看检查点。
2.SHUTDOWN ABORT并重启到MOUNT并查询检查点
3.DUMP控制文件查看CHECKPOINT_CHANGE#/RBA
4.DUMP数据文件查看CHECKPOINT_CHANGE#/RBA,与DUMP控制文件对比
5.DUMP REDO日志文件,查看、对比CHECKPOINT_CHANGE#/RBA
6.使用BBED查看数据文件头中的CHECKPOINT_CHANGE#/RBA
7.执行EVENT事件的语句,OPEN数据库,再DUMP控制文件
8.分析OPEN时,通过ALERT日志查看的恢复过程–前滚
9.分析OPEN时,EVENT事件生成的TRACE中查看恢复过程–前滚
10.OPEN数据库时,通过ALERT日志及EVENT事件生成的TRACE中信息解析实例恢复的回滚
11.分析OPEN后的控制文件信息

参考资料及感谢:
guoyJoe http://blog.csdn.net/guoyJoe/article/details/9034425
dbsnake http://www.dbsnake.com/oracle-instance-recovery-end-point.html

实验结论有:
1.控制文件提供恢复所需当前REDO日志的RBA信息,当前REDO日志提供具体的用于恢复的日志内容,最终是将日志内容应用于数据文件。–实例恢复三者不能缺。
2.数据库OPEN时开始实例恢复,先应用日志内容,应用完后从alert日志中来看是已经可以连接至数据库,此时如果UNDO未完成,就有用户发出操作,数据库进程会将回滚后的数据发送至用户- -可能会有等待。
3.重要的一点,数据文件、当前REDO日志文件、控制文件正常时实例恢复无需DBA干预,自动完成哈哈。
4.如果当前REDO日志丢了,只能做不完全恢复了。

关于实例恢复起止点:–来自dbsnake
可能会出现On Disk RBA比Low Cache RBA小的情况,如果Oracle发现存在这种情况,则会强制写redo。
On Disk RBA只是表示Instance Recovery的时候至少要恢复到On Disk RBA,它只是真正的current redo log file的最尾端一个前镜像。
实例恢复的起点是:Low Cache RBA和Thread Checkpoint RBA中的较大值; 实例恢复的终点就是current redo log file的最尾端。 On-Disk RBA是要最低恢复到的位置–事实上是只要On-Disk RBA后还有日志块就要恢复完的。
Oracle在做实例恢复的时候是受隐含参数_two_pass的控制,其默认为true,这表示要Oracle做实例恢复的时候是采用Two Pass Recovery,即要扫描current redo log file两次。
Two Pass Recovery的核心是在做实例恢复时要去掉那些已经被写入数据文件的数据块所对应的redo record,Oracle称这些redo record为Block Written Record (BWR)。
###################################################################
1.数据库正常运行,多种途径查看数据库中检查点
在普通用户下执行DML操作不提交
BYS@ bys3>set time on
13:18:17 BYS@ bys3>select * from a; –此表在USER表空间。
B
———-
55
8
0
3
13:18:21 BYS@ bys3>delete a;
4 rows deleted.
13:18:36 BYS@ bys3>select * from a;
no rows selected
再打开一个会话(同一会话切换用户会提交操作),多种途径查看数据库中检查点:详见:http://blog.csdn.net/q947817003/article/details/11590735
SYS@ bys3>set time on
13:18:44 SYS@ bys3>col name for a35
13:18:52 SYS@ bys3>select dbid,name,checkpoint_change# from v$database;
DBID NAME CHECKPOINT_CHANGE#
———- ———————————– ——————
3358363031 BYS3 1991217
13:18:59 SYS@ bys3>select file#,name,checkpoint_change#,to_char(checkpoint_time,’yyyy-mm-dd hh24:mi:ss’) cptime from v$datafile;
FILE# NAME CHECKPOINT_CHANGE# CPTIME
———- ———————————– —————— ——————-
1 /u01/oradata/bys3/system01.dbf 1991217 2013-12-02 13:17:26
2 /u01/oradata/bys3/sysaux01.dbf 1991217 2013-12-02 13:17:26
3 /u01/oradata/bys3/undotbs01.dbf 1991217 2013-12-02 13:17:26
4 /u01/oradata/bys3/user01.dbf 1991217 2013-12-02 13:17:26
13:19:25 SYS@ bys3>select name,checkpoint_change# from v$datafile_header;
NAME CHECKPOINT_CHANGE#
———————————– ——————
/u01/oradata/bys3/system01.dbf 1991217
/u01/oradata/bys3/sysaux01.dbf 1991217
/u01/oradata/bys3/undotbs01.dbf 1991217
/u01/oradata/bys3/user01.dbf 1991217
当前当前REDO日志使用情况:
13:19:57 SYS@ bys3>col member for a30
13:20:01 SYS@ bys3>select a.member,a.type,b.thread#,b.sequence#,b.bytes/1024/1024 MB,b.status,b.archived from v$logfile a,v$log b where a.group#=b.group#;
MEMBER TYPE THREAD# SEQUENCE# MB STATUS ARC
—————————— ——- ———- ———- ———- —————- —
/u01/oradata/bys3/redo01.log ONLINE 1 106 50 INACTIVE YES
/u01/oradata/bys3/redo02.log ONLINE 1 107 50 CURRENT NO
/u01/oradata/bys3/redo03.log ONLINE 1 105 50 INACTIVE YES
###################################################################

2.模拟断电–shutdown abort,并重启到MOUNT 查询检查点
13:20:02 SYS@ bys3>shutdown abort; —-13:22:11执行完此命令
ORACLE instance shut down.
13:22:11 SYS@ bys3>
alert日志: –推荐个小方法:把alert日志做一个软链接到ORACLE用户家目录,查看方便。
[oracle@bys3 ~]$ cat alert_bys3.log
Mon Dec 02 13:22:09 2013
Shutting down instance (abort)
License high water mark = 4
USER (ospid: 846): terminating the instance
Instance terminated by USER, pid = 846
Mon Dec 02 13:22:11 2013
Instance shutdown complete
######################################
重启数据库到MOUNT,从数据库中查看数据库中检查点、控制文件及数据文件头检查点,一致则无需介质恢复
数据库MOUNT状态下直接在数据库中使用SQL语句查询:
SYS@ bys3>select status from v$instance;
STATUS
————
MOUNTED
SYS@ bys3>select dbid,name,checkpoint_change# from v$database; –数据库全局-检查点 SCN,在控制文件中
DBID NAME CHECKPOINT_CHANGE#
———- ——— ——————
3358363031 BYS3 1991217
SYS@ bys3>select file#,name,checkpoint_change#,to_char(checkpoint_time,’yyyy-mm-dd hh24:mi:ss’) cptime from v$datafile; –checkpoint scn,表示该数据文件最近一次执行检查点操作时的SCN,在控制文件中。
FILE# NAME CHECKPOINT_CHANGE# CPTIME
———- ———————————– —————— ——————-
1 /u01/oradata/bys3/system01.dbf 1991217 2013-12-02 13:17:26
2 /u01/oradata/bys3/sysaux01.dbf 1991217 2013-12-02 13:17:26
3 /u01/oradata/bys3/undotbs01.dbf 1991217 2013-12-02 13:17:26
4 /u01/oradata/bys3/user01.dbf 1991217 2013-12-02 13:17:26
SYS@ bys3>select name,checkpoint_change# from v$datafile_header; –CHECKPOINT_CHANGE#表示该数据文件最近一次执行检查点操作时的SCN,在数据文件头
NAME CHECKPOINT_CHANGE#
———————————– ——————
/u01/oradata/bys3/system01.dbf 1991217
/u01/oradata/bys3/sysaux01.dbf 1991217
/u01/oradata/bys3/undotbs01.dbf 1991217
/u01/oradata/bys3/user01.dbf 1991217
###################################################################
3.DUMP控制文件查看CHECKPOINT_CHANGE#/RBA
更详细DUMP控制文件方式见:http://blog.csdn.net/q947817003/article/details/16370273
SYS@ bys3>alter session set events ‘immediate trace name controlf level 12’;
Session altered.
SYS@ bys3>select value from v$diag_info where name like ‘Default%’;
VALUE
——————————————————————————
/u01/diag/rdbms/bys3/bys3/trace/bys3_ora_980.trc
查看TRACE文件: –截取部分内容
***************************************************************************
DATABASE ENTRY
***************************************************************************
(size = 316, compat size = 316, section max = 1, section in-use = 1,
last-recid= 0, old-recno = 0, last-recno = 0)
(extent = 1, blkno = 1, numrecs = 1)
11/14/2013 14:23:19
DB Name “BYS3”
Database flags = 0x00404001 0x00001200
Controlfile Creation Timestamp 11/14/2013 14:23:21
Incmplt recovery scn: 0x0000.00000000
Resetlogs scn: 0x0000.00000001 Resetlogs Timestamp 11/14/2013 14:23:19
Prior resetlogs scn: 0x0000.00000000 Prior resetlogs Timestamp 01/01/1988 00:00:00
Redo Version: compatible=0xb200000
#Data files = 4, #Online files = 4
Database checkpoint: Thread=1 scn: 0x0000.001e6231
Threads: #Enabled=1, #Open=1, Head=1, Tail=1
enabled threads: 01000000 00000000 00000000 00000000 00000000 00000000
Max log members = 5, Max data members = 1
Arch list: Head=2, Tail=2, Force scn: 0x0000.001b6c94scn: 0x0000.00000000
Activation ID: 3358374039
SCN compatibility 1
Auto-rollover enabled
Controlfile Checkpointed at scn: 0x0000.001e6286 12/02/2013 13:17:28 —这是增量检查点的位置SCN -1991302
thread:0 rba:(0x0.0.0)
###############
可以看到检查点的信息:Database checkpoint: Thread=1 scn: 0x0000.001e6231
换算为十进制的SCN为: —与上一步查询对应
SYS@ bys3>select to_number(‘1e6231′,’xxxxxxxxx’) from dual;
TO_NUMBER(‘1C8E12′,’XXXXXXXXX’)
——————————-
1991217
###############
***************************************************************************
CHECKPOINT PROGRESS RECORDS
***************************************************************************
(size = 8180, compat size = 8180, section max = 4, section in-use = 0,
last-recid= 0, old-recno = 0, last-recno = 0)
(extent = 1, blkno = 2, numrecs = 4)
THREAD #1 – status:0x2 flags:0x0 dirty:104 —脏块数量104
low cache rba:(0x6b.3.0) on disk rba:(0x6b.197.0) —数据文件检查点 Scn以及stop scn值据说来自于当前REDO日志
on disk scn: 0x0000.001e638d 12/02/2013 13:21:37 –ON DISK SCN
resetlogs scn: 0x0000.00000001 11/14/2013 14:23:19
heartbeat: 833133356 mount id: 3360007946
################
在检查点进程记录部分,记录了Dirty Buffer的数量是104.
包含Low Cache RBA和On Disk RBA的信息,
low cache rba:(0x6b.3.0) on disk rba:(0x6b.197.0)
— low cache rba:(0x6b.3.0): 实例恢复的起点:107号日志,第3个块,第0个字节
–on disk rba:(0x6b.197.0): 实例恢复的终点:107号日志,第407个块,第0个字节 –最前面结论是实例恢复终点实际为current redo log file的最尾端,但是在控制文件、日志中记录的是这个 on disk rba

on disk scn: 0x0000.001e638d 12/02/2013 13:21:37
数据库恢复的检查点终点是SCN–0x0000.001e638d,十进制是:1991565。
On-Disk RBA的SCN是1991565,这是实例恢复的终点。
数据库的恢复SCN范围也就由此确定,即SCN范围:增量检查点:1991302–On-Disk RBA,用SCN表示即:1991302 ===>>>1991565

***************************************************************************
DATA FILE RECORDS
***************************************************************************
(size = 520, compat size = 520, section max = 100, section in-use = 4,
last-recid= 7, old-recno = 0, last-recno = 0)
(extent = 1, blkno = 7, numrecs = 100)
DATA FILE #1: DATA FILE #2: DATA FILE #3: 和DATA FILE #3差不多,并且在本实验中不涉及,精简篇幅就省略了。
DATA FILE #4:
name #8: /u01/oradata/bys3/user01.dbf
creation size=6400 block size=8192 status=0xe head=8 tail=8 dup=1
tablespace 4, index=5 krfil=4 prev_file=0
unrecoverable scn: 0x0000.00000000 01/01/1988 00:00:00
Checkpoint cnt:167 scn: 0x0000.001e6231 12/02/2013 13:17:26 —cnt:167是检查点计数,来自数据文件。–与下一步DUMP数据文件中SYSTEM表空间数据文件的CTL CNT对应。一致说明来自同一版本,而不是备份。
Stop scn: 0xffff.ffffffff 12/02/2013 13:16:13 –STOP SCN是FFFF,数据文件的STOP SCP不等于Checkpoint SCN。意味着数据库上一次关闭未执行完全检查点,是异常关闭。故需要实例恢复。
Creation Checkpointed at scn: 0x0000.000034f9 11/14/2013 14:26:26
thread:1 rba:(0x1.ce8a.10)
enabled threads: 01000000 00000000 00000000 00000000 00000000 00000000
Offline scn: 0x0000.00000000 prev_range: 0
Online Checkpointed at scn: 0x0000.00000000
thread:0 rba:(0x0.0.0)
enabled threads: 00000000 00000000 00000000 00000000 00000000 00000000
Hot Backup end marker scn: 0x0000.00000000
aux_file is NOT DEFINED
Plugged readony: NO
Plugin scnscn: 0x0000.00000000
Plugin resetlogs scn/timescn: 0x0000.00000000 01/01/1988 00:00:00
Foreign creation scn/timescn: 0x0000.00000000 01/01/1988 00:00:00
Foreign checkpoint scn/timescn: 0x0000.00000000 01/01/1988 00:00:00
Online move state: 0
########################
这里在第1步做DML操作时,所在的是USER表空间。
DATA FILE #4: 中的检查点信息如下:
Checkpoint cnt:167 scn: 0x0000.001e6231 12/02/2013 13:17:26
–控制文件中保存的数据文件检查点SCN=1e6231 转成10进制为1991217,与前文吻合
Stop scn: 0xffff.ffffffff 12/11/2012 22:53:05
–结束的SCN填无穷大,说明是异常关机的,重启数据库必须做实例恢复
###################################################################
4.DUMP数据文件查看CHECKPOINT_CHANGE#/RBA,与DUMP控制文件对比
更详细DUMP数据文件方式见:http://blog.csdn.net/q947817003/article/details/16369041
SYS@ bys3>alter system set events ‘immediate trace name file_hdrs level 3’; –最好和上一步DUMP控制文件在不同的会话
System altered.
SYS@ bys3>select value from v$diag_info where name like ‘Default%’;
VALUE
———————————————————————-
/u01/diag/rdbms/bys3/bys3/trace/bys3_ora_1010.trc
查看TRACE文件: –截取部分内容–

DATA FILE #1:
name #4: /u01/oradata/bys3/system01.dbf
creation size=64000 block size=8192 status=0xe head=4 tail=4 dup=1
tablespace 0, index=1 krfil=1 prev_file=0
unrecoverable scn: 0x0000.00000000 01/01/1988 00:00:00
Checkpoint cnt:167 scn: 0x0000.001e6231 12/02/2013 13:17:26 ———–CKPT CNT 167与上一步DUMP控制文件中对应
Stop scn: 0xffff.ffffffff 12/02/2013 13:16:13 ——- –STOP SCN是FFFF,数据文件的STOP SCP不等于Checkpoint SCN。意味着数据库上一次关闭未执行完全检查点,是异常关闭。故需要实例恢复。
Creation Checkpointed at scn: 0x0000.00000015 11/14/2013 14:24:22
thread:1 rba:(0x1.3.10)
enabled threads: 01000000 00000000 00000000 00000000 00000000 00000000
Offline scn: 0x0000.00000000 prev_range: 0
Online Checkpointed at scn: 0x0000.00000000
thread:0 rba:(0x0.0.0)
enabled threads: 00000000 00000000 00000000 00000000 00000000 00000000
000000 00000000
00000000 00000000 00000000 00000000 00000000 00000000
Hot Backup end marker scn: 0x0000.00000000
aux_file is NOT DEFINED
Plugged readony: NO
Plugin scnscn: 0x0000.00000000
Plugin resetlogs scn/timescn: 0x0000.00000000 01/01/1988 00:00:00
Foreign creation scn/timescn: 0x0000.00000000 01/01/1988 00:00:00
Foreign checkpoint scn/timescn: 0x0000.00000000 01/01/1988 00:00:00
Online move state: 0
V10 STYLE FILE HEADER:
Compatibility Vsn = 186646528=0xb200000
Db ID=3358363031=0xc82c8d97, Db Name=’BYS3′
Activation ID=0=0x0
Control Seq=8489=0x2129, File size=64000=0xfa00
File Number=1, Blksiz=8192, File Type=3 DATA
Tablespace #0 – SYSTEM rel_fn:1
Creation at scn: 0x0000.00000015 11/14/2013 14:24:22
Backup taken at scn: 0x0000.00000000 01/01/1988 00:00:00 thread:0
reset logs count:0x318f5cd7 scn: 0x0000.00000001
prev reset logs count:0x0 scn: 0x0000.00000000
recovered at 12/02/2013 13:17:26
status:0x2004 root dba:0x00400208 chkpt cnt: 167 ctl cnt:166 ———–CKPT CNT 167, CTL CNT 166与上一步DUMP控制文件中对应
###################################################
Tablespace #4 – USERS rel_fn:4
Creation at scn: 0x0000.000034f9 11/14/2013 14:26:26
Backup taken at scn: 0x0000.00000000 01/01/1988 00:00:00 thread:0
reset logs count:0x318f5cd7 scn: 0x0000.00000001
prev reset logs count:0x0 scn: 0x0000.00000000
recovered at 12/02/2013 13:17:26
status:0x4 root dba:0x00000000 chkpt cnt: 168 ctl cnt:167
begin-hot-backup file size: 0
Checkpointed at scn: 0x0000.001e6231 12/02/2013 13:17:26 ——-检查点 scn: 0x0000.001e6231与前文吻合
thread:1 rba:(0x6b.2.10) ——–REDO日志的地址0x6b.2.10–-> 107号日志,第2号块,第16个字节
enabled threads: 01000000 00000000 00000000 00000000 00000000 00000000
Backup Checkpointed at scn: 0x0000.00000000
thread:0 rba:(0x0.0.0)
enabled threads: 00000000 00000000 00000000 00000000 00000000 00000000
External cache id: 0x0 0x0 0x0 0x0
Absolute fuzzy scn: 0x0000.00000000
Recovery fuzzy scn: 0x0000.00000000 01/01/1988 00:00:00
Terminal Recovery Stamp 01/01/1988 00:00:00
Platform Information: Creation Platform ID: 10
Current Platform ID: 10 Last Platform ID: 10
DUMP OF TEMP FILES: 1 files in database

第3步中:《《注意:
从控制文件中得到重做日志恢复起始地址如下:
low cache rba:(0x6b.3.0) on disk rba:(0x6b.197.0)
— low cache rba:(0x6b.3.0):
实例恢复的起点:107号日志,第3个块,第0个字节
–on disk rba:(0x6b.197.0):
实例恢复的终点:107号日志,第407个块,第0个字节 –具体是不是终点,最后讨论

on disk scn: 0x0000.001e638d 12/02/2013 13:21:37
数据库恢复的检查点终点是SCN–0x0000.001e638d,十进制是:1991565。
On-Disk RBA的SCN是1991565,这是实例恢复的终点。
数据库的恢复SCN范围也就由此确定,即SCN范围:最后检查点:1991217–On-Disk RBA,用SCN表示即:1991217 ===>>>1991565》》
–说明:
实例恢复的起点是Low Cache RBA和Thread Checkpoint RBA中的最大值, 实例恢复的终点就是current redo log file的最尾端而不是On-Disk RBA。 On-Disk RBA是要最低恢复到的位置。
这样,本实验中实例恢复的起始的重做日志是以控制文件中的low cache rba:(0x6b.3.0)开始恢复,而不是从文件头的thread:1 rba:(0x6b.2.10)
########################################################################
5.DUMP REDO日志文件 –在第一步已经确定了当前日志是redo02.log
更详细方法,见:http://blog.csdn.net/q947817003/article/details/16370203
SYS@ bys3>alter system dump logfile ‘/u01/oradata/bys3/redo02.log’;
System altered.
SYS@ bys3>select value from v$diag_info where name like ‘Default%’;
VALUE
——————————————————————
/u01/diag/rdbms/bys3/bys3/trace/bys3_ora_1906.trc
REDO日志DUMP最后一个REDO RECORD 的一部分CHANGE #1: –不知道如何解读,留白吧???
REDO RECORD – Thread:1 RBA: 0x00006b.00000194.0084 LEN: 0x0418 VLD: 0x09 —与上一步的对应
SCN: 0x0000.001e638c SUBSCN: 1 12/02/2013 13:21:37
CHANGE #1 TYP:2 CLS:1 AFN:1 DBA:0x004007e1 OBJ:288 SCN:0x0000.001e6386 SEQ:2 OP:11.5 ENC:0 RBL:0
KTB Redo
op: 0x11 ver: 0x01
compat bit: 4 (post-11) padding: 1
op: F xid: 0x0009.017.00000642 uba: 0x00c00cac.00f9.28
Block cleanout record, scn: 0x0000.001e638b ver: 0x01 opt: 0x02, entries follow…
itli: 2 flg: 2 scn: 0x0000.001e6386
KDO Op code: URP row dependencies Disabled
xtype: XA flags: 0x00000000 bdba: 0x004007e1 hdba: 0x004007e0
itli: 1 ispac: 0 maxfr: 4863
tabn: 0 slot: 1(0x1) flag: 0x2c lock: 1 ckix: 182
ncol: 19 nnew: 6 size: -7
col 4: [ 7] 78 71 0c 02 0e 16 26
col 5: *NULL*
col 6: [ 7] 78 71 0c 02 0e 17 26
col 7: [21]
c0 06 60 3d 13 34 56 13 34 56 13 34 56 13 34 56 13 34 56 1e 0b
col 9: [ 1] 80
col 10: [ 1] 80
###################################################################
6:使用BBED查看数据文件头CHECKPOINT_CHANGE#及rba
[oracle@bys3 ~]$ cat par.bbd
blocksize=8192
listfile=bbedfile.txt
mode=edit
[oracle@bys3 ~]$ cat bbedfile.txt
1 /u01/oradata/bys3/system01.dbf 524288000
2 /u01/oradata/bys3/sysaux01.dbf 340787200
3 /u01/oradata/bys3/undotbs01.dbf 209715200
4 /u01/oradata/bys3/user01.dbf 52428800
[oracle@bys3 ~]$ bbed parfile=par.bbd
Password:
BBED: Release 2.0.0.0.0 – Limited Production on Sun Dec 1 22:29:18 2013
Copyright (c) 1982, 2011, Oracle and/or its affiliates. All rights reserved.
************ !!! For Oracle Internal Use only !!! ***************
BBED> set file 4 block 1
FILE# 4
BLOCK# 1
BBED> map /v
File: /u01/oradata/bys3/user01.dbf (4)
Block: 1 Dba:0x01000001
————————————————————
Data File Header
struct kcvfh, 860 bytes @0
struct kcvfhbfh, 20 bytes @0
struct kcvfhhdr, 76 bytes @20
ub4 kcvfhrdb @96
struct kcvfhcrs, 8 bytes @100
ub4 kcvfhcrt @108
ub4 kcvfhrlc @112
struct kcvfhrls, 8 bytes @116
ub4 kcvfhbti @124
struct kcvfhbsc, 8 bytes @128
ub2 kcvfhbth @136
ub2 kcvfhsta @138
struct kcvfhckp, 36 bytes @484
ub4 kcvfhcpc @140
ub4 kcvfhrts @144
ub4 kcvfhccc @148
struct kcvfhbcp, 36 bytes @152
ub4 kcvfhbhz @312
struct kcvfhxcd, 16 bytes @316
sword kcvfhtsn @332
ub2 kcvfhtln @336
text kcvfhtnm[30] @338
ub4 kcvfhrfn @368
struct kcvfhrfs, 8 bytes @372
ub4 kcvfhrft @380
struct kcvfhafs, 8 bytes @384
ub4 kcvfhbbc @392
ub4 kcvfhncb @396
ub4 kcvfhmcb @400
ub4 kcvfhlcb @404
ub4 kcvfhbcs @408
ub2 kcvfhofb @412
ub2 kcvfhnfb @414
ub4 kcvfhprc @416
struct kcvfhprs, 8 bytes @420
struct kcvfhprfs, 8 bytes @428
ub4 kcvfhtrt @444
ub4 tailchk @8188

BBED> print kcvfhckp
struct kcvfhckp, 36 bytes @484
struct kcvcpscn, 8 bytes @484
ub4 kscnbas @484 0x001e6231
ub2 kscnwrp @488 0x0000
ub4 kcvcptim @492 0x31a859e6
ub2 kcvcpthr @496 0x0001
union u, 12 bytes @500
struct kcvcprba, 12 bytes @500
ub4 kcrbaseq @500 0x0000006b
ub4 kcrbabno @504 0x00000002
ub2 kcrbabof @508 0x0010
ub1 kcvcpetb[0] @512 0x02
ub1 kcvcpetb[1] @513 0x00
ub1 kcvcpetb[2] @514 0x00
ub1 kcvcpetb[3] @515 0x00
ub1 kcvcpetb[4] @516 0x00
ub1 kcvcpetb[5] @517 0x00
ub1 kcvcpetb[6] @518 0x00
ub1 kcvcpetb[7] @519 0x00
BBED> set offset 500
OFFSET 500

BBED> dump /v —@500开始,4字节表示日志序号,4字节表示块号,2字节表示日志块中第几个字节,表示的是数据文件头的RBA信息
从数据块中计算出的RBA信息与print kcvfhckp中的一致,就不重复算了。
关于日志块大小,详见:http://blog.csdn.net/q947817003/article/details/11350359
File: /u01/oradata/bys3/user01.dbf (4)
Block: 1 Offsets: 500 to 1011 Dba:0x01000001
——————————————————-
6b000000 02000000 10000400 02000000 l k……………
00000000 00000000 00000000 00000000 l …………….
00000000 00000000 00000000 00000000 l …………….
省略。。。。
<16 bytes per line>

这里CHKPOINT_SCN信息是:
struct kcvcpscn, 8 bytes @484
ub4 kscnbas @484 0x001e6231
ub2 kscnwrp @488 0x0000
这三行就是检查点的SCN信息,kscnbas–0x001c8e12,kscnwrp–0x0000ub4 –实验有效的4个byte: 0x0000
scn计算方法:SCN=(SCN_WRP * 4294967296) + SCN_BAS –SCN的详细介绍及计算:http://blog.csdn.net/q947817003/article/details/11590983
所以此处的SCN就是:0x0000.001e6231;10进制SCN号为:1991217

RBA信息是:
struct kcvcprba, 12 bytes @500
ub4 kcrbaseq @500 0x0000006b –序号,
ub4 kcrbabno @504 0x00000002 –块号
ub2 kcrbabof @508 0x0010 –字节号
换算为十进制表示为:107号日志,2号块,16字节
与上一步DUMP数据文件信息得出的一致:
thread:1 rba:(0x6b.2.10)
–重做日志的地址0x6b.2.10–-> 107号日志,第2号块,第16个字节
###################################################################
7.执行EVENT事件的语句,OPEN数据库后立刻DUMP控制文件
注意事项:要把EVENT事件的语句执行上,不然实验所需数据不连贯哈哈
关于下面用到的10013/10015事件,分别是在Startup时跟踪事务恢复,在事务恢复后做Dump回退段头信息。
EVENT事件详见http://blog.csdn.net/q947817003/article/details/16359765
说明:–在这里用这两个语句不知道到底能不能DUMP出详细的REDO应用及回滚信息,从生成的TRACE文件来看有这方面信息,好像不太详细。。。
SYS@ bys3>alter session set events ‘10013 trace name context forever,level 1’;
Session altered.
SYS@ bys3>alter session set events ‘10015 trace name context forever,level 1’;
Session altered.
SYS@ bys3>alter database open;
Database altered.
SYS@ bys3>select value from v$diag_info where name like ‘Default%’;
VALUE
———————————————————————-
/u01/diag/rdbms/bys3/bys3/trace/bys3_ora_1955.trc
另开一会话在OPEN数据库后立刻执行:
SYS@ bys3>alter session set events ‘immediate trace name controlf level 12’;
Session altered.
SYS@ bys3>select value from v$diag_info where name like ‘Default%’;
VALUE
——————————————————————————
/u01/diag/rdbms/bys3/bys3/trace/bys3_ora_2108.trc

在OPEN过程中,ORACLE检查以下两项: 详见:http://blog.csdn.net/haibusuanyun/article/details/11271107
1.检查数据文件头中检查点计数(checkpoint CNT)是否与控制文件中检查点计数(checkpoint CNT)一致。以此确定数据文件是否来自恢复文件。
2.如果检查点计数检查通过,数据库进行第二次检查,检查数据文件头的开始SCN和控制文件中记录的该文件的结束SCN是否一致,如果控制文件中记录的结束SCN等于数据文件头的开始SCN,不需要实例恢复。
以上两次检查通过后,打开数据库,锁定数据文件,并将每个数据文件的结束SCN设置为无穷大。
##################################################################
8.分析OPEN时,通过ALERT日志查看的恢复过程–前滚
[oracle@bys3 ~]$ cat alert_bys3.log
Mon Dec 02 20:35:20 2013
alter database open
Beginning crash recovery of 1 threads –开始实例恢复
Started redo scan –开始扫描REDO日志
Completed redo scan –完成扫描REDO日志
read 202 KB redo, 104 data blocks need recovery –需要恢复的数据块104块,REDO日志202KB,按low cache rba–on disk rba来算是407-3=404个日志块,一个日志块大小是512字节,正好202KB。
Started redo application at
Thread 1: logseq 107, block 3 –这里可以看到,是从107号日志第3块开始应用REDO-与第3步中low cache rba:(0x6b.3.0)吻合
Recovery of Online Redo Log: Thread 1 Group 2 Seq 107 Reading mem 0
Mem# 0: /u01/oradata/bys3/redo02.log –所使用REDO日志文件,与第一步查询吻合。
Completed redo application of 0.16MB
Completed crash recovery at
Thread 1: logseq 107, block 407, scn 2011565 –完成实例恢复的位置,与第3步中on disk rba:(0x6b.197.0)吻合
104 data blocks read, 104 data blocks written, 202 redo k-bytes read –实例恢复涉及信息统计
Mon Dec 02 20:35:20 2013
LGWR: STARTING ARCH PROCESSES —-可以看到 实例恢复完成后,ARCH进程启动
Mon Dec 02 20:35:21 2013
ARC0 started with pid=19, OS id=2112
ARC0: Archival started
LGWR: STARTING ARCH PROCESSES COMPLETE
ARC0: STARTING ARCH PROCESSES
Thread 1 advanced to log sequence 108 (thread open)
Thread 1 opened at log sequence 108
Current log# 3 seq# 108 mem# 0: /u01/oradata/bys3/redo03.log
Successful open of redo thread 1 —-可以看到 实例恢复完成后,REDO日志启动
MTTR advisory is disabled because FAST_START_MTTR_TARGET is not set
Mon Dec 02 20:35:22 2013
SMON: enabling cache recovery
Mon Dec 02 20:35:22 2013
ARC1 started with pid=20, OS id=2116
Mon Dec 02 20:35:22 2013
ARC2 started with pid=21, OS id=2122
ARC1: Archival started
ARC2: Archival started
ARC1: Becoming the ‘no FAL’ ARCH
ARC1: Becoming the ‘no SRL’ ARCH
ARC2: Becoming the heartbeat ARCH
Mon Dec 02 20:35:23 2013
ARC3 started with pid=22, OS id=2126
还有段ALERT日志涉及回滚放在下一小节
################################################################
9.分析OPEN时,EVENT事件生成的TRACE中查看恢复过程–前滚
TRACE文件内容:
Thread 1 checkpoint: logseq 107, block 2, scn 1991217
cache-low rba: logseq 107, block 3 –这一段信息与MOUNT时DUMP控制文件的一样
on-disk rba: logseq 107, block 407, scn 1991565
start recovery at logseq 107, block 3, scn 0 –实例恢复起点: MOUNT时DUMP控制文件的low cache rba:(0x6b.3.0)

*** 2013-12-02 20:35:20.739
Started writing zeroblks thread 1 seq 107 blocks 407-414

*** 2013-12-02 20:35:20.745
Completed writing zeroblks thread 1 seq 107
==== Redo read statistics for thread 1 ====
Total physical reads (from disk and memory): 4096Kb
— Redo read_disk statistics –这个应该是实例恢复期间REDO读写统计
Read rate (ASYNC): 202Kb in 0.22s => 0.90 Mb/sec –REDO的速度-202KB与ALERT日志中对应
Longest record: 17Kb, moves: 0/287 (0%)
Longest LWN: 18Kb, moves: 0/99 (0%), moved: 0Mb
Last redo scn: 0x0000.001e638c (1991564) –最后一个REDO的SCN:与On-Disk RBA的SCN是1991565差1
———————————————-
—– Recovery Hash Table Statistics ———
Hash table buckets = 262144
Longest hash chain = 1
Average hash chain = 104/104 = 1.0
Max compares per lookup = 1
Avg compares per lookup = 1120/1224 = 0.9
———————————————-
*** 2013-12-02 20:35:20.749
KCRA: start recovery claims for 104 data blocks
*** 2013-12-02 20:35:20.781
KCRA: blocks processed = 104/104, claimed = 104, eliminated = 0
*** 2013-12-02 20:35:20.783
Recovery of Online Redo Log: Thread 1 Group 2 Seq 107 Reading mem 0
*** 2013-12-02 20:35:20.815
Completed redo application of 0.16MB –与ALERT中对照
*** 2013-12-02 20:35:20.944
Completed recovery checkpoint –可以看到 实例恢复完后做了检查点
—– Recovery Hash Table Statistics ———
Hash table buckets = 262144
Longest hash chain = 1
Average hash chain = 104/104 = 1.0
Max compares per lookup = 1
Avg compares per lookup = 1224/1224 = 1.0
———————————————-
Recovery sets nab of thread 1 seq 107 to 407 with 8 zeroblks
##################################################################
10.OPEN数据库时,通过ALERT日志及EVENT事件生成的TRACE中信息解析实例恢复的回滚
能力有限,解析不了,留着以后解决吧。
ALERT日志中回滚信息:
[1955] Successfully onlined Undo Tablespace 2. —
Undo initialization finished serial:0 start:985058364 end:985058674 diff:310 (3 seconds) –从这句看应该是有回滚操作,能力有限,没更好解释。。。
Verifying file header compatibility for 11g tablespace encryption..
Verifying 11g file header compatibility for tablespace encryption completed
SMON: enabling tx recovery
Database Characterset is AL32UTF8
Archived Log entry 77 added for thread 1 sequence 107 ID 0xc82cb897 dest 1:
No Resource Manager plan active
replication_dependency_tracking turned off (no async multimaster replication found)
Starting background process QMNC
Mon Dec 02 20:35:24 2013
QMNC started with pid=23, OS id=2130
ARC3: Archival started
ARC0: STARTING ARCH PROCESSES COMPLETE
Completed: alter database open
#############################
EVENT事件生成的TRACE中信息
*** 2013-12-02 20:35:22.989
Acq rollback segment SYSTEM
Rec rollback segment _SYSSMU1_3056155133$
Recovering transaction (1, 21) –看这里好像是SYSTEM回滚段做的事务恢复
Marking transaction (1, 21) dead
Rec rollback segment _SYSSMU2_3692097322$
Rec rollback segment _SYSSMU3_3366438251$
Rec rollback segment _SYSSMU4_3660460897$
Rec rollback segment _SYSSMU5_1917899003$
Rec rollback segment _SYSSMU6_3107841501$
Rec rollback segment _SYSSMU7_1420906157$
Rec rollback segment _SYSSMU8_2178365988$
Rec rollback segment _SYSSMU9_1689884801$
Rec rollback segment _SYSSMU10_3239467560$
*** 2013-12-02 20:35:23.225
Recovering transaction (1, 21) —-这个好像是回滚的第一步中未提交的事务,不知道具体如何查询验证
Marking transaction (1, 21) dead
Acq rollback segment _SYSSMU1_3056155133$
Acq rollback segment _SYSSMU2_3692097322$
Acq rollback segment _SYSSMU3_3366438251$
Acq rollback segment _SYSSMU4_3660460897$
Acq rollback segment _SYSSMU5_1917899003$
Acq rollback segment _SYSSMU6_3107841501$
Acq rollback segment _SYSSMU7_1420906157$
Acq rollback segment _SYSSMU8_2178365988$
Acq rollback segment _SYSSMU9_1689884801$
Acq rollback segment _SYSSMU10_3239467560$
kwqmnich: current time:: 12: 35: 23: 0
kwqmnich: instance no 0 repartition flag 1
kwqmnich: initialized job cache structure
*** 2013-12-02 20:35:24.574
ktsmgtur(): TUR was not tuned for 25928 secs
ktsmg_advance_slot(): MMNL advances slot after 25928 seconds
################################################################################
11.分析OPEN后的控制文件信息–能力有限分析较少
TRACE文件内容
DATABASE ENTRY
***************************************************************************
(size = 316, compat size = 316, section max = 1, section in-use = 1,
last-recid= 0, old-recno = 0, last-recno = 0)
(extent = 1, blkno = 1, numrecs = 1)
11/14/2013 14:23:19
DB Name “BYS3”
Database flags = 0x00404001 0x00001200
Controlfile Creation Timestamp 11/14/2013 14:23:21
Incmplt recovery scn: 0x0000.00000000
Resetlogs scn: 0x0000.00000001 Resetlogs Timestamp 11/14/2013 14:23:19
Prior resetlogs scn: 0x0000.00000000 Prior resetlogs Timestamp 01/01/1988 00:00:00
Redo Version: compatible=0xb200000
#Data files = 4, #Online files = 4
Database checkpoint: Thread=1 scn: 0x0000.001eb1b0 –检查点已经更新
Threads: #Enabled=1, #Open=1, Head=1, Tail=1
enabled threads: 01000000 00000000 00000000 00000000 00000000 00000000
Max log members = 5, Max data members = 1
Arch list: Head=3, Tail=3, Force scn: 0x0000.001b6c94scn: 0x0000.00000000
Activation ID: 3358374039
SCN compatibility 1
Auto-rollover enabled
Controlfile Checkpointed at scn: 0x0000.001eb212 12/02/2013 20:35:25
thread:0 rba:(0x0.0.0)
enabled threads: 00000000 00000000 00000000 00000000 00000000 00000000

***************************************************************************
CHECKPOINT PROGRESS RECORDS
***************************************************************************
(size = 8180, compat size = 8180, section max = 4, section in-use = 0,
last-recid= 0, old-recno = 0, last-recno = 0)
(extent = 1, blkno = 2, numrecs = 4)
THREAD #1 – status:0x2 flags:0x0 dirty:43
low cache rba:(0x6c.3.0) on disk rba:(0x6c.76.0) –on disk rba已经递增
on disk scn: 0x0000.001eb212 12/02/2013 20:35:24 –on disk scn已经递增
resetlogs scn: 0x0000.00000001 11/14/2013 14:23:19
heartbeat: 833141767 mount id: 3360007946

ORACLE实例恢复过程详细分析–使用dump、BBED等多种工具结合分析