1. 程式人生 > >ORA-04031錯誤導致shared_pool問題

ORA-04031錯誤導致shared_pool問題

解決 pro line unknown 軟解析 incr ash art tail

環境描述:

數據庫版本:Oracle 11.2.0.1

操作系統:AIX 7.1

物理內存:64G

雙節點 RAC

發生故障現象:客戶端無法連接數據庫,數據庫無響應

檢查報警日誌為如下錯誤信息:

Sun Aug 20 06:00:22 2017
Errors in file /u01/app/oracle/diag/rdbms/dspdb/DSPDB1/trace/DSPDB1_dbrm_12583066.trc  (incident=5404
47):
ORA-04031: unable to allocate 4200 bytes of shared memory ("shared pool","unknown object","KGSKI sche
dule","KGKP classinst")
Incident details in: /u01/app/oracle/diag/rdbms/dspdb/DSPDB1/incident/incdir_540447/DSPDB1_dbrm_12583
066_i540447.trc
Sun Aug 20 06:00:24 2017
Errors in file /u01/app/oracle/diag/rdbms/dspdb/DSPDB1/trace/DSPDB1_ora_7405642.trc  (incident=540855
):
ORA-04031: unable to allocate 2944 bytes of shared memory ("shared pool","unknown object","sga heap(2
,1)","KGLHD")
Incident details in: /u01/app/oracle/diag/rdbms/dspdb/DSPDB1/incident/incdir_540855/DSPDB1_ora_7405642_i540855.trc
Sun Aug 20 06:00:24 2017
Trace dumping is performing id=[cdmp_20170820060024]
Errors in file /u01/app/oracle/diag/rdbms/dspdb/DSPDB1/trace/DSPDB1_dbrm_12583066.trc:
ORA-04031: unable to allocate 4200 bytes of shared memory ("shared pool","unknown object","KGSKI sche
dule","KGKP classinst")
Sun Aug 20 06:00:25 2017
Errors in file /u01/app/oracle/diag/rdbms/dspdb/DSPDB1/trace/DSPDB1_gen0_12256234.trc  (incident=5404
31):
ORA-04031: unable to allocate  bytes of shared memory ("","","","")
Incident details in: /u01/app/oracle/diag/rdbms/dspdb/DSPDB1/incident/incdir_540431/DSPDB1_gen0_12256
234_i540431.trc
Sun Aug 20 06:00:26 2017
Sweep [inc][540855]: completed
Sweep [inc][540447]: completed
Sweep [inc][540431]: completed
Sweep [inc2][540855]: completed
Sweep [inc2][540447]: completed?

問題分析:

這是Oracle 對這個報錯的解釋:

oerr ORA 4031
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 or Streams 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 // initialization parameters SHARED_POOL_RESERVED_SIZE and // SHARED_POOL_SIZE. // If the large pool is out of memory, increase the initialization
// parameter LARGE_POOL_SIZE. // If the error is issued from an Oracle Streams or XStream process, // increase the initialization parameter STREAMS_POOL_SIZE or increase // the capture or apply parameter MAX_SGA_SIZE.

引起這個報錯的原因一般情況下有如下原因:

  1. 內存中有大量碎片,導致在分配內存的時候,沒有連續的內存可存放,這個問題需要在開發上著手,增加綁定變量,減少硬解析。
  2. 要麽就是內存不足,需要擴大內存。

我查過發生這個問題前到發生這個報錯的AWR報告:

技術分享

技術分享

技術分享

技術分享

數據庫內存占用率不到60%,所以不太可能由於內存不足造成,加上發生故障是早上6:00左右,是業務非高峰時間

以下是顯示軟解析81.03%,表明硬解析比較多,所以增加綁定量減少硬解析的

技術分享

共享池鎖爭用等待事件比較嚴重

技術分享

使用以下命令查出沒有綁定變量的SQL語句有309個。

SET pages 10000
SET linesize 250
column FORCE_MATCHING_SIGNATURE format 99999999999999999999999
WITH c AS
     (SELECT  FORCE_MATCHING_SIGNATURE,
              COUNT(*) cnt
     FROM     v$sqlarea
     WHERE    FORCE_MATCHING_SIGNATURE!=0
     GROUP BY FORCE_MATCHING_SIGNATURE
     HAVING   COUNT(*) > 20
     )
     ,
     sq AS
     (SELECT  sql_text                ,
              FORCE_MATCHING_SIGNATURE,
              row_number() over (partition BY FORCE_MATCHING_SIGNATURE ORDER BY sql_id DESC) p
     FROM     v$sqlarea s
     WHERE    FORCE_MATCHING_SIGNATURE IN
              (SELECT FORCE_MATCHING_SIGNATURE
              FROM    c
              )
     )
SELECT   sq.sql_text                ,
         sq.FORCE_MATCHING_SIGNATURE,
         c.cnt "unshared count"
FROM     c,
         sq
WHERE    sq.FORCE_MATCHING_SIGNATURE=c.FORCE_MATCHING_SIGNATURE
AND      sq.p                       =1
ORDER BY c.cnt DESC;?

解決方案:

修改SQL增加綁定變量,減少硬解析,避免共享池鎖爭用,在內存自動管理的模式下,硬解析太多會導致內存抖動。

緊急處理:重啟實例

參考博客:http://www.laoxiong.net/an-ora-04031-case.html

ORA-04031錯誤導致shared_pool問題