今天接到一資料庫運行非常緩慢﹐登陸到主機查看alert log,發現有"Thread 1 cannot allocate new log, sequence 69271"諸多錯誤提示﹐管理員告知是standby 架構﹐首先懷疑是standby服務有問題﹐先取消遠程歸檔路徑﹐做日志切換﹐發現報錯"checkpoint not complete"﹐再進一步追蹤alert log﹐發現之前也出現了類似錯誤﹐這是發現日志切換比平時頻繁很多﹐查看日志有回退動作﹐其會寫較多的redo﹐懷疑日志切換頻繁導致archive無法正常完成﹐第二步驟﹐重啟數據庫為noarchivelog模式﹐發現問題依然。第三步驟﹐增大logfile從200M到400M﹐調整mttr從300至3600﹐問題依舊。第四步驟﹐增大dbwr進程數由一改為二﹐啟用archivelog模式﹐數據庫ok。
我想問題的原因在于﹕回退事務造成redo條目寫的過于頻繁﹐在發生checkpoing時﹐上一次checkpoing尚沒有完成﹐dbwr寫不過來﹐從wait event(log file switch (checkpoing incomplete))即可得出。
Log File Switch-日志文件切换
当这个等待出现时,表示所有的提交(commit)的请求都需要等待"日志文件切换"的完成。
LogfileSwitch主要包含两个子事件:
logfileswitch(archiving needed)
logfileswitch(checkpointincomplete)
logfileswitch(archiving needed)
这个等待事件出现时通常是因为日志组循环写满以后,第一个日志归档尚未完成,出现该等待。出现该等待,可能表示io 存在问题。解决办法:
可以考虑增大日志文件和增加日志组
移动归档文件到快速磁盘
调整log_archive_max_processes .
logfileswitch(checkpointincomplete)-日志切换(检查点未完成)
当你的日志组都写完以后,LGWR 试图写第一个logfile,如果这时数据库没有完成写出记录在第一个logfile中的dirty 块时(例如第一个检查点未完成),该等待事件出现。
该等待事件通常表示你的DBWR 写出速度太慢或者IO 存在问题。
为解决该问题,你可能需要考虑增加额外的DBWR 或者增加你的日志组或日志文件大小。