【ASK_ORACLE】ORA-04030診斷方法及預防措施
為什麼會產生ORA-04030?
從ORA-04030的報錯資訊(ORA-04030: out of process memory when trying to allocate xxx bytes (xxx,xxx))可以推理出:是由於Oracle程式無法從作業系統分配到更多的記憶體。但這是什麼樣的記憶體呢?該記憶體由PGA組成,記憶體包含堆疊以及用於儲存使用者會話資料、遊標資訊和排序區的UGA。因此,ORA-04030表示程式需要更多記憶體(UGA或PGA)。
還有一些其他原因導致作業系統記憶體被耗盡,例如SGA太大或系統虛擬記憶體(實體記憶體和Swap)中包含的程式過多。許多作業系統會對單個程式能夠獲取的記憶體量加以限制來進行自我保護。
排查措施
1. 檢查是否仍然有足夠的可用記憶體?
檢查命令:top,vmstat,swapon -s
如果有足夠的記憶體可用,需要再檢查作業系統是否存在強制限制。如果記憶體已被耗盡,就需要找出記憶體被用到了哪些地方。
注:
top:通常會顯示實體記憶體和交換空間的統計資訊
swapon -s:顯示交換空間使用情況
vmstat:顯示可用實體記憶體
2. 檢查是否設定了作業系統限制?
如果仍剩餘大量的虛擬記憶體,那麼有可能是我們需要使用的記憶體量是被作業系統限制了。可使用ulimite -a檢視。有的問題可能是因為限制設定得過低造成的,所以需要進行相應的增加。也有的問題可能是由於我們需要使用的太多造成的。但是 顯示“unlimited”的不一定意味著不受限制,實際也可能是基於歷史原因的限制,例如“max memory size”顯示“unlimited”但是實際OS最大記憶體只有4GB。
3. 檢查是否被Oracle配置PGA的引數限制?
(1)首先檢視PGA的引數大小
SQL> show parameter PGA_AGGREGATE_TARGET
(2)檢視PGA的實際使用率
SQL> select sum(value)/1024/1024 Mb from v$sesstat s, v$statname n where n.STATISTIC# = s.STATISTIC# and name = 'session pga memory';
4. 檢查哪個程式需要的記憶體過多?
一些操作會需要大量的程式記憶體,例如PL/SQL大表或大量的排序操作。在這些情況下,在出現錯誤ORA-04030之前,程式將會執行一段時間,所以在報錯之前,可以找出記憶體分配的位置和原因。用以下SQL來查出實際使用的PGA和UGA大小排行:
SQL> select sid,name,value from v$statname n,v$sesstat s where n.STATISTIC# = s.STATISTIC# and name like 'session%memory%' order by 3 asc;
在結合排查步驟1的方法來綜合判斷到底是Oracle本身消耗過多作業系統的記憶體,還是其他軟體程式消耗了過多記憶體。
注:
使用命令“ps -AF --sort resident”可列出具有最大駐留集大小的所有程式。
5. 如何找到記憶體消耗最大的SQL的內容?
如果確定了是Oracle的SQL程式佔用過多記憶體,可以查出該SQL所對應的具體內容:
SQL> select sql_text from v$sqlarea a, v$session s where a.address = s.sql_address and s.sid =<SID>;
避免ora-04030的一些建議
1. 一些操作需要大量的記憶體。對於排序問題,如果排序少,可以減少SORT_AREA_SIZE引數大小。因為Oracle程式會將PGA中的SORT_AREA_SIZE位元組分配給排序操作。如果完成搜尋需要更多記憶體,伺服器程式將會使用臨時表空間。所以, 減少SORT_AREA_SIZE會對需要大量排序操作的查詢效能產生影響。
2. Oracle 9i及更高版本,透過將引數WORKAREA_SIZE_POLICY設定為“AUTO”,以及在初始化檔案中指定PGA_AGGREGATE_TARGET的大小,即可啟用自動SQL執行記憶體管理功能。使用PGA的自動記憶體管理將有助於減少發生ORA-04030錯誤機率。
3. PL/SQL程式也會佔用大量PGA記憶體,因此可能需要重新最佳化應用程式的某些部分程式碼。
4. 檢視optimizer策略,一些訪問路徑可能會因排序操作、較多行上的函式使用等原因而需要使用更多記憶體。
5. 在某些作業系統上(例如 Microsoft Windows),可能要降低SGA的大小可以讓PGA獲得更大的記憶體。
6. 確保作業系統和Oracle引數設定合理。
7. 確保有足夠的可用記憶體(實體記憶體和Swap)。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69992972/viewspace-2782773/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 常見病發病原因及治療、預防措施
- 網路釣魚攻擊常用方法及防禦措施!
- 威脅預警|微軟最新遠端高危漏洞通告及防禦措施微軟
- arp欺騙實驗及預防方法
- 吃透 JVM 診斷方法與工具使用JVM
- 5種常見的 DNS 故障診斷及問題處理方法DNS
- 前端常見的安全問題及防範措施前端
- 雲安全預警,雲端計算的預防措施和風險!
- 淺談Webshell對網站的危害以及預防措施.Webshell網站
- 應對勒索軟體,應採取哪些預防措施
- 常見RDP協議攻擊方法 防禦措施協議
- 網路釣魚攻擊常見手段及防範措施!
- 如何建設網路安全架構及防禦措施?架構
- 印刷機械行業裝置遠端監控及故障預警診斷系統行業
- 使用ErrorStack進行錯誤跟蹤及診斷Error
- [JVM] 應用診斷工具之Fastthread(線上診斷)JVMASTthread
- ORACLE診斷案例Oracle
- MySQL故障診斷常用方法手冊(含指令碼、案例)MySql指令碼
- Win10系統使用疑難解答診斷提示診斷策略服務已被禁用的解決方法Win10
- Java診斷利器ArthasJava
- SQL問題診斷SQL
- 高防伺服器如何進行防禦措施伺服器
- 乾貨 | 呆滯庫存(Slow moving)產生原因分析和預防措施
- CSRF攻擊原理及預防手段
- NodeJS命令列注入:示例及預防NodeJS命令列
- 雲伺服器用MTR診斷Ubuntu網路問題方法伺服器Ubuntu
- 爬蟲如何防網站封IP?防封有效措施爬蟲網站
- 網站安全有哪些防護措施?網站
- 免費網站seo診斷:從哪些維度進行診斷呢?網站
- 不可告知!黑客常見的4種勒索方式和預防措施,你是否知道?黑客
- Oracle診斷事件列表(轉)Oracle事件
- Java執行緒診斷Java執行緒
- NodeJS路徑遍歷:示例及預防NodeJS
- 常見的5種網路釣魚攻擊型別及防禦措施!型別
- 直播分享| 騰訊雲 MongoDB 智慧診斷及效能優化實踐MongoDB優化
- AI診斷心臟病比人類更準?但這只是識圖,不是診斷AI
- OpenAI o1預覽版在數秒內準確診斷疾病OpenAI
- TiDB 查詢優化及調優系列(三)慢查詢診斷監控及排查TiDB優化