假设数据库存在两个日志组log1和log2,首先,-->log1-->log2-->log1,此时(log2切换到log1)触发checkpoint,该checkpoint will flush dirty block to datafile,从而触发DBWn书写dirty buffer,等到log1覆盖的dirty block全部被写入datafile后才能使用log1(循环使用),如果DBWn写入过慢,LGWR必须等待DBWn完成,则这时会出现“checkpoint not completed!”
作者:ZALBB 时间:04-09-28 16:42
我理解的比较简单:归档日志没数据库写日志快。比如:数据库有两组日志,日志1还在归档,
日志2已经被写满了,此时要覆盖日志1,但日志1还没被归档完毕(COPY完毕),结果就出现
此提示。
解决方法:增加日志组,多些缓冲时间,以便归档。
是 lgwr等待将被覆盖的 logfile 对应的 dirty buffer 被写入数据文件,也就是io 繁忙导致 dbwr写太慢
quote:
最初由 biti_rainy 发布
是 lgwr等待将被覆盖的 logfile 对应的 dirty buffer 被写入数据文件,也就是io 繁忙导致 dbwr写太慢
quote:
最初由 ZALBB 发布
若是这种解释,那就不是增加日志组可解决了。
如果归档没有完成的话,Alert中提示如下:
Thread 1 cannot allocate new log, sequence 12
All online logs needed archiving
代码:
SQL> connect sys/richel@testdb as sysdba; Connected. SQL> archive log list; Database log mode Archive Mode
Automatic archival Enabled
Archive destination D:oracleoradataaxisoft2archive
Oldest online log sequence 383
Next log sequence to archive 385
Current log sequence 385
SQL> alter system archive log stop;
System altered.
SQL> archive log list; Database log mode Archive Mode
Automatic archival Disabled
Archive destination D:oracleoradataaxisoft1archive
Oldest online log sequence 3
Next log sequence to archive 7
Current log sequence 7
SQL> SELECT COUNT(*) FROM richel.test;
COUNT(*)
----------
6000
SQL> insert into richel.test select * from richel.test;
6000 rows created.
SQL> insert into richel.test select * from richel.test;
12000 rows created. SQL> insert into richel.test select * from richel.test;
(此时系统hang,查看alert,发现上述警告信息。)
开启另一个会话:
SQL> alter system archive log group 1;
System altered.
而后,插入得以继续完成。
SQL> commit;
Commit complete.
Re: 对“checkpoint not completed!”的理解,欢迎大家讨论
quote:
最初由 nattyneat 发布对“checkpoint not completed!”的理解,欢迎大家讨论
假设数据库存在两个日志组log1和log2,首先,-->log1-->log2-->log1,此时(log2切换到log1)触发checkpoint,该checkpoint will flush dirty block to datafile,从而触发DBWn书写dirty buffer,等到log1覆盖的dirty block全部被写入datafile后才能使用log1(循环使用),如果DBWn写入过慢,LGWR必须等待DBWn完成,则这时会出现“checkpoint not completed!”
quote:
最初由 ZALBB 发布我理解的比较简单:归档日志没数据库写日志快。比如:数据库有两组日志,日志1还在归档,
日志2已经被写满了,此时要覆盖日志1,但日志1还没被归档完毕(COPY完毕),结果就出现
此提示。
解决方法:增加日志组,多些缓冲时间,以便归档。
那么如果db是非归档模式,仅仅在高峰时间出现
Thread 1 cannot allocate new log, sequence 286857
Checkpoint not complete
这样的情况的话,应该如何解决呢?
增加日志组??
quote:
最初由 remen 发布那么如果db是非归档模式,仅仅在高峰时间出现
Thread 1 cannot allocate new log, sequence 286857
Checkpoint not complete
这样的情况的话,应该如何解决呢?
谢谢回复!
但是我们的系统平时大概18分钟切换一次日志,唯独在中午运行mrp计划的时候切换比较频繁,同时提示检查点无法完成,所以我觉得日志文件的大小应该差不多了,增加日志组才是首选,请问我的推断正确吗?
难道有什么不正确的吗? 都到这个份上了干吗那么怀疑自己呢
呵呵,谢谢!
另外,如果出现Checkpoint not complete,会造成什么后果呢?
写日志的进程等待归档完成???那么再归档没完成之前的这段时间日志往哪个日志组写呢?
比如现在group 2写满了,要开始写group 1,但是1的归档还没完成,这个时候就出现了Checkpoint not complete,那么这个时候1是不能写的,那日志往哪里写呢?继续重用2??这样的话,2中的数据不就被覆盖了?它可还没有归档呢呀!
另外,上面讨论的都是归档模式下的,但是非归档呢?如果出现Checkpoint not complete意味着什么呢?DBWn速度太慢??
Checkpoint not complete 那数据库就暂时地hang住了呗
非归档,当然是 dbwr 速度太慢(本质上就是io存在问题)
谢谢!
既然这样,那么如果这时候数据库遭到破坏,需要利用归档日志来恢复,仅仅凭借这些日志能够完全恢复吗?
因为既然数据库hang住了,那么这段时间内发生的数据库的改变就没有地方可以写,也就造成了归档日志的不完整,对吗?
ft
数据库hang住了,这段时间数据库能发生改变吗?无法产生任何日志!也就意味着数据库跟死了一样,普通用户都无法登陆!
所有时间均为 . 现在时间是 09:41.
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/35489/viewspace-84823/,如需转载,请注明出处,否则将追究法律责任。