熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> Oracle >> 正文

如何解決ORA-04031錯誤(1)

2013-11-13 15:56:21  來源: Oracle 

  當我們在共享池中試圖分配大片的連續內存失敗的時候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
  // INITORA parameters shared_pool_reserved_size and
  // shared_pool_size
  // If the large pool is out of memory increase the INITORA
  // parameter large_pool_size
  
  共享池相關的實例參數
  
  在繼續之前有必要理解下面的實例參數:
  
  SHARED_POOL_SIZE
  
  這個參數指定了共享池的大小單位是字節可以接受數字值或者數字後面跟上後綴KM K代表千字節 M代表兆字節
  
  SHARED_POOL_RESERVED_SIZE
  
  指定了為共享池內存保留的用於大的連續請求的共享池空間當共享池碎片強制使 Oracle 查找並釋放大塊未使用的池來滿足當前的請求的時候這個參數和SHARED_POOL_RESERVED_MIN_ALLOC 參數一起可以用來避免性能下降
  
  這個參數理想的值應該大到足以滿足任何對保留列表中內存的請求掃描而無需從共享池中刷新對象既然操作系統內存可以限制共享池的大小一般來說你應該設定這個參數為 SHARED_POOL_SIZE 參數的 % 大小
  
  SHARED_POOL_RESERVED_MIN_ALLOC 這個參數的值控制保留內存的分配如果一個足夠尺寸的大塊內存在共享池空閒列表中沒能找到內存就從保留列表中分配一塊比這個值大的空間默認的值對於大多數系統來說都足夠了如果你加大這個值那麼Oracle 服務器將允許從這個保留列表中更少的分配並且將從共享池列表中請求更多的內存這個參數在Oracle i 和更高的版本中是隱藏的提交如下的語句查找這個參數值: SELECT  namksppinm NAME valksppstvl VALUE
  FROM x$ksppi nam x$ksppsv val
  WHERE namindx = valindx AND namksppinm LIKE %shared%
  ORDER BY ;
  
  g 注釋Oracle g 的一個新特性叫做 自動內存管理 允許DBA保留一個共享內存池來分shared poolbuffer 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_sizeused_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
    推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.