oracle表空間太大?
首先感謝作者對小編的邀請:最近工作中遇到了Oracle進程大量占用系統內存,直到內存占用逼近系統全部內存然后導致系統奔潰的情況。
先說明一下環境。
Windows 2008 服務器,Oracle 10.2.0.4.0 企業版,服務器有16G內存,oracle.exe的內存占用到15.9G導致服務器崩潰。
發現問題時,使用 以下sql查詢發現 一個oracle 的會話占用了大量的內存。
SELECT server "連接類型",? s.username,? oSUSEr, NAME,? VALUE/1024/1024 "占用內存MB",? s.SID "會話ID", s.serial#,? spid "操作系統進程ID", p.PGA_USED_MEM,? p.PGA_ALLOC_MEM,? p.PGA_FREEABLE_MEM, p.PGA_MAX_MEM FROM v$session s, v$sesstat st, v$statname sn, v$process p WHERE st.SID = s.SID AND st.statistic# = sn.statistic# AND sn.NAME LIKE 'session pga memory' AND p.addr = s.paddr ORDER BY VALUE DESC此會話的PGA_USED_MEM,? PGA_ALLOC_MEM,? PGA_FREEABLE_MEM, PGA_MAX_MEM 等值可以達到4G左右,可以斷定是會話的問題。 經查雖然我們在oracle中限定了PGA的大小也就是配置了PGA_AGGREGATE_TARGET
,但是PGA_AGGREGATE_TARGET作為一個Target Oracle只會做的盡量不超過此值,并不保證一定不超過。
情況很明顯某個會話大量執行沒有結束占用了內存。 下面可以通過各種方法查明回來的來源。
我通過Oracle 的EM企業管理器發現,有5條SQL大量的占用了數據庫和CPU時間。于是讀取SQL的內容逐一執行發現。其中一條SQL執行長達4個小時無法結束。在執行的同時由于需要保存臨時結果占用了大量內存。
下一步就是聯系相關開發修正SQL問題解決。
?
此次還有一點不明白,Oracle應該可以限制某個會話的內存上限,但是不知為何沒有成功限制。
解決方案二:解決oracle服務占用內存過高的問題,通常我們在自己電腦上搭建項目環境時,都免不了要安裝Oracle。不管你硬件多強悍,都會發現,Oracle服務一旦啟用,內存立馬吃緊。筆者內存8G,啟動一個VS,啟動一個Eclipse,啟動一個虛擬機,開一個Tomcat,再開一個PL/SQL,內存基本就耗去了一大半。再啟用Oracle服務,內存馬上飆升五六百兆,程序便會頻繁出現假死。 其實這是因為安裝Oracle時,為了均衡電腦性能和數據庫性能,默認內存大小為物理內存的1/8,自身內存比較大時,oracle所占的內存也會變大。而通常,我們自己的環境并不需要分配那么大的內存來支持Oracle,這種情況下,我們可以通過修改sga值來減少系統中oracle占用內存過大問題。
用dba身份進入oracle,本人使用sqlplus修改(sqlplus sys/密碼 as sysdba),若使用PL/SQL,可以在Command Window執行:
(1)show parameter sga; --顯示內存分配情況
(2)alter system set sga_max_size=200m scope=spfile; --修改占用內存的大小
修改后重啟Oracle服務,再查看資源管理器,Oracle占用資源便會降至200M以下。不過如此修改所付出的代價就是數據庫性能的下降,因此修改時不宜調得太小。