SQL SERVER運維日記--收縮數據庫


一個小故事

某天,小王正在和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.要移除某個文件時,你需要先清空數據文件。

 

總結

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

 


免責聲明!

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



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