本帖最后由 hexel 于 2013-5-9 10:14 编辑
郭老师,小弟带着问题来的,求指导! 日志切换检查点是一种特殊的检查点:考虑到系统负载,日志切换时候,oracle并不立即把之前的重做日志保护的脏数据写入数据文件。 实验如下(参考了roger大师的实验 ): 实验环境:11gR2 查看重做日志文件: SYS AS SYSDBA > select GROUP#,THREAD#,SEQUENCE#,STATUS,FIRST_CHANGE#,NEXT_CHANGE# from v$log; GROUP#| THREAD#| SEQUENCE#|STATUS |FIRST_CHANGE#|NEXT_CHANGE# ----------|----------|----------|----------------|-------------|------------ 1| 1| 37|INACTIVE | 4537416| 4537426 2| 1| 38|INACTIVE | 4537426| 4537434 3| 1| 39|CURRENT | 4537434| 2.8147E+14 查看增量检查点信息: SYS ASSYSDBA > SELECTCPLRBA_SEQ,CPLRBA_BNO,CPLRBA_BOF,CPODR_SEQ,CPODR_BNO,CPODR_BOF,CPODS,CPDRT,CPHBTFROM x$kcccp; CPLRBA_SEQ|CPLRBA_BNO|CPLRBA_BOF|CPODR_SEQ| CPODR_BNO| CPODR_BOF|CPODS | CPDRT| CPHBT ----------|----------|----------|----------|----------|----------|----------------|----------|---------- 4294967295|4294967295| 65535| 39| 2| 0|4537434 | 0| 814881181 x$kcccp结果显示控制文件low cacherba为全f,没有脏块了。 建表,插入数据: insert into hx.test select* from dba_objects;
1. 执行第一次日志切换: SYS AS SYSDBA >altersystem switch logfile; 重做日志文件使用状况: SYS AS SYSDBA > select GROUP#,THREAD#,SEQUENCE#,STATUS,FIRST_CHANGE#,NEXT_CHANGE# from v$log; GROUP#| THREAD#| SEQUENCE#|STATUS |FIRST_CHANGE#|NEXT_CHANGE# ----------|----------|----------|----------------|-------------|------------ 1| 1| 40|CURRENT | 4537578| 2.8147E+14 2| 1| 38|INACTIVE | 4537426| 4537434 3| 1| 39|ACTIVE | 4537434| 4537578 结果表明,3号日志有当前恢复需要的重做日志,而1号日志是当前使用的重做日志 查看报警日志,结果显示,分配了一个检查点任务,要求把RBA[0x28.2.10]之前的重做日志保护的脏数据写入数据文件,实际就是要求写完3号日志保护的buffercache Beginning log switchcheckpoint up to RBA [0x28.2.10], SCN: 4537578 Thread 1 advanced to logsequence 40 (LGWR switch) Current log# 1 seq# 40 mem# 0:/u01/oradata2/hx/redo01.log 看x$kcccp,当前low cache rba 仍是在3号重做日志: SYS AS SYSDBA > SELECTCPLRBA_SEQ,CPLRBA_BNO,CPLRBA_BOF,CPODR_SEQ,CPODR_BNO,CPODR_BOF,CPODS,CPDRT,CPHBTFROM x$kcccp; CPLRBA_SEQ|CPLRBA_BNO|CPLRBA_BOF|CPODR_SEQ| CPODR_BNO| CPODR_BOF|CPODS | CPDRT| CPHBT ----------|----------|----------|----------|----------|----------|----------------|----------|---------- 39| 3| 0| 40| 2| 0|4537578 | 16| 814881304
2. 第二次日志切换: SYS AS SYSDBA >altersystem switch logfile; SYS AS SYSDBA > select GROUP#,THREAD#,SEQUENCE#,STATUS,FIRST_CHANGE#,NEXT_CHANGE# from v$log; GROUP#| THREAD#| SEQUENCE#|STATUS |FIRST_CHANGE#|NEXT_CHANGE# ----------|----------|----------|----------------|-------------|------------ 1| 1| 40|ACTIVE | 4537578| 4537591 2| 1| 41|CURRENT | 4537591| 2.8147E+14 3| 1| 39|ACTIVE | 4537434| 4537578 重做日志文件结果显示,3号日志和1号日志虽然不是当前使用的,但是包含了恢复需要的重做日志。 看告警日志文件,又分配了一个任务,要求把RBA[0x29.2.10]之前的重做日志保护的buffercache写完。 Beginning log switchcheckpoint up to RBA [0x29.2.10], SCN: 4537591 Thread 1 advanced to logsequence 41 (LGWR switch) Current log# 2 seq# 41 mem# 0:/u01/oradata2/hx/redo02.log 看x$kcccp视图,low cache rba一直没变 SYS AS SYSDBA > SELECTCPLRBA_SEQ,CPLRBA_BNO,CPLRBA_BOF,CPODR_SEQ,CPODR_BNO,CPODR_BOF,CPODS,CPDRT,CPHBTFROM x$kcccp; CPLRBA_SEQ|CPLRBA_BNO|CPLRBA_BOF|CPODR_SEQ| CPODR_BNO| CPODR_BOF|CPODS | CPDRT| CPHBT ----------|----------|----------|----------|----------|----------|----------------|----------|---------- 39| 3| 0| 41| 2| 0|4537591 | 16| 814881318
3. 第三次切换 SYS AS SYSDBA >altersystem switch logfile; 看日志文件,结果显示,1号和2号日志均没有恢复需要的重做日志了,可以猜想,他们保护的buffercache全部写完了,他们对恢复不起作用了。 SYS AS SYSDBA >startlog; GROUP#| THREAD#| SEQUENCE#|STATUS |FIRST_CHANGE#|NEXT_CHANGE# ----------|----------|----------|----------------|-------------|------------ 1| 1| 40|INACTIVE | 4537578| 4537591 2| 1| 41|INACTIVE | 4537591| 4537609 3| 1| 42|CURRENT | 4537609| 2.8147E+14 SYS AS SYSDBA >SELECT CPLRBA_SEQ,CPLRBA_BNO,CPLRBA_BOF,CPODR_SEQ,CPODR_BNO,CPODR_BOF,CPODS,CPDRT,CPHBT FROM x$kccc; 看x$kcccp,的确没有脏块了。 CPLRBA_SEQ|CPLRBA_BNO|CPLRBA_BOF|CPODR_SEQ| CPODR_BNO| CPODR_BOF|CPODS | CPDRT| CPHBT ----------|----------|----------|----------|----------|----------|----------------|----------|---------- 4294967295|4294967295| 65535| 42| 3| 0|4537612 | 0| 814881333 那么,这其中都发生了什么呢? 告警日志文件: Wed May 08 23:27:51 2013 Thread 1 cannot allocatenew log, sequence 42 Checkpoint not complete Current log# 2 seq# 41 mem# 0:/u01/oradata2/hx/redo02.log Wed May 08 23:27:55 2013 Completed checkpoint up toRBA [0x29.2.10], SCN: 4537591 Completed checkpoint up toRBA [0x28.2.10], SCN: 4537578 Beginning log switchcheckpoint up to RBA [0x2a.2.10], SCN: 4537609 Thread 1 advanced to logsequence 42 (LGWR switch) Current log# 3 seq# 42 mem# 0:/u01/oradata2/hx/redo03.log Completed checkpoint up toRBA [0x2a.2.10], SCN: 4537609 分析上面的日志,我的简单理解:oracle企图切换到3号日志,但是蓝色部分表明,3号日志包含了未完成的检查点,当前使用的还是2号文件。于是,oracle先把之前的脏块写完(包含1、2、3号重做日志保护的buffer cache全部写出),再切换到3号日志。而且这里的确是花了较长时间的,检查点也变了。也就是说,这里实际是做了一次完全检查点? 郭老师,上面两行红色字体我不理解:为什么RBA[0x29.2.10]完成在RBA[0x28.2.10]之前??
|