糊涂了,switch logfile 是否做checkpoint?
如果说switch logfile不做检查点,那何来的checkpoint not complete问题?如果说switch logfile做检查点,那为何做完switch logfile之前之后,
select checkpoint_change# from v$database;
select checkpoint_change# from v$datafile;
select checkpoint_change# from v$datafile_header;
查出来的值都没变过?
个人的理解是,做检查点,并且此检查点分为checkpoint begin与checkpoint end,两者间隔很短,并且,DBWR会当前日志中对应的数据写入磁盘。所以如果到了checkpoint end发生了,DBWR仍然没有写完,则会发发生checkpoint incomplete。
这个checkpoint既不是完全checkpoint,也不是增量检查点。 我的理解:检查点分为完全检查点和增量检查点,完全检查点会触发dbwr,增量检查点不会,只是将lrba写到control file中,10g后switch logfile触发的是增量检查点,这时ORACLE会把lrba记录到control file 和 data file中,所以switch logfile 会触发增量检查点;
checkpoint incomplete:当switch logfile发生时,需要覆盖某个redo log,此时发现将要覆盖的redo log是active状态(lgwr将dirty block写入了redo log,但是dbwr还没有完全将dirty block写入data file),这时发生检查点未完成事件。 说的空泛了些,没描述到细节上。从细节动作上描述一次checkpoint incomplete是如何发生的。
chenyu的意思是说,当logfile switch 发生的时候,如果将要覆盖的redo log 是active,则一定会发生checkpoint incomplete吗?
可并不是这样的。 还有,据我所知,low-rba是纪录到controlfile上,标志着恢复的起点,但是datafile 中的是on-disk rba,标志着恢复的终点 kevin.zhang 发表于 2010-11-23 14:14 static/image/common/back.gif
还有,据我所知,low-rba是纪录到controlfile上,标志着恢复的起点,但是datafile 中的是on-disk rba,标志 ...
恢复的终点始终在在current log中,在正常shutdown immediate之前恢复终点的scn是不知道的,又怎么会写入到data file中。 这么说来,datafile header中记录的确实应该是恢复起点rba。
虽然rba与检查点总是同时出现,不过这里貌似rba和我说的问题并没有什么联系吧。
“这时ORACLE会把lrba记录到control file 和 data file中,所以switch logfile 会触发增量检查点"。
我不是问发生switch log 时oracle做了什么,我问的是oracle做了什么动作后遇到了什么问题会发生checkpoint incomplete 还有,incremental checkpoint每三秒一次,我行我素,和switch logfile 应该没什么关系。
switch logfile 时的checkpoint:
Beginning log switch checkpoint up to RBA , SCN: 31836587
incremental的checkpoint:
Incremental checkpoint up to RBA , current log tail at RBA
本帖最后由 chenyu 于 2010-11-23 15:38 编辑
我问的是oracle做了什么动作后遇到了什么问题会发生checkpoint incomplete
oracle在发生switch logfile时->遇到了将被覆盖的logfile是active状态->checkpoint incomplete,其本质原因是上一次lgwr写入redo log已经完成了,但是dbwr还没有把dirty blocks写入data file,结果又发生几次switch logfile,结果导致当前的log file还是active,这时发生checkpoint incomplete
incremental checkpoint每三秒一次,我行我素,和switch logfile 应该没什么关系
没错,但是增量检查点还有其他的触发机制即在switch logfile时也会触发增量检查点的;这可以通过更改log_checkpoints_to_alert来观察,如下alert日志:
Tue Nov 23 15:32:02 2010
ALTER SYSTEM SET log_checkpoints_to_alert=TRUE SCOPE=BOTH;//设置参数后,在客户端执行alter system switch logfile,就会发现触发checkpoint.
Tue Nov 23 15:32:25 2010
Beginning log switch checkpoint up to RBA , SCN: 674563
Thread 1 advanced to log sequence 12
Current log# 1 seq# 12 mem# 0: /u01/app/oracle/oradata/PROD/disk1/redo01.log
Current log# 1 seq# 12 mem# 1: /u01/app/oracle/oradata/PROD/disk2/redo01.log
如果说switch logfile做检查点,那为何做完switch logfile之前之后,
select checkpoint_change# from v$database;
select checkpoint_change# from v$datafile;
select checkpoint_change# from v$datafile_header;
查出来的值都没变过?
你应该查v$archived_log,因为switch logfile会导致archive,controlfile会记录这个信息,而checkpoint正是要把lrba记录到controlfile中,v$archived_log可以体现出这个变化,你还可以通过转储control file来验证这一点;这个scn和v$database 的SCN是不一样的,我的理解是v$database、v$datafile等的SCN是ORACLE控制的,有很多原因可以引起他的改变如事务的commit等。但是和checkpoint可能没有必然的联系。
SQL> select max(FIRST_CHANGE#) FIRST_CHANGE#,max(NEXT_CHANGE#) NEXT_CHANGE# from v$archived_log;
FIRST_CHANGE# NEXT_CHANGE#
------------- ------------
673698 674563
SQL> alter system switch logfile;
System altered.
SQL> select max(FIRST_CHANGE#) FIRST_CHANGE#,max(NEXT_CHANGE#) NEXT_CHANGE# from v$archived_log;
FIRST_CHANGE# NEXT_CHANGE#
------------- ------------
674563 674842
页:
[1]
2