這是我們為大家提供的一篇關於介紹如何診斷並解決ORA-04031 錯誤數據分析工具的文章,接下來就讓我們一起來了解一下吧!
當我們在共享池中試圖分配大片的連續內存失敗的時候,Oracle首先清除池中當前沒使用的所有對象,使空閒內存塊合並。如果仍然沒有足夠大單個的大塊內存滿足請求,就會產生ORA-04031 錯誤。
當這個錯誤出現的時候你得到的錯誤解釋信息類似如下:
04031, 00000, "unable to allocate %s bytes of shared memory (\"%s\",\"%s\",\"%s\",\"%s\")"
// *Cause: More shared memory is needed than was allocated in the shared
// pool.
// *Action: If the shared pool is out of memory, either use the
// dbms_shared_pool package to pin large packages,
// reduce your use of shared memory, or increase the amount of
// available shared memory by increasing the value of the
// INIT.ORA parameters "shared_pool_reserved_size" and
// "shared_pool_size".
// If the large pool is out of memory, increase the INIT.ORA
// parameter "large_pool_size".
1.共享池相關的實例參數
在繼續之前,有必要理解下面的實例參數:
SHARED_POOL_SIZE
這個參數指定了共享池的大小,單位是字節。可以接受數字值或者數 字後面跟上後綴"K" 或 "M" 。"K"代表千字節, "M"代表兆字節。
SHARED_POOL_RESERVED_SIZE
指定了為共享池內存保留的用於大的連續請求的共享池空間。當共享池碎片強制使 Oracle 查找並釋放大塊未使用的池來滿足當前的請求的時候,這個參 數和SHARED_POOL_RESERVED_MIN_ALLOC 參數一起可以用來避免性能下降。
這個參數理想的值應該大到足以滿足任何對保留列表中內存的請求掃描而無需從共享池中刷新對 象。既然操作系統內存可以限制共享池的大小,一般來說,你應該設定這個參數為 SHARED_POOL_SIZE 參數的 10% 大小。
SHARED_POOL_RESERVED_MIN_ALLOC 這個參數的值控制保留內存的分配。如果一個足 夠尺寸的大塊內存在共享池空閒列表中沒能找到,內存就從保留列表中分配一塊比這個值大的空 間。默認的值對於大多數系統來說都足夠了。如果你加大這個值,那麼Oracle 服務器將允許從這 個保留列表中更少的分配並且將從共享池列表中請求更多的內存。這個參數在Oracle 8i 和更高的版本中是隱藏的。提交如下的語句查找這個參數值:
SELECT nam.ksppinm NAME, val.ksppstvl VALUE
FROM x$ksppi nam, x$ksppsv val
WHERE nam.indx = val.indx AND nam.ksppinm LIKE '%shared%'
ORDER BY 1;
10g 注釋:Oracle 10g 的一個新特性叫做 "自動內存管理" 允許DBA保留一個共享內存池來分shared pool,buffer cache, java pool 和large pool。一般來說,當數據庫需要分配一個大的對象到共享池中並且不能找到連續的可用空間,將自動使用其他SGA結構的空閒空間來增加共享池的大小 。既然空間分配是Oracle自動管理的,ora-4031出錯的可能性將大大降低。自動內存管理在初始化參數SGA_TARGET大於0的時候被激活。 當前設定可以通過查詢v$sga_dynamic_components 視圖獲得。請參考10g管理手冊以得到更多內容 。
2.診斷ORA-04031 錯誤
注:大多數的常見的 ORA-4031 的產生都和 SHARED POOL SIZE 有關,這篇文章中的診斷步驟大多都是關於共享池的。 對於其它方面如Large_pool或是Java_pool,內存分配算法都是相似的,一般來說都是因為結構不夠大造成。
ORA-04031 可能是因為 SHARED POOL 不夠大,或是因為碎片問題導致數據庫不能找到足夠大的內存塊 。
ORA-04031 錯誤通常是因為庫高速緩沖中或共享池保留空間中的碎片。 在加大共享池大小的時 候考慮調整應用,使用共享的SQL 並且調整如下的參數:
SHARED_POOL_SIZE,
SHARED_POOL_RESERVED_SIZE,
SHARED_POOL_RESERVED_MIN_ALLOC.
首先判定是否ORA-04031 錯誤是由共享池保留空間中的庫高速緩沖的碎片產生的。提交下的查詢:
SELECT free_space, avg_free_size,used_space, avg_used_size, request_failures,
last_failure_size
FROM v$shared_pool_reserved;
如果:
REQUEST_FAILURES > 0 並且 LAST_FAILURE_SIZE > SHARED_POOL_RESERVED_MIN_ALLOC
那麼ORA-04031 錯誤就是因為共享池保留空間缺少連續空間所致。要解決這個問題,可以考慮加大SHARED_POOL_RESERVED_MIN_ALLOC 來降低緩沖進共 享池保留空間的對象數目,並增大 SHARED_POOL_RESERVED_SIZE 和 SHARED_POOL_SIZE 來加大共享池保留空間的可用 內存。
如果:
REQUEST_FAILURES > 0 並且 LAST_FAILURE_SIZE < SHARED_POOL_RESERVED_MIN_ALLOC
或者
REQUEST_FAILURES 等於0 並且 LAST_FAILURE_SIZE < SHARED_POOL_RESERVED_MIN_ALLOC
那麼是因為在庫高速緩沖缺少連續空間導致ORA-04031 錯誤。
第一步應該考慮降低SHARED_POOL_RESERVED_MIN_ALLOC 以放入更多的對象到共享池 保留空間中並且加大SHARED_POOL_SIZE。