天天看點

Buffer cache spillover: only buffers

在啟動資料庫 (指database open)時若需要recovery的redo較多,涉及到的資料塊多時可能會看到以下資訊: > Buffer cache spillover: only 32768 of 117227 buffers available$   這是由于crash recovery的redo apply本身需要用到buffer cache,此時buffer cache被稱作recovery buffer。 一旦配置設定了recovery buffer,其将不會被釋放或age out直到所有資料塊的redo change都被應用并寫入到磁盤。   由于隻有一個執行個體可以參與recovery(不管是crash recovery還是instance recovery),恢複執行個體的buffer cache 大小将會是大規模恢複資料檔案(recovery)的限制。 在鎖聲明階段(lock claim phase),若執行個體耗盡了空餘的buffer cache 則會spillover溢出到磁盤上(有點像swap)并必須予以處理。此時鎖聲明會暫時中止,oracle會先應用日志将redo change應用到哪些已經聲明過的buffer cache中。直到所有這些recovery buffer都被恢複并被寫出,此時它們才變得對下一次後續的鎖聲明可用。 由于以上說明的磁盤溢出恢複(spillover recovery)持續多次鎖聲明和日志應用階段(理想的是一次鎖聲明,一次日志應用即完成redo apply),直到本次完整的恢複完成。 需要注意的是,以上crash recovery的算法在 buffer cache很小的情況下性能較差; 常見的例子是這樣的, 在産品資料庫中由于有着較大buffer cache而不會遇到該問題,而在某些基于存儲或卷管理軟體實作的複制、測試環境中,由于需要恢複的資料集合較大而且往往db_cache_size比産品庫小很多,是以alter database open時往往看到該(Buffer cache spillover: only 32768 of 117227 buffers available$),且打開資料庫耗費比産品庫更多的時間。   我們一般不用擔心buffer cache spillover,因為即便速度緩慢在10分鐘内資料庫往往還是能夠打開的,但是如果你監控着alert.log 30分鐘都沒有任何新日志,那麼可能是spillover導緻的hang,如果遇到該問題請去OTN Ask Maclean  

本文轉自maclean_007 51CTO部落格,原文連結:http://blog.51cto.com/maclean/1278453