文章目錄
-
-
- 客戶需求
- 需求分析
- 嘗試
- 解決方案
- 參考資料
-
客戶需求
這是一個生産環境,在夜深人靜的時候發現 tempdb 已經超過500GB。
需求分析
我們知道,如果重新開機 SQL Server,tempdb 會自動重新建立,進而使 tempdb 回歸到初始大小。但是這是生産環境,不允許重新開機 SQL Server。
嘗試
直接收縮 tempdb,始終不成功。
USE [tempdb]
GO
DBCC SHRINKFILE (N'tempdev' , 0, TRUNCATEONLY) --釋放所有可用空間
GO
DBCC SHRINKFILE (N'tempdev' , 500) -- 收縮到 500MB
GO
解決方案
SQL Server 2005 及後續版本為了增強 tempdb 的性能,會緩存一些 IAM 頁,以備将來重新使用這些頁面。在這種情況下,必須首先釋放 IAM 頁,才能釋放其對應的頁面。是以,通過 DBCC FREESYSTEMCACHE,從所有緩存中釋放所有未使用的緩存條目,然後再收縮 tempdb 。
USE [tempdb]
GO
DBCC FREESYSTEMCACHE ('ALL')
GO
DBCC SHRINKFILE (N'tempdev' , 500) -- 資料檔案收收縮到 500MB
GO
DBCC SHRINKFILE (N'templog' , 100) -- 日志檔案資料檔案收收縮到 500MB
GO
終于收縮到 500 MB。成功!
關于
DBCC FREESYSTEMCACHE
,請參考 https://technet.microsoft.com/zh-cn/library/ms178529.aspx
參考資料
收縮 tempdb 資料庫
How to shrink the tempdb database in SQL Server