Oracle

應用作業中止,<1 顆粒大小無法分配,ASMM 開啟

  • December 29, 2016

全部

我的團隊正在嘗試解決我們偶爾看到的一個真正給我們帶來麻煩的預言機問題。

我們有一個更新過程,通過使用 Apply 作業的包導入 .dmp 文件。(不是我們選擇以這種方式實現它……)

問題是,我們讓這個應用作業中止,錯誤為 4031 無法從記憶體中分配 <100 個字節(各種值,通常從 60 到 90),共享池被標記為罪魁禍首。ASMM 已開啟。伺服器配置了大約 500 MB 的記憶體來執行(這些是舊的 Server 2003 環境,因此記憶體需求量很大)。我擔心這個錯誤 - 在我看來,錯誤應該總是報告 4k 的倍數,因為這是我們的顆粒大小,但也許我誤解了釋放記憶體的過程。我還擔心伺服器沒有根據需要釋放包。

我相信修復是使用 dbms_shared_pool.keep(“PACKAGE NAME”) 來固定用於執行應用作業的包,這樣它就不必再次分配記憶體,但我們需要在部署之前測試這個修復,出於各種組織原因。我們還計劃為 oracle 數據庫分配更多記憶體。設置最小大小不是一個解決方案,因為我們已經在池的大小高於最小值並啟用 ASMM 時看到了這個問題。我們還嘗試將 sga 最大大小設置為更高的值,並固定有問題的包,但同樣,由於無法重現問題,這是一個等待遊戲,看看它是否會再次發生。

我們的主要問題是可靠地重現問題 - 即使禁用 ASMM 並將共享池設置得盡可能小,我們也無法可靠地重現問題。我們已經將共享池變得足夠小,以至於 Web 界面甚至無法將圖像標籤從數據庫中提取出來,或者從相應的表中查詢登錄資訊,但應用作業仍然可以可靠地執行。

我們沒有內部 DBA,因此很自然地我們可能會遺漏一些明顯的步驟。

在 8 個伺服器環境中的 2-3 個伺服器上偶爾會出現此問題。這些單獨的伺服器都看到不同組的類似使用。我不清楚為什麼只有一些伺服器遇到這個問題,但無法確定任何確鑿的原因。

我希望能夠可靠地完全避免此問題,或者可靠地強制共享池無法為該作業分配字節,以便我們可以確認這些修復程序確實有效。

請記住,此時我已經閱讀了關於 SO 的大部分 4031 文章 - 這個問題已經調查了數週。可能不適合將此問題標記為重複並將我引向另一個問題 - 我已經閱讀過它。它沒有回答我的問題。這是來自普通舊Stackoverflow的交叉文章

我已經檢查了其中一台伺服器的跟踪文件,但它並不具有啟發性——我不確定要查找什麼。

我們已經嘗試刷新共享池,但同樣無法重現問題,它變成了“觀望”修復,這不是我們的資助者真正感興趣的答案。

該答案基於原始問題評論中的討論。

任何 ORA-4031 的主要原因是共享池已用盡,無法為數據庫分配新連接。這將導致數據庫崩潰。我不會評論執行導入的包是否只是最後一根稻草,或者如果它是整個問題,在架構上,我只是提供一種解決方法。

由於伺服器記憶體的小特性,空間受到極大限制。我建議將特定數量的記憶體分配給 spfile 中的 shared_pool_size 參數,並在每次出現問題時逐步增加記憶體使用量。當然,這意味著 SGA_max_size 和 SGA_target_size 的增加。初始大小和增量大小將留給作者討論,但我認為 50m 的跳躍足夠小,可以讓伺服器滿意,並且有合理的機會成功解決 ORA-4031。

如果在問題開始解決之前伺服器的記憶體已經耗盡,那麼我將開始探勘導入包負載,以查看該過程如何使用 shared_pool 是否效率低下。

引用自:https://dba.stackexchange.com/questions/159473