【1】tempdb無法收縮
tempdb沒規划好,設計在C盤,快把C盤撐爆了!
【1.1】無法收縮信息
瘋狂運行下圖,都沒什么用。發現MDF 12G多,死活無法收縮。
【1.2】查看tempdb情況
(1)查看tempdb屬性
我們可以發現,tempdb整個庫大小12G多,且可用空間幾乎99%,按道理應該可以收縮的
查看文件選項,發現文件居然只顯示初始大小.....
(2)查看連接
sysprocesses
requests
發現均沒有相關進程使用tempdb,這這這,搞事情嘛。
【2】分析
【2.1】基本分析
tempdb詳細基本概念參考:https://www.cnblogs.com/gered/p/10670668.html
tempdb一般存儲這些:
但既然已經變成了可用空間,按道理這些相關緩存信息就過期沒有使用了啊。真叫人頭禿。
最后只能懷疑是緩存問題了。
【2.2】使用 dbcc freesystemcache('all') 應急解決
(1)使用 FREESYSTEMCACHE 的風險:
從所有緩存中釋放所有未使用的緩存條目。
SQL Server 數據庫引擎會事先在后台清理未使用的緩存條目,以使內存可用於當前條目。
但是,可以使用此命令從每個緩存中或者從指定的 Resource Governor 池緩存中手動刪除未使用的條目。
運行 DBCC FREESYSTEMCACHE 可清除 SQL Server 實例的計划緩存。 清除計划緩存將導致對所有即將到來的執行計划進行重新編譯,並可能導致查詢性能暫時性地突然降低。
對於計划緩存中的每個已清除緩存存儲,SQL Server 錯誤日志都包含以下信息性消息:“SQL Server 刷新了 %d 次(計划緩存中的)'%s' 緩存存儲,因為有 'DBCC FREEPROCCACHE' 或 'DBCC FREESYSTEMCACHE' 操作。
” 每隔五分鍾,只要緩存在這段時間間隔內得到刷新,此消息就記錄一次。
有一個疑問
比如有個執行計划緩存,使用頻率不是特別高,比如半分鍾運行一次。。
(2) dbcc freesystemcache('all') 應急解決tempdb無法收縮
使用如下代碼,收縮成功。
USE [tempdb] GO DBCC FREESYSTEMCACHE ('ALL') GO USE [TEMPDB] GO DBCC SHRINKFILE('TEMPDEV',1024) GO
【2.3】后續優化遷移走TEMPDB到其他盤符
(1)基本參考
use master go alter database tempdb modify file (name=tempdev,filename='d:\database\TempDB.mdf',size=1000MB,FILEGROWTH = 100MB) go alter database tempdb modify file(name=templog,filename='d:\database\TempLog.ldf',size=1000MB,FileGrowth=100MB) go
(2)最佳實踐
use tempdb go dbcc shrinkfile('tempdev',1000); dbcc shrinkfile('templog',1000); use db_tank; declare @path Nvarchar(500),@path_mdf Nvarchar(500),@path_ldf Nvarchar(500),@sql nvarchar(4000); select @path=physical_name from sys.database_files where type_desc='rows'; set @path=CAST(left(@path,len(@path)-charindex('\',reverse(@path))+1) AS NVARCHAR); set @path_mdf=@path+N'tempdb.mdf'; set @path_ldf=@path+N'templog.ldf'; print @path+','+@path_mdf+','+@path_ldf set @sql=' alter database tempdb modify file( name =''tempdev'',filename='''+@path_mdf+''',filegrowth=128MB); alter database tempdb modify file( name =''templog'',filename='''+@path_ldf+''',filegrowth=128MB); ' exec(@sql)
參考文檔
聯機叢書:DBCC FREESYSTEMCACHE (Transact-SQL)
感謝:sql server大佬群中的兩位大佬的指點:烈火寒冰JT 與 八風不動