亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 數據庫 > Oracle > 正文

如何解決Oracle數據庫中的04031錯誤

2024-08-29 14:01:39
字體:
來源:轉載
供稿:網友

診斷并解決ORA-04031 錯誤

當我們在共享池中試圖分配大片的連續內存失敗的時候,Oracle首先清除池中當前沒使用的所有對象,使空閑內存塊合并。如果仍然沒有足夠大單個的大塊內存滿足請求,就會產生ORA-04031 錯誤。

當這個錯誤出現的時候你得到的錯誤解釋信息類似如下:

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.

// *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

// INIT.ORA parameters "shared_pool_reserved_size" and

// "shared_pool_size".

// If the large pool is out of memory, increase the INIT.ORA

// parameter "large_pool_size".

1.共享池相關的實例參數

在繼續之前,有必要理解下面的實例參數:

SHARED_POOL_SIZE

這個參數指定了共享池的大小,單位是字節??梢越邮軘底种祷蛘邤底趾竺娓虾缶Y"K" 或 "M" 。"K"代表千字節, "M"代表兆字節。

SHARED_POOL_RESERVED_SIZE

指定了為共享池內存保留的用于大的連續請求的共享池空間。當共享池碎片強制使 Oracle 查找并釋放大塊未使用的池來滿足當前的請求的時候,這個參數和SHARED_POOL_RESERVED_MIN_ALLOC 參數一起可以用來避免性能下降。

這個參數理想的值應該大到足以滿足任何對保留列表中內存的請求掃描而無需從共享池中刷新對象。既然操作系統內存可以限制共享池的大小,一般來說,你應該設定這個參數為 SHARED_POOL_SIZE 參數的 10% 大小。

SHARED_POOL_RESERVED_MIN_ALLOC 這個參數的值控制保留內存的分配。如果一個足夠尺寸的大塊內存在共享池空閑列表中沒能找到,內存就從保留列表中分配一塊比這個值大的空間。默認的值對于大多數系統來說都足夠了。如果你加大這個值,那么Oracle 服務器將允許從這個保留列表中更少的分配并且將從共享池列表中請求更多的內存。這個參數在Oracle 8i 和更高的版本中是隱藏的。提交如下的語句查找這個參數值: SELECT nam.ksppinm NAME, val.ksppstvl VALUE

FROM x$ksppi nam, x$ksppsv val

WHERE nam.indx = val.indx AND nam.ksppinm LIKE '%shared%'

ORDER BY 1;

10g 注釋:Oracle 10g 的一個新特性叫做 "自動內存管理" 允許DBA保留一個共享內存池來分shared pool,buffer cache, java pool 和large pool。一般來說,當數據庫需要分配一個大的對象到共享池中并且不能找到連續的可用空間,將自動使用其他SGA結構的空閑空間來增加共享池的大小 。既然空間分配是Oracle自動管理的,ora-4031出錯的可能性將大大降低。自動內存管理在初始化參數SGA_TARGET大于0的時候被激活。當前設定可以通過查詢v$sga_dynamic_components 視圖獲得。請參考10g管理手冊以得到更多內容 。

2.診斷ORA-04031 錯誤

注:大多數的常見的 ORA-4031 的產生都和 SHARED POOL SIZE 有關,這篇文章中的診斷步驟大多都是關于共享池的?!τ谄渌矫嫒鏛arge_pool或是Java_pool,內存分配算法都是相似的,一般來說都是因為結構不夠大造成。

ORA-04031 可能是因為 SHARED POOL 不夠大,或是因為碎片問題導致數據庫不能找到足夠大的內存塊。

ORA-04031 錯誤通常是因為庫高速緩沖中或共享池保留空間中的碎片。 在加大共享池大小的時 候考慮調整應用,使用共享的SQL 并且調整如下的參數:

SHARED_POOL_SIZE,

SHARED_POOL_RESERVED_SIZE,

SHARED_POOL_RESERVED_MIN_ALLOC.

首先判定是否ORA-04031 錯誤是由共享池保留空間中的庫高速緩沖的碎片產生的。提交下的查詢:

SELECT free_space, avg_free_size,used_space, avg_used_size, request_failures,

last_failure_size

FROM v$shared_pool_reserved;

如果:

REQUEST_FAILURES > 0 并且 LAST_FAILURE_SIZE > SHARED_POOL_RESERVED_MIN_ALLOC

那么ORA-04031 錯誤就是因為共享池保留空間缺少連續空間所致。要解決這個問題,可以考慮加大SHARED_POOL_RESERVED_MIN_ALLOC 來降低緩沖進共 享池保留空間的對象數目,并增大 SHARED_POOL_RESERVED_SIZE 和 SHARED_POOL_SIZE 來加大共享池保留空間的可用內存。

如果:

REQUEST_FAILURES > 0 并且 LAST_FAILURE_SIZE < SHARED_POOL_RESERVED_MIN_ALLOC

或者

REQUEST_FAILURES 等于0 并且 LAST_FAILURE_SIZE < SHARED_POOL_RESERVED_MIN_ALLOC

那么是因為在庫高速緩沖缺少連續空間導致ORA-04031 錯誤。

第一步應該考慮降低SHARED_POOL_RESERVED_MIN_ALLOC 以放入更多的對象到共享池保留空間中并且加大SHARED_POOL_SIZE。

3.解決ORA-04031 錯誤

ORACLE BUG

Oracle推薦對你的系統打上最新的PatchSet。大多數的ORA-04031錯誤都和BUG 相關,可以通過使用這些補丁來避免。

下面表中總結和和這個錯誤相關的最常見的BUG、可能的環境和修補這個問題的補丁。

BUG 描述 Workaround Fixed

<1397603>ORA-4031/SGA memory leak of PERMANENT memory occurs for buffer handles _db_handles_cached = 0 901/ 8172

<1640583>ORA-4031 due to leak / cache buffer chain contention from AND-EQUAL access Not available 8171/901

<1318267>INSERT AS SELECT statements may

not be shared when they should be

if TIMED_STATISTICS. It can lead to ORA-4031 _SQLEXEC_PROGRESSION_COST=0

8171/8200

<1193003>Cursors may not be shared in 8.1

when they should be Not available 8162/8170/ 901

<2104071>ORA-4031/excessive "miscellaneous" shared pool usage possible. (many PINS) None-> This is known to affect the XML parser. 8174, 9013, 9201

<263791.1>Several number of BUGs related to ORA-4031 erros were fixed in the 9.2.0.5 patchset Not available 9205

編譯Java代碼時出現的ORA-4031

在你編譯Java代碼的時候如果內存溢出,你會看到錯誤:

A SQL exception occurred while compiling: :

ORA-04031: unable to allocate bytes of shared memory

("shared pool","unknown object","joxlod: init h", "JOX: ioc_allocate_pal")

解決辦法是關閉數據庫然后把參數 JAVA_POOL_SIZE 設定為一個較大的值。這里錯誤信息中提到的 "shared pool" 其實共享全局區(SGA)溢出的誤導,并不表示你需要增加SHARED_POOL_SIZE,相反,你必須加大 JAVA_POOL_SIZE 參數的值,然后重啟動系統,再試一下。參考: <2736601>。

小的共享池尺寸

很多情況下,共享池過小能夠導致ORA-04031錯誤。下面信息有助于你調整共享池大?。?

庫高速緩沖命中率

命中率有助于你衡量共享池的使用,有多少語句需要被解析而不是重用。下面的SQL語句有助于你計算庫高速緩沖的命中率:

SELECT SUM(PINS) "EXECUTIONS",

SUM(RELOADS) "CACHE MISSES WHILE EXECUTING"

FROM V$LIBRARYCACHE;

如果丟失超過1%,那么嘗試通過加大共享池的大小來減少庫高速緩沖丟失。

共享池大小計算

要計算最適合你工作負載的共享池大小,請參考:

<1012046.6>: HOW TO CALCULATE YOUR SHARED POOL SIZE.

共享池碎片

每一次,需要被執行的SQL 或者PL/SQL 語句的解析形式載入共享池中都需要一塊特定的連續的空間。數據庫要掃描的第一個資源就是共享池中的空閑可用內存。一旦空閑內存耗盡,數據庫要查找一塊已經分配但還沒使用的內存準備重用。如果這樣的確切尺寸的大塊內存不可用,就繼續按照如下標準尋找:

大塊(chunk)大小比請求的大小大

空間是連續的

大塊內存是可用的(而不是正在使用的)

這樣大塊的內存被分開,剩余的添加到相應的空閑空間列表中。當數據庫以這種方式操作一段時間之后,共享池結構就會出現碎片。

當共享池存在碎片的問題,分配一片空閑的空間就會花費更多的時間,數據庫性能也會下降(整個操作的過程中,"chunk allocation"被一個叫做"shared pool latch" 的閂所控制) 或者是出現 ORA-04031 錯誤errors (在數據庫不能找到一個連續的空閑內存塊的時候)。

參考 <61623.1>: 可以得到關于共享池碎片的詳細討論。

如果SHARED_POOL_SIZE 足夠大,大多數的 ORA-04031 錯誤都是由共享池中的動態SQL 碎片導致的??赡艿脑蛉缦拢?

非共享的SQL

生成不必要的解析調用 (軟解析)

沒有使用綁定變量

要減少碎片的產生你需要確定是前面描敘的幾種可能的因素??梢圆扇∪缦碌囊恍┓椒?,當然不只局限于這幾種: 應用調整、數據庫調整或者實例參數調整。

請參考 <62143.1>,描述了所有的這些細節內容。這個注釋還包括了共享池如何工作的細節。

下面的視圖有助于你標明共享池中非共享的SQL/PLSQL:

V$SQLAREA 視圖

這個視圖保存了在數據庫中執行的SQL 語句和PL/SQL 塊的信息。下面的SQL 語句可以顯示給你帶有literal 的語句或者是帶有綁定變量的語句:

SELECT SUBSTR (sql_text, 1, 40) "SQL", COUNT (*),

SUM (executions) "TotExecs"

FROM v$sqlarea

WHERE executions < 5

GROUP BY SUBSTR (sql_text, 1, 40)

HAVING COUNT (*) > 30

ORDER BY 2;

注: Having 后的數值 "30" 可以根據需要調整以得到更為詳細的信息。

X$KSMLRU 視圖

這個固定表x$ksmlru 跟蹤共享池中導致其它對象換出(age out)的應用。這個固定表可以用來標記是什么導致了大的應用。

如果很多對象在共享池中都被階段性的刷新可能導致響應時間問題并且有可能在對象重載入共享池中的時候導致庫高速緩沖閂競爭問題。

關于這個x$ksmlru 表的一個不尋常的地方就是如果有人從表中選取內容這個表的內容就會被擦除。這樣這個固定表只存儲曾經發生的最大的分配。這個值在選擇后被重新設定這樣接下來的大的分配可以被標記,即使它們不如先前的分配過的大。因為這樣的重置,在查詢提交后的結果不可以再次得到,從表中的輸出的結果應該小心的保存。監視這個固定表運行如下操作:

SELECT * FROM X$KSMLRU WHERE ksmlrsiz > 0;

這個表只可以用SYS用戶登錄進行查詢。

X$KSMSP 視圖 (類似堆Heapdump信息)

使用這個視圖能找出當前分配的空閑空間,有助于理解共享池碎片的程度。如我們在前面的描述,查找為游標分配的足夠的大塊內存的第一個地方是空閑列表( free list)。 下面的語句顯示了空閑列表中的大塊內存:

SELECT '0 (<140)' bucket, ksmchcls, 10 * TRUNC (ksmchsiz / 10) "From",

COUNT (*) "Count", MAX (ksmchsiz) "Biggest",

TRUNC (AVG (ksmchsiz)) "AvgSize", TRUNC (SUM (ksmchsiz)) "Total"

FROM x$ksmsp

WHERE ksmchsiz < 140 AND ksmchcls = 'free'

GROUP BY ksmchcls, 10 * TRUNC (ksmchsiz / 10)

UNION ALL

SELECT '1 (140-267)' bucket, ksmchcls, 20 * TRUNC (ksmchsiz / 20),

COUNT (*), MAX (ksmchsiz), TRUNC (AVG (ksmchsiz)) "AvgSize",

TRUNC (SUM (ksmchsiz)) "Total"

FROM x$ksmsp

WHERE ksmchsiz BETWEEN 140 AND 267 AND ksmchcls = 'free'

GROUP BY ksmchcls, 20 * TRUNC (ksmchsiz / 20)

UNION ALL

SELECT '2 (268-523)' bucket, ksmchcls, 50 * TRUNC (ksmchsiz / 50),

COUNT (*), MAX (ksmchsiz), TRUNC (AVG (ksmchsiz)) "AvgSize",

TRUNC (SUM (ksmchsiz)) "Total"

FROM x$ksmsp

WHERE ksmchsiz BETWEEN 268 AND 523 AND ksmchcls = 'free'

GROUP BY ksmchcls, 50 * TRUNC (ksmchsiz / 50)

UNION ALL

SELECT '3-5 (524-4107)' bucket, ksmchcls, 500 * TRUNC (ksmchsiz / 500),

COUNT (*), MAX (ksmchsiz), TRUNC (AVG (ksmchsiz)) "AvgSize",

TRUNC (SUM (ksmchsiz)) "Total"

FROM x$ksmsp

WHERE ksmchsiz BETWEEN 524 AND 4107 AND ksmchcls = 'free'

GROUP BY ksmchcls, 500 * TRUNC (ksmchsiz / 500)

UNION ALL

SELECT '6+ (4108+)' bucket, ksmchcls, 1000 * TRUNC (ksmchsiz / 1000),

COUNT (*), MAX (ksmchsiz), TRUNC (AVG (ksmchsiz)) "AvgSize",

TRUNC (SUM (ksmchsiz)) "Total"

FROM x$ksmsp

WHERE ksmchsiz >= 4108 AND ksmchcls = 'free'

GROUP BY ksmchcls, 1000 * TRUNC (ksmchsiz / 1000);

4. ORA-04031 錯誤與 Large Pool

大池是個可選的內存區,為以下的操作提供大內存分配:

MTS會話內存和 Oracle XA 接口

Oracle 備份與恢復操作和I/O服務器進程用的內存(緩沖)

并行執行消息緩沖

大池沒有LRU列表。這和共享池中的保留空間不同,保留空間和共享池中其他分配的內存使用同樣的LRU列表。大塊內存從不會換出大池中,內存必須是顯式的被每個會話分配并釋放。一個請求如果沒有足夠的內存,就會產生類似這樣的一個ORA-4031錯誤:

ORA-04031: unable to allocate XXXX bytes of shared memory

("large pool","unknown object","session heap","frame")

這個錯誤發生時候可以檢查幾件事情:

1- 使用如下語句檢查 V$SGASTAT ,得知使用和空閑的內存: SELECT pool,name,bytes FROM v$sgastat where pool = 'large pool';

2- 你還可以采用 heapdump level 32 來 dump 大池的堆并檢查空閑的大塊內存的大小

從大池分配的內存如果是LARGE_POOL_MIN_ALLOC 子節的整塊數有助于避免碎片。任何請求分配小于LARGE_POOL_MIN_ALLOC 大塊尺寸都將分配LARGE_POOL_MIN_ALLOC的大小。一般來說,你會看到使用大池的時候相對共享池來說要用到更多的內存。通常要解決大池中的ORA-4031錯誤必須增加 LARGE_POOL_SIZE 的大小。

5. ORA-04031 和共享池刷新

有一些技巧會提高游標的共享能力,從而共享池碎片和ORA-4031都會減少。最佳途徑是調整應用使用綁定變量。另外在應用不能調整的時候考慮使用CURSOR_SHARING參數和FORCE不同的值來做到 (要注意那會導致執行計劃改變,所以建議先對應用進行測試)。當上述技巧都不可以用的時候,并且碎片問題在系統中比較嚴重,刷新共享持可能有助于減輕碎片問題。但是,必須加以如下考慮:

刷新將導致所有沒被使用的游標從共享池刪除。這樣,在共享池刷新之后,大多數SQL和PL/SQL游標必須被硬解析。這將提高CPU的使用,也會加大Latch的活動。

當應用程序沒有使用綁定變量并被許多用戶進行類似的操作的時候(如在OLTP系統中) ,刷新之后很快還會出現碎片問題。所以共享池對設計糟糕的應用程序來說不是解決辦法。

對一個大的共享池刷新可能會導致系統掛起,尤其是實例繁忙的時候,推薦在非高峰的時候刷新

6. ORA-04031錯誤的高級分析

如果前述的這些技術內容都不能解決ORA-04031 錯誤,可能需要額外的跟蹤信息來得到問題發生的共享池的快照。

調整init.ora參數添加如下的事件得到該問題的跟蹤信息:

event = "4031 trace name errorstack level 3"

event = "4031 trace name HEAPDUMP level 3"

如果問題可重現,該事件可設定在會話層,在執行問題語句之前使用如下的語句: SQL> alter session set events '4031 trace name errorstack level 3';

SQL> alter session set events '4031 trace name HEAPDUMP level 3';

把這個跟蹤文件發給Oracle支持人員進行排錯。

重要標注: Oracle 9.2.0.5 和Oracle 10g 版本中,每次在發生ORA-4031 錯誤的時候會自動創建一個跟蹤文件,可以在user_dump_dest 目錄中找到。如果你的系統是上述的版本,你不需要再進行前面描述中的步驟。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
中文字幕亚洲字幕| 自拍偷拍亚洲精品| 国产做受69高潮| 久久亚洲欧美日韩精品专区| 91在线无精精品一区二区| 久久久999精品视频| 国产va免费精品高清在线| 成人国产精品久久久久久亚洲| 欧美日韩在线免费| 日韩小视频在线观看| 亚洲精选中文字幕| 成人精品在线视频| 久久国产视频网站| 国产精品亚洲综合天堂夜夜| 性色av一区二区三区红粉影视| 激情久久av一区av二区av三区| 国产成人av在线| 欧美精品成人91久久久久久久| 亚洲电影在线看| 国产精品第一页在线| 亚洲天天在线日亚洲洲精| 亚洲精品美女久久久| 欧日韩在线观看| 久久久视频在线| 日韩欧美一区二区在线| 欧美日韩国产在线| 欧美在线视频观看免费网站| 精品久久久久久久大神国产| 欧美日韩视频在线| 中文字幕成人精品久久不卡| 色妞在线综合亚洲欧美| 国外成人在线视频| 欧美日韩免费区域视频在线观看| 黑人巨大精品欧美一区免费视频| 国产一区二区三区免费视频| 日韩中文av在线| 日韩中文字幕免费视频| 久久99精品国产99久久6尤物| 欧美大片免费观看| 91精品国产777在线观看| 国产一区欧美二区三区| 国产精品xxxxx| 国产精品美女免费看| 青草青草久热精品视频在线观看| 亚洲国产精品人人爽夜夜爽| 国产成人免费91av在线| 精品丝袜一区二区三区| 亚洲人成网站777色婷婷| 亚洲午夜精品久久久久久久久久久久| 国产精品久久久久久av下载红粉| 日本在线观看天堂男亚洲| 欧美日韩成人在线播放| 亚洲精品久久久久久久久久久| 日韩欧美精品在线观看| 韩国19禁主播vip福利视频| 国产精品美乳一区二区免费| 中文日韩电影网站| 亚洲欧美激情精品一区二区| 有码中文亚洲精品| 欧美噜噜久久久xxx| 国产婷婷97碰碰久久人人蜜臀| 91精品国产91久久久久久不卡| 国产精品99久久久久久久久| 亚洲国产欧美一区二区三区同亚洲| 成人黄色网免费| 亚洲精品大尺度| 欧美另类69精品久久久久9999| 欧美精品在线免费| 亚洲在线观看视频| 九九热这里只有精品免费看| 欧美中文字幕视频在线观看| 在线播放日韩欧美| 国产精品91久久久久久| 国产精品视频久久久| 欧美亚洲激情视频| 日韩美女在线观看一区| 中文字幕九色91在线| 97视频在线播放| 日韩视频精品在线| 韩国19禁主播vip福利视频| 俺去啦;欧美日韩| 欧美尺度大的性做爰视频| 色无极亚洲影院| 日韩电影免费在线观看| 日韩高清免费在线| 亚洲男女自偷自拍图片另类| 在线色欧美三级视频| 久久久久日韩精品久久久男男| 亚洲精品久久久久| 福利视频导航一区| 日韩美女在线观看一区| 97人人爽人人喊人人模波多| 色婷婷**av毛片一区| 在线视频日韩精品| 日韩电视剧免费观看网站| 97视频免费观看| 欧美性猛交99久久久久99按摩| 国产精品国产亚洲伊人久久| 欧美亚洲国产精品| 国产精品 欧美在线| 91精品久久久久久久久久久久久| 精品免费在线视频| 亚洲香蕉av在线一区二区三区| 亚洲第一在线视频| 欧美在线视频一区| 日韩在线高清视频| www高清在线视频日韩欧美| 欧美人成在线视频| 日本高清视频一区| 亚洲日韩欧美视频| 久热精品视频在线观看| 亚洲第一av网| 亚洲毛片在线看| 九九视频这里只有精品| 欧美激情喷水视频| 91精品国产91久久久久久吃药| 永久免费精品影视网站| 色悠久久久久综合先锋影音下载| 亚洲**2019国产| 国产一区二区三区在线播放免费观看| 久久视频在线视频| 97国产在线视频| 日韩视频第一页| 亚洲第一精品电影| 亚洲аv电影天堂网| 国产91对白在线播放| 精品免费在线观看| 欧美性视频精品| 亚洲精美色品网站| 91色中文字幕| 亚州成人av在线| 日韩在线观看精品| 国产视频精品免费播放| 91中文字幕在线观看| 中文字幕日韩精品在线| 91免费观看网站| 日韩国产在线播放| 蜜臀久久99精品久久久无需会员| 欧美在线影院在线视频| 亚洲男人av在线| 精品国产精品三级精品av网址| xvideos成人免费中文版| 色999日韩欧美国产| 亚洲精品suv精品一区二区| 亚洲精品综合久久中文字幕| 久久久视频免费观看| 26uuu久久噜噜噜噜| 国产精品精品视频| 欧美激情一区二区三区在线视频观看| 久久久精品在线观看| 欧美激情三级免费| 最近2019免费中文字幕视频三| 国产一区二区三区在线免费观看| 国产91精品在线播放| 欧美老妇交乱视频| 亚洲999一在线观看www| 国产日韩专区在线| 欧美日韩一区二区三区在线免费观看| 国产精品v日韩精品| 狠狠综合久久av一区二区小说| 亚洲影院污污.| 欧美精品18videos性欧美| 欧美电影免费观看高清完整| 97视频免费在线观看|