最近在alter日誌中發現 Checkpoint not complete 資訊
產生此問題的原因具體分析:
首先說一下checkpoint 是什嗎?
chkpoint是一個資料庫的內部機制,它存在有兩個目的:
1. 保證資料的一致性
系統發生檢查點將出發DBWR進程將緩衝區中的髒資料區塊寫入到資料檔案,同時更新資料檔案中的SCN號,記錄聯機重做記錄檔中LRBA(low redo block address)的位置到控制檔案中,當在寫入過程中,突然執行個體崩潰,髒資料區塊沒有完全寫入到資料檔案中。當執行個體啟動的時候,會檢查控制檔案中的 終止SCN號,(四種SCN)這時候發現是空的(資料庫正常啟動並執行時候是無窮大或者保持為空白),就認為資料庫沒有正常關閉,需要執行個體恢複,於是SMON進程根據控制檔案中的SCN號,到重做記錄檔中取出重做條目重現執行個體崩潰的那個狀態。
2. 資料庫執行個體崩潰後的執行個體恢複
當執行個體恢複的時候,到底從重做記錄檔的什麼位置開始恢複呢?檢查點checkpoint就是記錄了一個SCN號,當執行個體回複的時候從最近的這個檢查點做恢複,不必全部恢複重做日誌的內容,減少了恢復。
日誌切換會觸發檢查點,當檢查點觸發後會引起DBWR進程將髒資料區塊寫入資料檔案,這個時候寫入資料檔案的髒資料區塊已經都寫入了聯機重做日誌中,是安全的,當日誌緩衝區的日誌寫滿需要切換記錄檔的時候,由於下一個記錄檔對應的髒資料區塊沒有完全寫入到資料檔案中,所以不能被覆蓋,於是就發生了Checkpoint not complete。
這時候可能是磁碟的原因導致DBWR寫磁碟很慢,或者DBWR進程效率不高,以至於在發生日誌切換的時候沒有課覆蓋的記錄檔。這時候可以添加DBWR進程的數,或者添加記錄檔組,來解決這個問題。
遂添加一個日誌組:
用sysdba登入
alter database add logfile gropu 4 ‘$Oracle_HOME/oradata/SID/redo04.log’ size 100M;
切換記錄檔
alter system switch logfile;
查看當前的記錄檔是否在使用
select * from v$log