天天看點

資料庫自動收縮帶來的嚴重問題

背景

  今天早上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、如果磁盤空間真的不足,需要做收縮的時候,一定要手工來做,而且是在維護視窗期間;并且盡量使用語句來執行,可以提示錯誤;盡量一次不要收縮太多,分幾次收縮。

繼續閱讀