當我們在共享池中試圖分配大片的連續內存失敗的時候
Oracle首先清除池中當前沒使用的所有對象
使空閒內存塊合並
如果仍然沒有足夠大單個的大塊內存滿足請求
就會產生ORA
錯誤
當這個錯誤出現的時候你得到的錯誤解釋信息類似如下:
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
共享池相關的實例參數 在繼續之前
有必要理解下面的實例參數:
SHARED_POOL_SIZE
這個參數指定了共享池的大小
單位是字節
可以接受數字值或者數字後面跟上後綴
K
或
M
K
代表千字節
M
代表兆字節
SHARED_POOL_RESERVED_SIZE
指定了為共享池內存保留的用於大的連續請求的共享池空間
當共享池碎片強制使 Oracle 查找並釋放大塊未使用的池來滿足當前的請求的時候
這個參數和SHARED_POOL_RESERVED_MIN_ALLOC 參數一起可以用來避免性能下降
這個參數理想的值應該大到足以滿足任何對保留列表中內存的請求掃描而無需從共享池中刷新對象
既然操作系統內存可以限制共享池的大小
一般來說
你應該設定這個參數為 SHARED_POOL_SIZE 參數的
% 大小
SHARED_POOL_RESERVED_MIN_ALLOC 這個參數的值控制保留內存的分配
如果一個足夠尺寸的大塊內存在共享池空閒列表中沒能找到
內存就從保留列表中分配一塊比這個值大的空間
默認的值對於大多數系統來說都足夠了
如果你加大這個值
那麼Oracle 服務器將允許從這個保留列表中更少的分配並且將從共享池列表中請求更多的內存
這個參數在Oracle
i 和更高的版本中是隱藏的
提交如下的語句查找這個參數值: 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
;
g 注釋
Oracle
g 的一個新特性叫做
自動內存管理
允許DBA保留一個共享內存池來分shared pool
buffer cache
java pool 和large pool
一般來說
當數據庫需要分配一個大的對象到共享池中並且不能找到連續的可用空間
將自動使用其他SGA結構的空閒空間來增加共享池的大小
既然空間分配是Oracle自動管理的
ora
出錯的可能性將大大降低
自動內存管理在初始化參數SGA_TARGET大於
的時候被激活
當前設定可以通過查詢v$sga_dynamic_components 視圖獲得
請參考
g管理手冊以得到更多內容
診斷ORA 錯誤 注
大多數的常見的 ORA
的產生都和 SHARED POOL SIZE 有關
這篇文章中的診斷步驟大多都是關於共享池的
對於其它方面如Large_pool或是Java_pool
內存分配算法都是相似的
一般來說都是因為結構不夠大造成
ORA
可能是因為 SHARED POOL 不夠大
或是因為碎片問題導致數據庫不能找到足夠大的內存塊
ORA
錯誤通常是因為庫高速緩沖中或共享池保留空間中的碎片
在加大共享池大小的時 候考慮調整應用
使用共享的SQL 並且調整如下的參數
SHARED_POOL_SIZE
SHARED_POOL_RESERVED_SIZE
SHARED_POOL_RESERVED_MIN_ALLOC
首先判定是否ORA
錯誤是由共享池保留空間中的庫高速緩沖的碎片產生的
提交下的查詢
SELECT free_space
avg_free_size
used_space
avg_used_size
request_failures
last_failure_size
FROM v$shared_pool_reserved;
如果:
REQUEST_FAILURES >
並且 LAST_FAILURE_SIZE > SHARED_POOL_RESERVED_MIN_ALLOC
那麼ORA
錯誤就是因為共享池保留空間缺少連續空間所致
要解決這個問題
可以考慮加大SHARED_POOL_RESERVED_MIN_ALLOC 來降低緩沖進共 享池保留空間的對象數目
並增大 SHARED_POOL_RESERVED_SIZE 和 SHARED_POOL_SIZE 來加大共享池保留空間的可用內存
如果
REQUEST_FAILURES >
並且 LAST_FAILURE_SIZE < SHARED_POOL_RESERVED_MIN_ALLOC
或者
REQUEST_FAILURES 等於
並且 LAST_FAILURE_SIZE < SHARED_POOL_RESERVED_MIN_ALLOC
那麼是因為在庫高速緩沖缺少連續空間導致ORA
錯誤
第一步應該考慮降低SHARED_POOL_RESERVED_MIN_ALLOC 以放入更多的對象到共享池保留空間中並且加大SHARED_POOL_SIZE
解決ORA 錯誤 ORACLE BUG
Oracle推薦對你的系統打上最新的PatchSet
大多數的ORA
錯誤都和BUG 相關
可以通過使用這些補丁來避免
下面表中總結和和這個錯誤相關的最常見的BUG
可能的環境和修補這個問題的補丁
From:http://tw.wingwit.com/Article/program/Oracle/201311/17548.html