ORA-04031錯誤導致shared_pool問題
阿新 • • 發佈:2017-09-04
解決 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.
引起這個報錯的原因一般情況下有如下原因:
- 內存中有大量碎片,導致在分配內存的時候,沒有連續的內存可存放,這個問題需要在開發上著手,增加綁定變量,減少硬解析。
- 要麽就是內存不足,需要擴大內存。
我查過發生這個問題前到發生這個報錯的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問題