天天看點

收縮 tempdb 資料庫

文章目錄

      • 客戶需求
      • 需求分析
      • 嘗試
      • 解決方案
      • 參考資料

客戶需求

這是一個生産環境,在夜深人靜的時候發現 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

繼續閱讀