今天收到預警消息,提示磁盤空間已經滿了,感覺很奇怪.剛裝的新機器怎么可能會磁盤空間不足.登陸看了看
可以看的到tempdb已經65G的了,而且顯示是百分百可用.這個就很奇怪了,為什么會出現這種情況呢.考慮到磁盤會爆滿,立即重啟了sqlserver,修改tempdb的初始值大小為10G,然后回收調可用的空間給OS,看樣子是告一段落了.事實上並不是這樣,我的tempdb第二天暴增了.這是怎么回事?我這台機器現在跑的程序基本沒有,只是作為復制的訂閱端.怎么會出現這種情況呢.然后就登陸看了看數據庫統計信息:
SELECT top 10 t1.session_id, t1.internal_objects_alloc_page_count, t1.user_objects_alloc_page_count, t1.internal_objects_dealloc_page_count , t1.user_objects_dealloc_page_count, t3.login_name,t3.status,t3.total_elapsed_time from sys.dm_db_session_space_usage t1 inner join sys.dm_exec_sessions as t3 on t1.session_id = t3.session_id where (t1.internal_objects_alloc_page_count>0 or t1.user_objects_alloc_page_count >0 or t1.internal_objects_dealloc_page_count>0 or t1.user_objects_dealloc_page_count>0) order by t1.internal_objects_alloc_page_count desc
查看數據庫的會話占用的tempdb的空間大小,然后根據SPID查看詳細信息,然后查處會話的具體信息
根據信息我查到有一個會話占用特別多的臨時空間,仔細查看了一下會話的詳細信息.select 語句如下:
select 1
很奇怪對不對,有兩個問題考慮一下:
1:為什么要一直不停執行這個語句
2:這個語句是用來做什么的
根據以上統計信息我們可以查出來登陸名和程序所在的程序名,初步確認了是那個程序造成的,然后根據上面兩個疑問去查詢
發現有以下代碼:
紅線內是原來沒有的,一個數據庫鏈接鏈接以后沒有釋放.所以才會一致鏈接數據庫不釋放整個會話和會話資源.然后加上以后重新啟動程序.繼續監控,發現問題已經解決了.