Sql-Server-2008

需要最佳實踐來維護現在增長到 100GB 的 TempDB,將 Tempdb 移動到 35GB 驅動器是否有任何限制?

  • August 20, 2021

將 TempDB 移動到較小的驅動器會導致故障嗎?如何將 TempDB 配置為使用 35GB 驅動器而不會出現任何問題?

請建議是否需要注意將 TempDB 平穩過渡到 35GB 驅動器?

這個小驅動器是專門為 TempDB 而設計的,但是當一些程序開始出現 TempDB 空間問題時,我們將它移到可以根據需要增長的驅動器,現在它是 130GB。那麼是否真的需要讓它盡可能地增長?需要知道如何在不遇到任何問題的情況下將其限制在相當大的範圍內,以及如何長期維護它?

它顯示 135GB 總空間,可用空間為 95%..所以認為定期縮小是可取的還是更好的方法是將其移動 35GB 驅動器?

如果將 tempdb 移動到空間不足的驅動器,則會遇到由此產生的錯誤和性能問題。但是,如果您的 tempdb 增長是一次性事件,那麼移回 35 GB 驅動器可能不會有任何問題。唯一確定的方法是跟踪您目前的 tempdb 使用情況並確定您是否需要額外的空間。

使用以下查詢在合適的數據庫中創建表來儲存 tempdb 空間資訊

CREATE TABLE TempDBSpace (
   [LogDate]   DATETIME
   , [FileType]    NVARCHAR(120)
   , [FileName]    NVARCHAR(255)
   , [FilegroupName]   NVARCHAR(255)
   , [Filepath]    NVARCHAR(500)
   , [FileSize_MB] DECIMAL(10,2)
   , [UsedSpace_MB]    DECIMAL(10,2)
   , [FreeSpace_MB]    DECIMAL(10,2)
   , [FreeSpace_%] DECIMAL(5,2)
)

然後使用以下查詢創建 SQL 代理作業以記錄 tempdb 空間消耗:

INSERT INTO [<db where you created the table above>].[dbo].[TempDBSpace]
SELECT GETDATE() AS [LogDate]
   , [FileType]        = f.[type_desc]
   , [FileName]        = f.[name]
   , [FilegroupName]   = fg.[name]
   , [Filepath]        = f.[physical_name]
   , [FileSize_MB] = CONVERT(DECIMAL(10,2),f.[size]/128.0)
   , [UsedSpace_MB]    = CONVERT(DECIMAL(10,2),f.[size]/128.0 - ((SIZE/128.0) - CAST(FILEPROPERTY(f.[name], 'SPACEUSED') AS INT)/128.0))
   , [FreeSpace_MB]    = CONVERT(DECIMAL(10,2),f.[size]/128.0 - CAST(FILEPROPERTY(f.[name], 'SPACEUSED') AS INT)/128.0)
   , [FreeSpace_%] = CONVERT(DECIMAL(10,2),((f.[size]/128.0 - CAST(FILEPROPERTY(f.[name], 'SPACEUSED') AS INT)/128.0)/(f.[size]/128.0))*100)
FROM sys.database_files f
LEFT JOIN sys.filegroups fg ON f.[data_space_id] = fg.[data_space_id]
ORDER BY f.[type], f.[name]
;

請注意,此作業必須將 tempdb 作為 T-SQL 作業步驟的數據庫,否則將不會返回數據。

安排它頻繁執行,比如每 5 分鐘一次,並在合適的時間段內啟用該作業,至少 1 個月,但理想情況下,3-6 個月,以收集足夠的數據以做出明智的決定。

合適的時間過去後,使用以下查詢檢查 tempdb 的數據和日誌文件的最大總消耗量:

SELECT [FileType]
   , MAX(UsedSpaceTotal_MB) AS [MaxSpaceUsed]
FROM
(
   SELECT [LogDate]
       , [FileType]
       , SUM([UsedSpace_MB]) AS UsedSpaceTotal_MB
   FROM ##Temp
   GROUP BY [LogDate]
       , [FileType]
) s
GROUP BY [FileType]

如果最大消耗空間不超過預期驅動器上的可用空間,那麼您應該可以繼續移動。如果最大消耗量更大,則在將 tempdb 移動到預期驅動器時可能會遇到錯誤和性能問題。

如果 tempdb 的增長是偶然發生的諸如重大數據庫更改之類的事件的結果,那麼您最好在 tempdb 中使用溢出文件,而不是移動整個文件。

例如,您可以將 tempdb 配置為正常使用 35GB 驅動器,增大文件以填充此驅動器並根據最佳實踐設置它們的最大大小。然後,當您計劃其中一個需要額外 tempdb 空間的事件時,只需將一個額外的文件添加到不同驅動器上的 tempdb 即可。

程序完成後,您可以將數據從溢出文件中清除並從 tempdb 中刪除,並且 35GB 驅動器上的現有配置保持不變。

引用自:https://dba.stackexchange.com/questions/298201