1.OpenVMS系統:要檢查你能使用的實體記憶體的總量,請檢查工作(頁面)區配額(working set quotas)和分頁檔配額(pagefile quota)。請查詢OpenVMS使用指南確定配額情況和如何修改它們。根據使用進程的不同以及啟動它們方式的不同,配額使用將不同於oracle的統計。Process/id=<process id>/quota將顯示對於一個特定的進程還有多少剩餘配額可使用。
UAF> show oracle7
Username: ORACLE7 Owner: Oracle7 DBA
Account: SUPPORT UIC: [200,2] ([SUPPORT,ORACLE7])
CLI: DCL Tables: DCLTABLES
Default: DISK$BOBBIE_USER1:[ORACLE7]
LGICMD: LOGINFlags:
Primary days: Mon Tue Wed Thu Fri
Secondary days: Sat Sun
No access restrictions
Expiration: (none) Pwdminimum: 6 Login Fails: 0
Pwdlifetime: (none) Pwdchange: 3-DEC-1997 15:38
Last Login: 27-MAY-2003 14:54 (interactive), 26-MAY-2003 16:15 (non-interactive)
Maxjobs: 0 Fillm: 1200 Bytlm: 180000
Maxacctjobs:0 Shrfillm: 0 Pbytlm: 0
Maxdetach: 0 BIOlm: 500 JTquota: 8192
Prclm: 20 DIOlm: 500 WSdef: 2500
Prio: 4 ASTlm: 4000 WSquo: 4096
Queprio:0 TQElm: 4000 WSextent: 30000
CPU: (none) Enqlm: 18000 Pgflquo: 750000
Authorized Privileges: .....
$ sho proc/id=20200139/quota
24-JUN-2003 12:30:54.39 User: ORACLE7 Process ID: 20200139
2.Windows系統:對於微軟的windows作業系統來說,oracle進程集作為一個進程的許多線程來運行。到目前為止,我還沒有找到一個方法來查看某個線程的記憶體使用量情況。然而我們可以檢查出oracle是否對作業系統分配的記憶體感到滿意。從作業系統的角度來看,我們可以使用工作管理員。調出工作管理員,點擊“查看”按鈕,選擇“選擇列”,在彈出的視窗中在“虛擬記憶體大小”前打上勾。oracle.exe進程使用的虛擬記憶體大小( VM size)應該和SGA、PGA和進程堆棧以及代碼使用的記憶體總量相匹配。下面的查詢命令可以給出oracle使用的記憶體量,然而,這不包括進程堆棧以及代碼使用的記憶體量。
select sum(bytes)/1024/1024 Mb from (select bytes from v$sgastat union select value bytes from v$sesstat s,v$statname n where n.STATISTIC# = s.STATISTIC# and n.name = 'session pga memory' );MB
3.Unix系統:“top”工具是一個很有用的工具,你能夠定製顯示和排序的列。“ps”命令在大多數系統中可以使用,但也有些不能。例如,在Linux上,“ps -AF --sort resident”將列出所有的進程最近的最大常駐記憶體集(resident set)(注二)。你也可參考<Note:174555.1> "UNIX: Determining the Size of an Oracle Process".
SQL> alter session set events '4030 trace name heapdump level 25';
或者在資料庫的init.ora檔案中設定這個事件。<Note:21234.1> EVENT: 10261 "Limit the size of the PGA heap" 這個dump能協助Oracle Support分析並找出引起過多的記憶體配置的原因。
對於如何避免這個錯誤的一般建議。
o 正如前面提到的一樣,某些操作會需要大量的記憶體。對於排序操作來說,減少SORT_AREA_SIZE可能有所協助。Oracle伺服器處理序會在PGA中分配排序操作需要的SORT_AREA_SIZE位元組。如果完成某個查詢需要過多的記憶體,伺服器處理序將會使用臨時段。這意味著,當查詢需要大量的排序操作時,更少的SORT_AREA_SIZE可以使得執行更緊湊。
o 對於9i或更高版本的oracle資料庫,可以裝置參數WORKAREA_SIZE_POLICY為AUTO來開啟自動SQL execution記憶體管理功能,也可以在初始設定檔案中指定PGA_AGGREGATE_TARGET的大小。
o PL/SQL常式也可能會需要大量記憶體,因此有必要在你的應用程式中重寫這部分查詢代碼。如果某個PL/SQL表經常被使用,它確實會在PGA中分配一塊記憶體。
o 再看一下最佳化策略,由於排序操作可能某些訪問路徑會需要太多的記憶體,函數調用返回過多的行等等……
o 在某些作業系統上,例如Microsoft windows,SGA的大小應該降低,以便於PGA獲得更大的記憶體。
o 確信你的作業系統和oracle資料庫的記憶體限制是適度的。
o 確信有足夠的記憶體(實體記憶體和交換空間)。
參考
General:
<Note:237899.1> Resolving ORA-4030 Errors After Upgrading
NT:
<Note:116076.1> Tackling ORA-4030 on WindowsNT
<Note:46001.1> Oracle Database and the Windows NT memory architecture, Technical Bulletin
Unix:
<Note:199746.1> How to Resolve ORA-4030 Errors on UNIX (unix specific but general enough for some suggestions)
UNIX: Determining the Size of an Oracle Process
VMS:
<Note:67033.1> Background process quotas <Note:68663.1> Dedicated server process quotas (SQL*Net V2.3.3, V8.0.X)<Note:70671.1> Process quotas for Bequeath connections (V7, V8)<Note:68849.1> Bequeath listener process quotas (V7, V8)<Note:68226.1> Listener process quotas (SQL*Net V2.3.3, V8.0.X)
@ Internal:
@ <Note:21234.1> EVENT: 10261 "Limit the size of the PGA heap"
@ This event is very usefull. It will cause the process to dump information when the PGA grows above the specified limit