摘自:tom大师的书----Thomas Kyte著的oracle9i/10g编程艺术
老是有人问我这个问题。这样做会得到一条警告消息(可以在服务器上的alert.log中看到):
Thread 1 cannot allocate new log, sequence 1466
Checkpoint not complete
Current log# 3 seq# 1465 mem# 0: /home/ora10g/oradata/ora10g/redo03.log
警告消息中也可能指出Archival required而不是Checkpoint not complete,但是效果几乎都一样。DBA必须当心这种情况。如果数据库试图重用一个在线重做日志文件,但是发现做不到,就会把这样一条消息写到服务器上的alert.log中。如果DBWR还没有完成重做日志所保护数据的检查点(checkpointing),或者ARCH还没有把重做日志文件复制到归档目标,就会发生这种情况。对最终用户来说,这个时间点上数据库实际上停止了。它会原地不动。DBWR或ARCH将得到最大的优先级以将redo块刷新输出的磁盘。完成了检查点或归档之后,一切又回归正常。数据库之所以暂停用户的活动,这是因为此时已经没地方记录用户所做的修改了。Oracle试图重用一个在线重做日志文件,但是由于归档进程尚未完成这个文件的复制(Archival required),所以Oracle必须等待(相应地,最终用户也必须等待),直到能安全地重用这个重做日志文件为止。
如果你看到会话因为一个“日志文件切换”、“日志缓冲区空间”或“日志文件切换检查点或归档未完成”等待了很长时间,就很可能遇到了这个问题。如果日志文件大小不合适,或者DBWR和ARCH太慢(需要由DBA或系统管理员调优),在漫长的数据库修改期间,你就会注意到这个问题。我经常看到未定制的“起始”数据库就存在这个问题。“起始”数据库一般会把重做日志的大小定得太小,不适用较大的工作量(包括数据字典本身的起始数据库构建)。一旦启动数据库的加载,你会注意到,前1,000行进行得很快,然后就会呈喷射状进行:1,000进行得很快,然后暂停,接下来又进行得很快,然后又暂停,如此等等。这些就是很明确的提示,说明你遭遇了这个问题。