新聞中心
近年來,我們專注于提供全系列企業級性能管理方案和相關的IT服務,在幫助用戶提高業務效率和整體生產力的同時,降低運營和運維成本。
返回列表
首頁 / 新聞資訊 / 行業資訊
Temp表空間占用長時間不釋放,是誰惹的禍
來源:   日期:2018-06-26
微信圖片_20180626150221.jpg


作者:李向輝  | 東方龍馬·成都


眾所周知Oracle臨時表空間主要是用于數據庫較大的臨時排序用,在PGA分配的工作區空間不足以容納排序數據時使用臨時表空間。在用戶執行的排序相關的語句執行完畢后臨時段回收,相應的臨時空間占用也會自動釋放。但針對LOB所產生的臨時段的釋放不會遵從些機制。



使用率過高帶來的影響

臨時表空間使用率過高帶來的影響:


Temp表空間占用長時間不釋放案例190.png

由于一般業務中都會存在大量排序的sql(如distinct、order by、group by、union、union all、hash join等),所以一旦臨時表空間長時間使用率過高將導致核心sql因ORA-1652錯誤而終止,最終導致業務處理失敗,如果是核心業務那么這個影響是巨大的。



遇到的問題

某核心OLTP生產系統最近發現臨時表空間占用高達90%多,且持續監控發現一直不釋放,而且還在緩慢增長


Temp表空間占用長時間不釋放案例396.png



原因查找

106G的臨時表空間使用了102G,這么大的臨時表空間使用率在一個正常的OLTP系統中是很罕見的。



1



首先查看活動會話數,如下顯示活動會話數總共27個,是很正常的,可以肯定臨時表空間占用較高的原因并非由大量需要排序的異常會話引起,常見的這個原因可以排除。

Temp表空間占用長時間不釋放案例535.png


2



定位哪些進程對應的哪些語句占用了較多臨時表空間,經檢查發現如下:

Temp表空間占用長時間不釋放案例573.png


從上面可以看出有10個進程占用了大約100多G的臨時表空間,且顯示為TEMPORARY LOB_DATA,說明正是這10個進程導致的臨時表空間被占滿且不釋放,經連續多次觀察這10個進程執行的為sql_id為d12s8kpkp85zq的同一個sql。該sql語句如下:

Temp表空間占用長時間不釋放案例709.png


這個sql查詢的是所有字段,且這個表有個字段正是LOB型,從以下圖中可以看出該字段存儲應該是xml文件解析的內容:

Temp表空間占用長時間不釋放案例768.png


3



確定這些語句對應的會話,明確來源


Temp表空間占用長時間不釋放案例791.png

Temp表空間占用長時間不釋放案例793.png

Temp表空間占用長時間不釋放案例795.png


從臨時LOB段的使用情況來看,主要由10個會話占用了臨時表空間,且這10個會話均是LOB緩存占用了較大的空間。通過持續查看這10個會話的session信息,可以看出這10個會話執行的正是第一步定位的語句,且這10個會話均是由IP地址為xxxx的應用主機的ocs_rentfee_imp這個程序發起,會話sid一直不變,與應用開發商確認這個程序是C程序寫的。


通過以上的分析不難看出引起臨時表空間使用率超高且不釋放的來源是應用的C程序使用長連接模式連接到數據庫對數據庫一張含有clob字段表進行按條件排序查詢導致。


4


為何由應用調用的使用的臨時LOB緩存未釋放


Oracle在對包含lob字段進行讀取、修改或寫入時均使用臨時表空間TEMPORARY LOB_DATA段以緩存形式來存儲這些臨時數據。從以下Oracle對LOB臨時段的解釋中可以看出如果是通過過應用程序來訪問LOB字段時Oracle并不會顯式地去關閉或清理臨時LOB,這是由于Oracle作為服務端并不知道客戶端應用程序什么時候結束對LOB臨時段的使用,何時應該清理是由應用程序確定的。


Temp表空間占用長時間不釋放案例1275.png


那么客戶端應用應該如何去清理這些臨時LOB以釋放其占用的臨時表空間呢?


既然清理由應用程序確定,那么必然是程序開發語言是有這樣釋放lob緩存的代碼的,比如對于Java程序有java.sql.NClob.free()這個方法來釋放lob,對于其它通過調用 Oracle的API接口來實現的應用,oracle給出了相應如下的方法來釋放Lob:


Temp表空間占用長時間不釋放案例1446.png




解決措施

1.應用程序更改相應模塊的連接方式為短連接(例如對于由應用程序在調用完畢后執行關閉jdbc連接)



2.應用程序在調用相應的程序方法在對LOB引用完畢后主動關閉(此方法為最佳方法,但往往涉及到一些核心代碼,開發商通常不愿意去更改這些代碼,更改實施難度較大)


3.相應的應用模塊定期重啟(此方法操作簡單,但如果相應的應用模塊為核心業務時,往往需要有效的停機窗口)


4.數據庫級別設置事件打開清理開關:

alter session set events '60025 trace name context forever';


此方法限制條件為:

10.2.0.4版本及以上且只有當數據庫中所有緩存的臨時段和非緩存的臨時段均為0時才執行清理,如果數據庫中事務較繁忙且始終存在cache temp lob and no-cache temp lobs均不為0時此方法將失效。就目前而言生產庫上的這個lob緩存由于是長連接,所以cache tmp lob始終不為0,所以此方法不可行。


如果生產中遇到類似問題,可以考慮以下方法,尋找最適合自己的方法,本次由于這個業務模塊是非核心模塊,在晚上業務空閑時應用廠商對相應模塊的應用進行了重啟,重啟完成后Temp表空間隨之也釋放了。


Temp表空間占用長時間不釋放案例1991.png



引申問題

既然之前說到通過應用程序來引用lob數據時oracle不會也不應該去負責清理這些不再使用的lob段,那么還有通過pl/sql或sql直接對lob字段的訪問這種情況的存在,那么對于這些訪問方式oracle又是如何清理釋放臨時lob段的呢?



通過oracle聲明我們可以看出,這些方式oracle會在訪問下一行數據時顯示釋放這些lob緩存。


Temp表空間占用長時間不釋放案例2169.png


備注:以上Oracle信息的引用來源于

Best Practises for XMLType Temporary LOB Usage (文檔 ID 1955135.1)

How to Release the Temp LOB Space and Avoid Hitting ORA-1652 (文檔 ID 802897.1)




端午習俗

五月初五,端午節

賽龍舟,

食粽子,

配香囊,

涂雄黃藥酒。


據《荊楚歲時記》記載,因仲夏登高,順陽在上,五月是仲夏,它是第一個午日正在登高順陽好天氣之日,故5月初五亦稱為“端陽節”。


提前祝你
端午節安康





|  北京    |    上海    |   廣州    |   成都    |


4008-906-960



微信圖片_20180626150229.png



4008-906-960

全國免費咨詢電話
  • 官方微博
  • 官方微信
Copyright 1998-2016 版權所有 北京東方龍馬軟件發展有限公司 京ICP備14000200號-1
上海时时彩加盟