【Memory】ORA-4031錯誤概要

Keyword:

    Memory
    ora-4031
    Heap dump

版權聲明:本文爲博主原創文章,轉載請註明出處,謝謝。http://blog.csdn.net/lukeunique

概述

本文將概括地介紹內存不足引起的ORA-4031錯誤。

關於ORA-4031錯誤

ORA-4031錯誤對於一些有一定Oracle數據庫經驗的人來說不陌生。
即:當進程從共享內存中分配內存時,由於沒有足夠大的連續空閒空間(內存塊)而導致的錯誤。

錯誤報警的例子:

ORA-04031: unable to allocate 1072 bytes of shared memory ("shared pool","SELECT OBJECT_TYPE ...","KGLH0^46e70486","kkocs.c.kgght")

關於上面的錯誤內容各項目的含義,簡單介紹如下:

1072 bytes              :請求分配的內存大小
"shared pool"           :要求內存的內存池(即發生錯誤的內存池)
(通常爲shared pool或large pool,有時也可能是Java pool 或 Streams pool)
"SELECT OBJECT_TYPE ...":要求內存的對象內容,不明時出力爲"unknown object"
"KGLH0^46e70486"        :要求內存的大體類型和位置
"kkocs.c.kgght"         :要求內存的類型

下面是ORA-4031的簡單描述和幫助:

$ 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.

ORA-4031的主要原因和解決方法

發生ORA-4031錯誤的處理通常爲”壓垮駱駝背的最後一根稻草”,即很有可能是內存不足的受害者,而不是罪魁禍首。因此,在調查ORA-4031問題時,要關注總體的內存使用情況而不是發生問題的處理或對象。

一般ORA-4031錯誤主要有以下幾種原因引起:

1.內存不足,內存池的過小。
2.內存池的碎片化。雖然總體空閒空間還是很大,但是由於碎片化沒有足夠大的連續空間。
3.應用的問題浪費過多的內存。如:遊標沒有共享產生過多的子游標,PL/SQL對象定義太大等。
4.由於Oracle的Bug影響。如不能正常釋放內存而導致浪費大量內存。

相應地,ORA-4031錯誤解決辦法需要根據發生原因來決定:

1.加大內存池的大小,解決內存池的過小的問題。
2.通過數據庫重啓或者 Flush內存池,解決內存池的碎片化。
3.修改應用程序或設計,解決應用的問題。
4.修改相應的Bug。

理論上講,只要內存池足夠大就不會發生ORA-4031錯誤。因此,無論何種原因引起的ORA-4031,只要系統允許,不斷地加大內存池的大小都能暫時地改善ORA-4031的發生。

※對於ORA-4031錯誤詳細解析以及相關內部原理等內容將在後續的文章中進行介紹。

發佈了39 篇原創文章 · 獲贊 30 · 訪問量 7萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章