Oracle Database_buffer_cache大小的设置及依据
生活随笔
收集整理的這篇文章主要介紹了
Oracle Database_buffer_cache大小的设置及依据
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
這篇文章是參考甲骨論老相老師的教學視頻:
http://v.youku.com/v_show/id_XMzkyMjA5NTEy.html
所做的學習筆記
1.介紹DBWR寫進程.
之前介紹過Database buffer cache的作用流程了,參考下圖:
具體可以參考我之前的學習筆記:
http://nvd11.blog.163.com/blog/static/200018312201302695451760/
但上面這個流程只提到了用戶客戶端讀取數據的流程, 并沒有提到修改數據..
1.1 用戶修改數據后, 對應buffer會變成1個臟buffer
???? 當用戶修改數據,并且提交后, 數據就會寫入對應buffer, 該buffer的數據就跟dbf文件中的block不一致了, 所以就成了1個臟buffer.
???? 并且這個臟buffer會被加入到database buffer cache中的 LRUW鏈 和 checkpoint queue鏈中.(參考http://nvd11.blog.163.com/blog/static/200018312201301875752730/)
1.2 這時server process就直接提示用戶修改完成,可以進行下1個動作了.
????? Server Process就會進行1個動作,? 并不負責將這個臟buffer寫入dbf文件.
1.3 負責將臟buffer寫入dbf文件的是后臺的DBWR進程
?????? 而DBWR進程就會隔一段時間觸發一次(例如3秒1次), 將LRUW的冷端若干個臟buffer寫入dbf文件, 當然也會有其他原因會額外觸發DBWR進程, 例如數據庫十分繁忙, database buffer cache里臟buffer太多,? 要清理一部分臟buffer才能將新的block寫入database buffer cache.
1.4 將臟buffer寫入dbf文件動作交由后臺進程的原因.
?????? 原因都很簡單了, 因為Server process的快慢直接影響用戶的使用感受,? 而將臟buffer寫入dbf文件的動作是1個很耗時間的物理寫動作, 所以會延時分批地交由后臺進程DBWR處理.?? 而通常物理讀無法避免, 很多時候用戶必須等待物理讀才能得到數據,所以物理讀是Server process負責的.
大概流程如下圖啦:
所以DBWR是Oracle保證database buffer cache中的臟塊能及時 合理地寫入數據文件的一個后臺進程.
1.5 查看服務器的DBWR進程:
?
?如上圖那個就是dbwr進程了, 不過既然他的名字是dbw0, 也就是它可以是dbw1.. dbw2, 也就是可以存在多個dbwr進程了.
查看數據庫dbwr進程個數:
可以用下面命令來設置dbwr的個數:
alter system set db_writer_processes = 2 scope=spfile;
然后重啟啦
不過, dbwr個數絕不是越多越好, 一般是cpu的核心個數除以8.? 也就是服務器如果有2個8核cpu的話可以考慮將dbwr個數設置為2,因為dbwr是1個十分耗cpu資源的進程啦.
2. 設置database buffer cache大小
???? 這個, 跟shared pool的設置很類似, 也就是有兩種設置方法
???? 1. 設置sga_taget, Oracle會自動分配database buffer cache的大小
???? 2. 手動設置database buffer cache大小
???? 通常生產中我們會執行第2中,也就是手動的設置
2.1 查看當前buffer cache大小
???? 可以用下面語句來查看當前database buffer cache的當前實際大小:
select component,current_size,min_size from v$sga_dynamic_components;
如圖:
可以見到
Default buffer cache就是當前的database buffer cache的大小啦
當然我這個測試數據庫不正常啦, 才70m多 而我的sga_target 是628m的.
正常來講, buffer cache的大小一般占 sga大小的1/2 到2/3
老相老師說一般直接設置在sga 2/3就ok了
2.2 設置當前buffer cache大小
一般來講先設置sga_max_size大小. 然后設置sga_target 大小,
alter system set sga_max_size = 2G scope = both;
重啟數據庫
alter system set sga_target = 2G;
alter system set db_buffer_cache = 1.3G scope =both;
也可以參考Oracle db_advice來設置database buffer cache的大小:
執行如下語句:
select size_for_estimate as "Cache Size MB",
?????? size_factor,
?????? buffers_for_estimate as Buffers,
?????? estd_physical_read_factor est_read_fator,
?????? estd_physical_reads estd_phy_read,
?????? estd_physical_read_time est_phy_read_t
?????? from v$db_cache_advice
?????? where name='DEFAULT'
???????? and block_size = (select value from v$parameter
??????????????????????????????????????? where name='db_block_size');
如下圖:
其中buffers列是buffer的個數啦,? 倒數最后兩列分別是物理讀次數和物理讀時間
可以看到隨著buffer cache大小變大, 物理讀時間不斷減少,
生產中選物理讀時間最小那個臨界值對應的buffer cache一般就ok了.
我這個渣測試數據庫沒什么參考意義啦~
?
?
http://v.youku.com/v_show/id_XMzkyMjA5NTEy.html
所做的學習筆記
1.介紹DBWR寫進程.
之前介紹過Database buffer cache的作用流程了,參考下圖:
具體可以參考我之前的學習筆記:
http://nvd11.blog.163.com/blog/static/200018312201302695451760/
但上面這個流程只提到了用戶客戶端讀取數據的流程, 并沒有提到修改數據..
1.1 用戶修改數據后, 對應buffer會變成1個臟buffer
???? 當用戶修改數據,并且提交后, 數據就會寫入對應buffer, 該buffer的數據就跟dbf文件中的block不一致了, 所以就成了1個臟buffer.
???? 并且這個臟buffer會被加入到database buffer cache中的 LRUW鏈 和 checkpoint queue鏈中.(參考http://nvd11.blog.163.com/blog/static/200018312201301875752730/)
1.2 這時server process就直接提示用戶修改完成,可以進行下1個動作了.
????? Server Process就會進行1個動作,? 并不負責將這個臟buffer寫入dbf文件.
1.3 負責將臟buffer寫入dbf文件的是后臺的DBWR進程
?????? 而DBWR進程就會隔一段時間觸發一次(例如3秒1次), 將LRUW的冷端若干個臟buffer寫入dbf文件, 當然也會有其他原因會額外觸發DBWR進程, 例如數據庫十分繁忙, database buffer cache里臟buffer太多,? 要清理一部分臟buffer才能將新的block寫入database buffer cache.
1.4 將臟buffer寫入dbf文件動作交由后臺進程的原因.
?????? 原因都很簡單了, 因為Server process的快慢直接影響用戶的使用感受,? 而將臟buffer寫入dbf文件的動作是1個很耗時間的物理寫動作, 所以會延時分批地交由后臺進程DBWR處理.?? 而通常物理讀無法避免, 很多時候用戶必須等待物理讀才能得到數據,所以物理讀是Server process負責的.
大概流程如下圖啦:
所以DBWR是Oracle保證database buffer cache中的臟塊能及時 合理地寫入數據文件的一個后臺進程.
1.5 查看服務器的DBWR進程:
?
?如上圖那個就是dbwr進程了, 不過既然他的名字是dbw0, 也就是它可以是dbw1.. dbw2, 也就是可以存在多個dbwr進程了.
查看數據庫dbwr進程個數:
可以用下面命令來設置dbwr的個數:
alter system set db_writer_processes = 2 scope=spfile;
然后重啟啦
不過, dbwr個數絕不是越多越好, 一般是cpu的核心個數除以8.? 也就是服務器如果有2個8核cpu的話可以考慮將dbwr個數設置為2,因為dbwr是1個十分耗cpu資源的進程啦.
2. 設置database buffer cache大小
???? 這個, 跟shared pool的設置很類似, 也就是有兩種設置方法
???? 1. 設置sga_taget, Oracle會自動分配database buffer cache的大小
???? 2. 手動設置database buffer cache大小
???? 通常生產中我們會執行第2中,也就是手動的設置
2.1 查看當前buffer cache大小
???? 可以用下面語句來查看當前database buffer cache的當前實際大小:
select component,current_size,min_size from v$sga_dynamic_components;
如圖:
可以見到
Default buffer cache就是當前的database buffer cache的大小啦
當然我這個測試數據庫不正常啦, 才70m多 而我的sga_target 是628m的.
正常來講, buffer cache的大小一般占 sga大小的1/2 到2/3
老相老師說一般直接設置在sga 2/3就ok了
2.2 設置當前buffer cache大小
一般來講先設置sga_max_size大小. 然后設置sga_target 大小,
alter system set sga_max_size = 2G scope = both;
重啟數據庫
alter system set sga_target = 2G;
alter system set db_buffer_cache = 1.3G scope =both;
也可以參考Oracle db_advice來設置database buffer cache的大小:
執行如下語句:
select size_for_estimate as "Cache Size MB",
?????? size_factor,
?????? buffers_for_estimate as Buffers,
?????? estd_physical_read_factor est_read_fator,
?????? estd_physical_reads estd_phy_read,
?????? estd_physical_read_time est_phy_read_t
?????? from v$db_cache_advice
?????? where name='DEFAULT'
???????? and block_size = (select value from v$parameter
??????????????????????????????????????? where name='db_block_size');
如下圖:
其中buffers列是buffer的個數啦,? 倒數最后兩列分別是物理讀次數和物理讀時間
可以看到隨著buffer cache大小變大, 物理讀時間不斷減少,
生產中選物理讀時間最小那個臨界值對應的buffer cache一般就ok了.
我這個渣測試數據庫沒什么參考意義啦~
?
?
總結
以上是生活随笔為你收集整理的Oracle Database_buffer_cache大小的设置及依据的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Oracle Dababase_buff
- 下一篇: Oracle buffer状态深入剖析