適用於:SQL Server
Azure SQL 受控執行個體
本文討論可用來壓縮 tempdb SQL Server 中資料庫的各種方法。
你可以使用以下任一方法來改變 的 tempdb大小。 本文將介紹前三個選項。 如果您想要使用 SQL Server Management Studio (SSMS),請遵循壓縮資料庫中所述指示。
| 方法 | 需要重新啟動? | 其他相關資訊 |
|---|---|---|
ALTER DATABASE |
是的 | 提供預設 tempdb 檔案大小的完整控制 (tempdev 和 templog)。 |
DBCC SHRINKDATABASE |
不 | 在資料庫層級運作。 |
DBCC SHRINKFILE |
不 | 可讓您壓縮個別檔案。 |
| SQL Server 管理工作室 | 不 | 透過圖形化使用者介面壓縮資料庫檔案。 |
備註
根據預設,tempdb 資料庫會視需要設定為自動增長。 因此,這個資料庫可能會意外地成長到超出預期大小的規模。 較大的 tempdb 資料庫大小不會對 SQL Server 的效能造成負面影響。
當 SQL Server 啟動時,會使用資料庫副本tempdb重新建立model,並重置tempdb為最後設定的大小。 設定大小是你最後透過檔案大小變更操作(如ALTER DATABASEMODIFY FILE選項或 DBCC SHRINKFILE or DBCC SHRINKDATABASE 語句)設定的明確大小。 因此,除非你需要使用不同的值或想立即解析大型 tempdb 資料庫,否則你可以等到 SQL Server 服務的下一次重啟時,讓容量減少。
在 tempdb 活動進行時,您可以壓縮 tempdb。 不過,您可能會遇到其他錯誤,例如封鎖、鎖死等等,這可能會導致壓縮無法完成。 為了確保tempdb縮小成功,請在伺服器處於單一使用者模式或停止所有tempdb活動時執行此操作。
SQL Server 只會在 tempdb 交易記錄中記錄足夠的資訊,以便復原交易,但不會在資料庫復原期間重做交易。 這項功能會增加 INSERT 中 tempdb 陳述式的效能。 此外,不必記錄資訊來重做任何交易,因為每次重新啟動 SQL Server 時都會重新建立 tempdb。 因此,沒有任何需要前滾或回滾的交易。
如需管理與監視 tempdb 的詳細資訊,請參閱容量規劃和監視 tempdb 使用。
使用 ALTER DATABASE 命令
注意
此指令僅適用於預設 tempdb 的邏輯檔案 tempdev 和 templog。 如果你在 tempdb 中加入更多檔案,可以在將 SQL Server 以服務模式重新啟動後將它們縮小。 啟動期間會重新建立所有 tempdb 檔案。 不過,這些檔案是空的,而且可以移除。 要移除多餘的檔案 tempdb,請使用 ALTER DATABASE 帶有選項 REMOVE FILE 的指令。
此方法需要您重新啟動 SQL Server。
注意
您可以使用任何熟悉的 SQL Server 用戶端工具連線到 SQL Server 執行個體,例如 sqlcmd、 SQL Server Management Studio (SSMS) 或 Visual Studio Code 的 MSSQL 延伸模組。
停止 SQL Server。
在命令提示字元中,以最低組態模式啟動執行個體。 若要這樣做,請遵循下列步驟:
在命令提示字元中,變更為安裝 SQL Server 的資料夾 (取代下列範例中的
<VersionNumber>和<InstanceName>):cd C:\Program Files\Microsoft SQL Server\MSSQL<VersionNumber>.<InstanceName>\MSSQL\Binn如果執行個體是 SQL Server 的具名執行個體,請執行下列命令 (取代下列範例中的
<InstanceName>):sqlservr.exe -s <InstanceName> -c -f -mSQLCMD如果執行個體是 SQL Server 的預設執行個體,請執行下列命令:
sqlservr -c -f -mSQLCMD注意
-c和-f參數會讓 SQL Server 以最小組態模式啟動,tempdb的資料檔案大小為 1 MB,記錄檔的大小為 0.5 MB。-mSQLCMD參數可防止 sqlcmd 以外的任何其他應用程式接管單一使用者連線。
使用 sqlcmd 連線至 SQL Server,然後執行下列 Transact-SQL (T-SQL) 命令。 換
<target_size_in_MB>成你想要的尺寸:ALTER DATABASE tempdb MODIFY FILE (NAME = 'tempdev', SIZE = <target_size_in_MB>); ALTER DATABASE tempdb MODIFY FILE (NAME = 'templog', SIZE = <target_size_in_MB>);停止 SQL Server。 在命令提示字元視窗中按
Ctrl+C,重新啟動 SQL Server 為服務,然後檢查tempdb.mdf和templog.ldf檔案的大小。
使用 DBCC SHRINKDATABASE 命令
DBCC SHRINKDATABASE 取參數 target_percent 。 這個參數決定了縮小資料庫後,你想留給資料庫檔案的空間百分比。 如果你使用 DBCC SHRINKDATABASE,可能需要重新啟動 SQL Server。
使用
sp_spaceused儲存過程檢查目前的tempdb空間。 接著,計算可用來作為參數DBCC SHRINKDATABASE的空間百分比。 此計算是以所需的資料庫大小為基礎。注意
有時候,你可能需要執行
sp_spaceused @updateusage = true來重新計算已使用空間,並獲取更新的報告。 如需詳細資訊,請參閱 sp_spaceused。請考慮下列範例:
假設
tempdb有兩個檔案:1,024 MB 的主要資料檔案 (tempdb.mdf),以及 360 MB 的記錄檔 (tempdb.ldf)。 假設sp_spaceused報告主要資料檔案包含 600 MB 的資料。 此外,假設您想要將主要資料檔案壓縮為 800 MB。 計算壓縮之後剩餘可用空間的所需百分比:800 MB - 600 MB = 200 MB。 現在,將 200 MB 除以 800 MB = 25%,這個值就是你的target_percent。 交易記錄檔會據此壓縮,在壓縮資料庫之後,保留 25% 或 200 MB 的可用空間。執行以下 Transact-SQL 指令。 用所需百分比取代
<target_percent>:DBCC SHRINKDATABASE (tempdb, '<target_percent>');
DBCC SHRINKDATABASE該指令在 上tempdb使用時有限制。 你無法將資料和日誌檔案的目標大小設定為比建立資料庫時指定的大小還小。 你也無法使用如ALTER DATABASE操作和MODIFY FILE選項這樣的檔案大小變更操作,將它設定得比您先前明確設定的最後一個大小還小。 另一個限制是 DBCC SHRINKDATABASE 參數 target_percentage 的計算及其對當前使用空間的依賴性。
使用 DBCC SHRINKFILE 命令
使用 DBCC SHRINKFILE 指令來縮小單一 tempdb 檔案。
DBCC SHRINKFILE 提供比 DBCC SHRINKDATABASE 更大的彈性,因為您可在單一資料庫檔案上使用,而不會影響屬於相同資料庫的其他檔案。
DBCC SHRINKFILE 取參數 target_size 。 此參數設定資料庫檔案的最終期望大小。
判定主要資料檔案 (
tempdb.mdf)、記錄檔 (templog.ldf) 和新增至tempdb的其他檔案所需的大小。 確保檔案中使用的空間大小小於或等於期望的目標大小。使用 SSMS、Visual Studio Code 或 sqlcmd 連接 SQL Server。 接著對你想要縮減的特定資料庫檔案執行以下 Transact-SQL 指令。 用所需大小取代
<target_size_in_MB>:USE tempdb; GO -- This command shrinks the primary data file DBCC SHRINKFILE (tempdev, '<target_size_in_MB>'); GO -- This command shrinks the log file, examine the last paragraph. DBCC SHRINKFILE (templog, '<target_size_in_MB>'); GO
它的 DBCC SHRINKFILE 優點是可以將檔案大小縮小到比原本大小更小的大小。 你可以在任何資料或日誌檔案上執行 DBCC SHRINKFILE 。 您無法讓資料庫小於 model 資料庫的大小。
執行壓縮作業時發生錯誤 8909
如果 tempdb 正在使用,並嘗試用 DBCC SHRINKDATABASE or DBCC SHRINKFILE 指令縮小它,可能會收到類似以下輸出的訊息。 具體訊息取決於你使用的 SQL Server 版本:
Server: Msg 8909, Level 16, State 1, Line 1 Table error: Object ID 0, index ID -1, partition ID 0, alloc unit ID 0 (type Unknown), page ID (6:8040) contains an incorrect page ID in its page header. The PageId in the page header = (0:0).
此錯誤不會指出 tempdb 中的任何實際損毀。 然而,實體資料損毀錯誤可能有其他原因,例如錯誤 8909,且這些原因包括 I/O 子系統問題。 因此,如果錯誤發生在壓縮作業之外,您應該進一步調查。
雖然 8909 訊息會傳回給應用程式或執行壓縮作業的使用者,但壓縮作業不會失敗。