一個小故事
某天,小王正在和HR妹妹閑聊,正HAPPY時,,突然收到系統告警消息,數據庫磁盤被剩余空間500M,OMG,不行,磁盤快滿了,要是業務要停了,,那就小王只能刪庫到跑路了,,,
先檢查下,有沒有可以刪除的不用的文件,結果都是重要的或者拿不准的。先收縮下數據庫吧,點擊運行。等收縮完成就可以繼續去根HR妹妹聊天了。突然電話座機和手機齊鳴,小王心里一種不祥的預感呢?好像這個場景在哪里見過。。不會是數據庫阻塞了吧?? 手忙腳亂的先接起手機,因為來電顯示是某業務部門主管 “小王啊,,現在系統卡死了,全部不動了,是怎么回事啊,你趕緊處理下”,,“恩,好的,我馬上檢查下”,然后又接起座機,是另外一個部門的主管說報表看不了。慌忙應付完了,趕緊檢查數據庫執行中的語句。 果然數據庫產生大量的阻塞,,連帶數據庫服務器的操作都變得好慢(是我的心理作用嗎?)。正准備先把收縮操作取消了,,電話有同時響起了,,,唉,不管了,先處理問題。然后點擊取消。經過漫長的等待,,終於完成了,然后打電話跟各個部門解釋,,寫事故報告,,悲劇,,今天的午飯都不想吃了。
這個場景是不是很熟悉啊,關於數據庫收縮的問題,是我在群里,論壇里,看到新人問過最頻繁的問題之一。今天這篇文章對數據庫收縮進行有個框架性說明,希望小伙伴在以后遇到相關的
問題時,做到心中有數。
關於收縮的建議
不到萬不得已,千萬不要收縮數據庫。收縮數據庫影響極大:
1.收縮數據庫對數據庫的影響極大,產生大量日志和碎片,而且會鎖表。如果你的庫當前正在被使用,收縮不下去非常正常。
2.收縮數據庫一定要手工來做的,而且是在維護窗口期做的事。
3.盡量使用語句來執行,可以提示錯誤
下面的文章詳細介紹:
http://www.sqlskills.com/blogs/paul/why-you-should-not-shrink-your-data-files/.
收縮的正確姿勢
在不得不收縮的時候,參考下面的步驟
1.找到數據庫中最大的幾個表,重建所有索引。首先嘗試指定Truncate Only收縮方式.它只是移除文件尾部的空閑空間,並不重新組織已經使用的數據頁。
DBCC SHRINKDATABASE (AdventureWorks2012, TRUNCATEONLY);
2 最后才考慮,不帶選項的收縮。收縮不要一次性全部收縮。 可以每次收縮2G左右。不要把空間可用空間全部收縮了,可以剩余一部分比如4G。收縮完后,記得重建索引.
補充:
還有一種辦法就是新建文件組,使用CREATE INDEX ... WITH(DROP_EXISTING = ON)ON語法將所有相關的的表和索引移動到新文件組。然后收縮舊的文件組。
3.可在進程中的任一點停止 DBCC SHRINKDATABASE 操作,任何已完成的工作都將保留。
4. 不能在備份數據庫時收縮數據庫
可能需要收縮的場景
1.你刪除了大量數據,而且數據不太可能增長。
2.要移除某個文件時,你需要先清空數據文件。
總結
那我們處理磁盤空間不足的最好的辦法是什么呢?最好的辦法是在最初規划時,預估好未來一年或者二年的數據增長。給磁盤划分足夠的空間。設置好數據庫的初始大小,並且將自動增長使用固定量增長。