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錯誤詳細解析以及相關內部原理等內容將在後續的文章中進行介紹。