转存控制文件查看其中的内容:
alter session set events 'immediate trace name controlf level 8' ;
select value from v$diag_info where name='Default Trace File';
以上select获得当前session的转储文件的名称。
2.2 SCN :是数据库中重要的数据结构,标识数据库某个确切时刻提交的版本。
oracle数据库是通过SCN和CHECKPOINT来保证数据库的一致性、可恢复性等重要属性。
在事务提交时,它被赋予一个唯一的标示事务的SCN。可看作oracle数据库内部时钟机制,可以被看作逻辑时钟,每个数据库都有一个全局的SCN生成器。
2.2.2 获取SCN
select dbms_flashback.get_system_change_number from dual;
转储数据文件头,观察其具体信息及检查点记录等:
alter session set events 'immediate trace name file_hdrs level 10' ;
select value from v$diag_info where name='Default Trace File';
2.3 检查点(checkpoint)
数据库事件,由CKPT进程触发,当检查点发生时,CKPT进程会负责通知DBWR进程将脏数据(DIRTY BUFFER)写到数据文件上。CKPT进程的另外一个职责是负责更新数据文件头及控制文件上的检查点信息。
当检查点发生时,(此时的 SCN 被称为 Checkpoint SCN ) Oracle会通知 DBWR 进程,把修改过的数据,也就是此Checkpoint SCN 之前的脏数据(dirty data)从buffer cache 写入磁盘,当写入完成后,CKPT进程则会相应更新控制文件和数据文件头,记录检查点信息,标识变更。
Checkpoint SCN 可以从数据库中查询得到:
select file#,checkpoint_change#,to_char(checkpoint_time,'yyyy-mm-dd hh24:mi:ss') CPT from v$datafile ;
select dbif,checkpoint_change# from v$database ;
2.3.2 常规检查点与增量检查点
常规检查点(complete checkpoint)按特定的条件触发,log_checkpoint_interval\log_checkpoint_timeout参数设置及log switch等条件触发,触发时定入完成后会同时更新数据文件头以及控制文件记录检查点信息。
增量检查点:incremental checkpoint 。引入了检测点对列(checkpoint queue,CKPTQ)机制
通过检查点,数据库可以将以前的全量写出变为增量渐进写出,从而可以极大地减少对数据库性能的影响;检查点对列则进一步地将RBA和检查点关联起来,从而可以通过检查点来确定恢复的起点。
检查点队列在数据库内部通过latch 保护:
select name,gets,misses from v$latch where name='checkpoint queue latch';
checkpoint queue latch 存在多个子latch ,可以通过 v$latch_children视图查询:
select name,gets,misses from v$latch_children where name='checkpoint queue latch'
另一个影响checkpoint SCN 的是FILEQ 队列,在Buffer Cache 中,每个buffer 的header 上都存在CKPTQ 以及 FILEQ 队列信息,通过如下命令可以转储Buffer cache信息
(在测试环境中尝试)
alter session set events 'immediate trace name buffers level 10';
其中BH 段中有ckptq[xxx.xxx],fileq[xxx,xxx],中括号中代表前一个块和后一个块的地址。
grep xxx_ora_1467.trc | grep -v NULL
可以得到对应块的对列 顺序,同样 在SGA中存在一块内存区域用于记录这个检查点队列:
select name,bytes from v$sgastat where uppper(name) like '%CHECKPOINT%';
从oracle 8i开始,只有以下两种情况下才会出现完全检查点:
- alter system checkpoint ;
- shutdown (除abort方式外)。
log switch 事件同样触发的是增量检查点,但是在log switch 触发的检查点会促使数据文件头与控制文件信息同步。
2.3.4 控制文件与数据文件头信息
CKPT的一项任务是更新数据文件头和控制文件,记录检查点信息,这些信息对于数据库的恢复和完整性校验都至关重要,接下来看一下控制文件 和数据文件 头的记录信息:
alter session set events 'immediate trace name file_hdrs level 10';
2.3.5 数据库的启动验证
转储控制文件和数据文件 ,比较 控制文件中的 checkpoint cnt。
关于控制文件、数据文件以及在启动过程的校验,我们可以从另一个角度进行进一不步验证。用以下步骤跟踪库的启动过程,可以获得跟踪文件
SQL> startup nomount ;
SQL> alter session set events='10046 trace name context forever,level 12';
SQL> alter database mount ;
2.3.7 FAST_START_MTTR_TARGET
在数据库中,增量检查点是通过 Fast_Start Checkpointing 特性来实现的。从8i开始,这一特性包含在ORACLE企业版的Fast-Start Fault Recovery 组件之中:
select * from v$version where rownum < 2;
select * from v$option where parameter ='Fast-Start Fault Recovery';
oracle推荐设置fast_start_mttr_target参数 代替fast_start_io_target\log_checkpoint_timeout\log_checkpoint_interval参数
MTTR建议视图:
select * from v$mttr_target_advice;
该视图评估在不同fast_start_mttr_target设置下中,系统需要执行的I/O次数等操作。
同时 视图对信息的收集 受到 参数 statistics_level 参数 值 的影响 。
show parameter statistics_level
也可以查询 v$statistics_level视图 来查询 MTTR AdviceR 的当时设置:
select statistics_name, description from v$statistics_level where statistics_name='MTTR Advice';
数据库当时的实例 恢复 状态可以通过视图V$INSTANCE_RECOVERY 查询得到:
select RECOVERY_ESTIMATED_IOS reio,ACTUAL_REDO_BLKS arb,TARGET_REDO_BLKS trb,LOG_FILE_SIZE_REDO_BLKS lfsrb,LOG_CHKPT_TIMEOUT_REDO_BLKS lctrb,LOG_CHKPT_INTERVAL_REDO_BLKS lcirb,FAST_START_IO_TARGET_REDO_BLKS fsiotrb,TARGET_MTTR tmttr,ESTIMATED_MTTR emttr,CKPT_BLOCK_WRITES cbw from v$instance_recovery ;
REIO ARB TRB LFSRB LCTRB LCIRB FSIOTRB TMTTR EMTTR CBW
---------- ---------- ---------- ---------- ---------- ---------- ---------- ---------- ---------- ----------
47 115 4370 6794766 4370 0 18 292964
- 通常 TARGET_MTTR(代表的期望平均恢复时间) 要等于 fast_start_mttr_target参数设置值
- 当ESTIMATED_MTTR 大于 接近 fast_start_mttr_target 或 target_mttr时 系统会出现检查点。此时DBWR正忙于写出,甚至出现checkpoint 不能及时完成的情况。
FAST_START_MTTR_TARGET 设置成 0 即是自动调整检查点。
SQL> select RECOVERY_ESTIMATED_IOS reio,TARGET_MTTR tmttr,ESTIMATED_MTTR tmttr,WRITES_MTTR wmttr,WRITES_OTHER_SETTINGS woset,CKPT_BLOCK_WRITES ckptbw,WRITES_AUTOTUNE wauto,WRITES_FULL_THREAD_CKPT wftckpt from v$instance_recovery ;
REIO TMTTR TMTTR WMTTR WOSET CKPTBW WAUTO WFTCKPT
---------- ---------- ---------- ---------- ---------- ---------- ---------- ----------
10265 0 51 0 0 294026 1347981 0
SQL>
以上writes_autotune 字段值就是指由于自动调整检查点执行的写出次数据 ,而ckpt_block_writes指的是由于检查点写出的block的数量。
以上语句中的writes_autotune 和 下面结果的第一行比较:
select name,value from v$sysstat where upper(name) like '%DBWR%';--第一行
自动调整检查点下,两者应该是相等的。(11g要减去 tablespace 的ckpt)
2.3.10 检查点信息及恢复的起点:
alter session set events 'immediate trace name controlf level 8';
select value from v$diag_info where name = 'Default Trace File';
***************************************************************************
CHECKPOINT PROGRESS RECORDS
***************************************************************************
(size = 8180, compat size = 8180, section max = 11, section in-use = 0,
last-recid= 0, old-recno = 0, last-recno = 0)
(extent = 1, blkno = 2, numrecs = 11)
*** 2012-07-25 15:18:13.263
THREAD #1 - status:0x2 flags:0x0 dirty:54010
low cache rba:(0x7a.33be5f.0) on disk rba:(0x7c.1657da.0)
on disk scn: 0x0005.e06aef77 07/25/2012 15:18:10
resetlogs scn: 0x0000.00000001 07/13/2012 20:02:34
heartbeat: 789056516 mount id: 1316572153
THREAD #2 - status:0x0 flags:0x0 dirty:0
low cache rba:(0x0.0.0) on disk rba:(0x0.0.0)
on disk scn: 0x0000.00000000 01/01/1988 00:00:00
resetlogs scn: 0x0000.00000000 01/01/1988 00:00:00
heartbeat: 0 mount id: 0
其中的
low cache rba 指在cache中 ,最低rba地址,崩溃恢复从这开始。
on disk rba 是磁盘上最高重做值,在进行恢复时应用重做至少要达到这个值。
2.3.11 正常关闭数据库的状况
SQL> shutdown immediate
SQL> startup mount
SQL> alter session set events 'immediate trace name CONTROLF level 12';
SQL> @gettrcname
2.3.12
可用 fast_start_parallel_rollback 参数来控制并行回滚(false,low,high).
2.3.13 数据库并行恢复案例一则
无commit=y 的导出操作
imp username/passwd file=D:\bk\cf.dmp log=D:\bk\cf.log ignore=y buffer=819200 feedback=10000
由于没有分批量提交,当导入系统影响大,imp被中断。中断导致了这个大事务回滚,