tempdb無法收縮。使用 DBCC FREESYSTEMCACHE 解決


【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' 操作。

    ” 每隔五分鍾,只要緩存在這段時間間隔內得到刷新,此消息就記錄一次。

  有一個疑問

     比如有個執行計划緩存,使用頻率不是特別高,比如半分鍾運行一次。。

    執行 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 與  八風不動


免責聲明!

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



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