數據庫自動收縮帶來的嚴重問題


背景

  今天早上11點的時候有客戶打電話過來說醫院的cis系統一直有阻塞,導致系統有卡慢的現象,信息中心的電話都快被打爆了,信息科人員很頭疼啊。

萬幸我們給數據庫裝了‘攝像頭’會把數據庫的一切狀態操作都會記錄下來,趕緊要了遠程之后看到了系統確實存在大量的阻塞(下圖)

 

 

通過點擊紫色圓點之后發現了長長的阻塞鏈,(注:會話標識33的語句是阻塞的源頭,下面的語句為被阻塞的語句)可以看到被阻塞的語句確實等待了很長時間,系統因為大量的阻塞,前端人員的使用確實有卡慢的現象。(下圖)

 

那么系統為什么會有這么嚴重的阻塞呢?怎么造成的?會話標識為33的語句到底是何方神聖?接下來我們來一探究竟。

在sql server 管理工具里邊用語句查詢會話標識為33的語句為自動收縮的命令,看了看時間從2018年8月15號自動收縮已經開始運行,進度為79%,(下圖)

 

接下來從體檢項中可以看到相關數據庫自動收縮配置為開啟狀態。

 

 

通過和醫院工程師交流得知,昨天下午三點半有做過數據遷移的操作,刪除了100多G的數據,(下圖)

 

 

   經過分析和查詢一些資料得出以下結論,數據庫中的自動收縮選項在很早之前就已經開啟,但是沒有真正收縮過,昨天下午三點的時候刪除了大量數據,觸發了自動收縮數據庫文件的操作,

那么為什么今天早上才有阻塞的情況呢?收縮數據庫對於sql server來說本身就是一件浪費資源的事情,在昨天下午三點半的時候前端業務量減小,沒有影響到業務,而到了今天早上業務量增多,達到業務高峰期,才會把業務相關的語句阻塞住,嚴重影響了前端人員的使用。

如何緩解及解決?

因為在收縮數據文件,要重新整理數據,進度到了79%,在這個自動過程中,數據邊收縮邊釋放,到達100%后收縮完成后,此問題會解決。另外一種方法就是重啟sql服務,事務會提交或回滾,此問題也會得到解決(不建議)

 下面來點技術性的東西,滿足一下求知者的欲望……….

 

 什么是自動收縮?

 

 

隨着數據量的增加數據庫的設備文件(MDF\LDF)會不斷增長,當數據庫中的某些數據刪除,數據庫設備文件的大小並不會隨着數據量的減少而減少,數據庫設備需要占用的磁盤空間就沒那么大了,這時候自動收縮就可以釋放出磁盤空間,主要直觀體現在數據庫設備文件的大小上,避免資源的浪費.

在什么條件下會觸發?

在開啟自動收縮選項的情況下,SQL Server定期會檢查文件使用情況。如果空閑空間大於25%,SQL Server就會自動運行自動收縮數據庫文件的動作。

(附上微軟官方鏈接:https://docs.microsoft.com/zh-cn/sql/t-sql/statements/alter-database-transact-sql-set-options?view=sql-server-2017&viewFallbackFrom=sql-server-2014

例如:數據遷移刪除大量數據時,空閑空間大於25%時,會觸發自動收縮功能。

帶來的危害(自動收縮和手動收縮)?

對於一個磁盤空間很緊張的系統,這個設置無疑是有幫助的。但是從數據庫自身的健康和性能考慮,這個設置並不建議多用。這是因為:

1、數據文件收縮導致了索引的完全碎片化,索引的效率大大降低,嚴重影響性能。

2、數據文件的收縮同樣產生了大量的I/O操作,耗費大量的CPU資源,性能下降。

3、在業務高峰期的時候可能會造成大量的阻塞。

(附上鏈接資料,有興趣的同學可以去研究一下:

https://www.cnblogs.com/kerrycode/archive/2013/06/04/3116339.html

一點點小建議:

1、不要開啟自動收縮選項

2、不到萬不得已,千萬不要收縮數據庫。收縮數據庫影響極大。

3、如果磁盤空間真的不足,需要做收縮的時候,一定要手工來做,而且是在維護窗口期間;並且盡量使用語句來執行,可以提示錯誤;盡量一次不要收縮太多,分幾次收縮。

  

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM