SQLServer數據庫收縮相關知識筆記


1、爲什麼要進行數據庫收縮?

SQL Server 數據庫採取預先分配空間的方法來建立數據庫的數據文件或者日誌文件,比如數據文件的空間分配了300MB,而實際上只佔用了20MB空間,這樣就會造成磁盤存儲空間的浪費。可以通過數據庫收縮技術對數據庫中的每個文件進行收縮,刪除已經分配但沒有使用的頁。從而節省服務器的存儲的成本。

2、數據庫收縮的原理

官方解釋:收縮數據文件通過將數據頁從文件末尾移動到更靠近文件開頭的未佔用的空間來恢復空間。在文件末尾創建足夠的可用空間後,可以取消對文件末尾的數據頁的分配並將它們返回給文件系統。

3、數據庫收縮的限制和侷限

收縮後的數據庫不能小於數據庫最初創建時指定的大小。 或是上一次使用文件大小更改操作(如 DBCC SHRINKFILE)設置的顯式大小。

比如:如果數據庫最初創建時的大小爲 10 MB,後來增長到 100 MB,則該數據庫最小隻能收縮到 10 MB,即使已經刪除數據庫的所有數據也是如此。

不能在備份數據庫時收縮數據庫。 反之,也不能在數據庫執行收縮操作時備份數據庫。

4、數據庫收縮的方式

4.1 收縮數據庫 DBCC SHRINKDATABASE

介紹:收縮指定數據庫中的數據文件大小。

語法格式:


DBCC SHRINKDATABASE
( database_name [ , target_percent ]
[ , { NOTRUNCATE | TRUNCATEONLY } ]
)


參數說明:

  • database_name:是要收縮的數據庫名稱

  • target_percent:是數據庫收縮後的數據庫文件中所要的剩餘可用空間百分比。

  • NOTRUNCATE:導致在數據庫文件中保留所釋放的文件空間。如果未指定,將所釋放的文件空間釋放給操作系統。

  • TRUNCATEONLY:導致將數據文件中的任何未使用的空間釋放給操作系統,並將文件收縮到上一次所分配的大小,從而減少文件大小,而不移動任何數據。不試圖重新定位未分配頁的行。使用 TRUNCATEONLY 時,忽略 target_percentis。

4.2 收縮數據庫文件 DBCC SHRINKFILE

介紹:收縮當前數據庫的指定數據或日誌文件的大小,或通過將數據從指定的文件移動到相同文件組中的其他文件來清空文件,以允許從數據庫中刪除該文件。文件大小可以收縮到比創建該文件時所指定的大小更小。這樣會將最小文件大小重置爲新值。

語法格式:


DBCC SHRINKFILE 
(
{ file_name | file_id }
{ [ , EMPTYFILE ]
| [ [ , target_size ] [ , { NOTRUNCATE | TRUNCATEONLY } ] ]
}
)
[ WITH NO_INFOMSGS ]


參數說明:

  • file_name:要收縮的文件的邏輯名稱。

  • file_id:要收縮的文件的標識 (ID) 號。若要獲得文件 ID,請使用 FILE_IDEX 系統函數,或查詢當前數據庫中的 sys.database_files 目錄視圖

  • target_size:用兆字節表示的文件大小(用整數表示)。如果未指定,則 DBCC SHRINKFILE 將文件大小減少到默認文件大小。默認大小爲創建文件時指定的大小。

  • 注意:可以使用 DBCC SHRINKFILE target_size 減小空文件的默認大小。

例如,如果創建一個10MB 的文件,然後在文件仍然爲空的時候將文件收縮爲2 MB,默認文件大小將設置爲2 MB。這隻適用於永遠不會包含數據的空文件。

  • EMPTYFILE:將指定文件中的所有數據遷移到同一文件組中的其他文件。由於數據庫引擎不再允許將數據放在空文件內,因此可以使用 ALTER DATABASE 語句來刪除該文件。

  • NOTRUNCATE:在指定或不指定 target_percent 的情況下,將已分配的頁從數據文件的末尾移動到該文件前面未分配頁。文件末尾的可用空間不會返回給操作系統,文件的物理大小也不會更改。因此,指定 NOTRUNCATE 時,文件看起來未收縮。

  • NOTRUNCATE 只適用於數據文件。日誌文件不受影響。

  • TRUNCATEONLY:將文件末尾的所有可用空間釋放給操作系統,但不在文件內部執行任何頁移動。數據文件只收縮到最後分配的區。如果隨 TRUNCATEONLY 指定了 target_size,則會忽略該參數。TRUNCATEONLY 只適用於數據文件。

  • WITH NO_INFOMSGS:取消顯示所有信息性消息。

5、示例


-- 將TestDB數據庫中的TestDB文件的大小收縮到20MB。USE TestDB ;GODBCC SHRINKFILE (TestDB, 20) ;-- 將減小 UserDB 用戶數據庫中數據文件和日誌文件的大小,-- 以便在數據庫中留出 10% 的可用空間DBCC SHRINKDATABASE (TestDB, 30); -- 清理數據庫日誌文件爲2MUSE masterALTER DATABASE TestDB SET RECOVERY SIMPLE WITH NO_WAITALTER DATABASE TestDB SET RECOVERY SIMPLE --簡單模式USE TestDBDBCC SHRINKFILE (N'TestDB_log' , 2, TRUNCATEONLY) --設置壓縮後的日誌大小爲2M,可以自行指定USE masterALTER DATABASE TestDB SET RECOVERY FULL WITH NO_WAITALTER DATABASE TestDB SET RECOVERY FULL --還原爲完全模式


IT技術分享社區


個人博客網站:https://programmerblog.xyz


文章推薦 程序員效率:畫流程圖常用的工具 程序員效率:整理常用的在線筆記軟件 遠程辦公:常用的遠程協助軟件,你都知道嗎? 51單片機程序下載、ISP及串口基礎知識 硬件:斷路器、接觸器、繼電器基礎知識








本文分享自微信公衆號 - IT技術分享社區(gh_a27c0758eb03)。
如有侵權,請聯繫 [email protected] 刪除。
本文參與“OSC源創計劃”,歡迎正在閱讀的你也加入,一起分享。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章