sqlserver自動收縮資料庫引起大量阻塞

2021-09-21 06:50:05 字數 1396 閱讀 2751

最近遇到乙個資料庫設定了自動收縮,收縮期間引起大量阻塞的問題,記錄下看到的文章學習

隨著資料量的增加資料庫的裝置檔案(mdf\ldf)會不斷增長,當資料庫中的某些資料刪除,資料庫裝置檔案的大小並不會隨著資料量的減少而減少,資料庫裝置需要占用的磁碟空間就沒那麼大了,這時候自動收縮就可以釋放出磁碟空間,主要直觀體現在資料庫裝置檔案的大小上,避免資源的浪費.

在開啟自動收縮選項的情況下,sql server定期會檢查檔案使用情況。如果空閒空間大於25%,sql server就會自動執行自動收縮資料庫檔案的動作。

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

對於乙個磁碟空間很緊張的系統,這個設定無疑是有幫助的。但是從資料庫自身的健康和效能考慮,這個設定並不建議多用。這是因為:

1、資料檔案收縮導致了索引的完全碎片化,索引的效率大大降低,嚴重影響效能。

2、資料檔案的收縮同樣產生了大量的i/o操作,耗費大量的cpu資源,效能下降。

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

不到萬不得已,千萬不要收縮資料庫。收縮資料庫影響極大:

1.收縮資料庫對資料庫的影響極大,產生大量日誌和碎片,而且會鎖表。如果你的庫當前正在被使用,收縮不下去非常正常。

2.收縮資料庫一定要手工來做的,而且是在維護視窗期做。

3.盡量使用語句來執行,可以提示錯誤

4.盡量一次不要收縮太多,分幾次收縮。

在不得不收縮的時候,參考下面的步驟

1.找到資料庫中最大的幾個表,重建所有索引。首先嘗試指定truncate only收縮方式.它只是移除檔案尾部的空閒空間,並不重新組織已經使用的資料頁。

dbcc shrinkdatabase (adventureworks2012, truncateonly);
2 最後才考慮,不帶選項的收縮。收縮不要一次性全部收縮。 可以每次收縮2g左右。不要把空間可用空間全部收縮了,可以剩餘一部分比如4g。收縮完後,記得重建索引.

補充:還有一種辦法就是新建檔案組,使用create index ... with(drop_existing = on)on語法將所有相關的的表和索引移動到新檔案組。然後收縮舊的檔案組。

3.可在程序中的任一點停止 dbcc shrinkdatabase 操作,任何已完成的工作都將保留。

4. 不能在備份資料庫時收縮資料庫

1.你刪除了大量資料,而且資料不太可能增長。

2.要移除某個檔案時,你需要先清空資料檔案。

那我們處理磁碟空間不足的最好的辦法是什麼呢?最好的辦法是在最初規劃時,預估好未來一年或者二年的資料增長。給磁碟劃分足夠的空間。設定好資料庫的初始大小,並且將自動增長使用固定量增長。

參考

SQL Server 「資料收縮」詳解

在ms中建立資料庫時會為資料庫分配初始的大小 如下圖 資料庫和日誌兩個檔案 隨著資料庫的使用檔案會逐漸增大。資料庫檔案大小的增加有兩種方式 要明白為何資料庫需要收縮,首先需要理解兩個概念 由此可以理解為 分配空間 使用空間。在實際使用的過程中可能會出現分配空間為100mb,而使用空間僅為20mb,這...

SQL Server 「資料收縮」詳解

在ms中建立資料庫時會為資料庫分配初始的大小 如下圖 資料庫和日誌兩個檔案 隨著資料庫的使用檔案會逐漸增大。資料庫檔案大小的增加有兩種方式 要明白為何資料庫需要收縮,首先需要理解兩個概念 由此可以理解為 分配空間 使用空間。在實際使用的過程中可能會出現分配空間為100mb,而使用空間僅為20mb,這...

SQL Server 「資料收縮」詳解

在ms中建立資料庫時會為資料庫分配初始的大小 如下圖 資料庫和日誌兩個檔案 隨著資料庫的使用檔案會逐漸增大。資料庫檔案大小的增加有兩種方式 要明白為何資料庫需要收縮,首先需要理解兩個概念 由此可以理解為 分配空間 使用空間。在實際使用的過程中可能會出現分配空間為100mb,而使用空間僅為20mb,這...