SQL Serverを再起動せずにtempdb.mdfサイズを縮小/縮小する方法はありますか


15

DBCC SHRINKFILEオンの後にSQL Serverを再起動する必要tempdb.mdfがありますか、またはSQL Serverを再起動tempdb.mdfせずにサイズを縮小する他の方法がありますか?

実稼働サーバーにこれが必要なため、親切に助けてください。ダウンタイムなしで縮小を望んでいます。


2
DBCC SHRINKFILEはサービスの再起動を必要としません。
グレッグ

tempdbは使用中なので縮小できません。そして、はい、これにはいくつかの解決策がありますが、あまりきれいではなく、いくつかの副作用があります。
イオン

回答:


15

これは次の方法で実行できます。

-- write everything from your buffers to the disc!
CHECKPOINT; 
GO
-- Clean all buffers and caches
DBCC DROPCLEANBUFFERS; 
DBCC FREEPROCCACHE;
DBCC FREESYSTEMCACHE('ALL');
DBCC FREESESSIONCACHE;
GO
-- Now shrink the file to your desired size
DBCC SHRINKFILE (TEMPDEV, 40960);
-- Make sure that there is no running transaction which uses the tempdb while shrinking!
-- This is most trickiest part of it all.
GO

最後のステップは最もトリッキーです。縮小プロセス中は、他のアクションでtempdbを使用しないでくださいSHRINKFILE。これにより、操作が中止される可能性があります。tempdbは非常に簡単に縮小できるため、縮小するのに時間がかかることはありません。

これは「ソフト再起動」のようなものであることに注意してください。すべてがバッファから削除され、ディスクに書き込まれます。これは、すべての書き込み操作を処理する必要があるため、I / Oサブシステム(書き込み)への影響を意味します。その後、ファイルを圧縮して(読み取りおよび書き込みパフォーマンスに影響を与えます)、最後に、テーブルを照会するすべてのプロセスがI / Oサブシステムからバッファーにデータを取得する必要があります。これは、再起動以上の損害を与える可能性があります。

開発システムを実行している場合は、この方法の代わりにマシンを再起動する必要があります。ただし、フェールオーバーパートナーのない一部の運用システムでは、これが役立つ場合があります。


良い説明をしてくれたIonicに感謝します。私の場合、tempdb.mdfは46 GBです。トランザクションが進行していない場合、100%に縮小できます。お勧めします。
マニ

はい、40960MBは単なる例です。私のシステムでは、tempdbは通常50GBで実行され、まれに200GBになります。:-)
イオン

<pre> DBCC SHRINKFILE(tempdev、1024)としてクエリを実行します。</ b> </ b>スペースを正常に解放しましたが、次のように実行します</ b> </ b> DBCC SHRINKFILE(tempdev、30000); </ b> </ b>そして、次のような結果が得られました。</ b> </ b> DbIdフィールド現在のサイズ最小サイズ使用済みページ推定ページ</ b> 2 1 5699352 1024 696 696 </ b> </ b>しかし、チェックされたtempdbサイズは縮小されませんでした。</ pre>
マニ

このメッセージは、トランザクションが縮小中にtempdbを使用する場合に発生する可能性があります。また、定義された縮小サイズ(〜30GB)がtempdbの空き制限を超えている可能性があります。
イオン

1

あなただけの以下の手順で行くことができます

USE tempdb;
GO;
dbcc freeproccache;
DBCC SHRINKFILE (tempdb_file_name, memory_in_MB);
GO;

あなたの答えは上記のものとどう違うのですか?
キンシャー

1
こんにちはKin、TempdbファイルサイズはDBCC FREEPROCCACHEで縮小されます。次に、tempdbファイルを圧縮します。シュリンクtempdbについては、以下のステートメントは必要ありません。DBCC DROPCLEANBUFFERS; DBCC FREESYSTEMCACHE( 'ALL'); DBCC FREESESSIONCACHE;
ジェリー

1
これはより簡単な答えです。ほとんどの場合、tempdbを縮小するにはDBCC FREEPROCCACHEのみが必要です。 関連する質問を参照してください
ジェームズジェンキンス
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.