私はデータベースを持っています。21 Gb;それらの20 Gbはファイル(FileStream)であり、テーブルからすべてのファイルを削除していますが、バックアップを作成するとバックアップファイルはまだ21 GBです。DBCC SHRINKFILEの進捗状況
この問題を解決するために、私は「未使用スペースを解放する」という理想になりました。
だから私は、次のように私のデータベースを縮小にしようとしている:私は、
USE Db;
GO
-- Truncate the log by changing the database recovery model to SIMPLE.
ALTER DATABASE Db
SET RECOVERY SIMPLE;
GO
-- Shrink the truncated log file to 1 MB.
DBCC SHRINKFILE (Db, 100);
GO
-- Reset the database recovery model.
ALTER DATABASE Db
SET RECOVERY FULL;
GO
SELECT file_id, name
FROM sys.database_files;
GO
DBCC SHRINKFILE (1, TRUNCATEONLY);
私はXX分後にデータベースのバックアップを作成する場合は、バックアップファイルのサイズがこのように1 GBです未使用スペースが正常にクリーニングされたことがわかります。つまり、上記のSqlコードが正しく動作しています(データベースのXX分後には、schrunk)。
SELECT percent_complete, start_time, status, command, estimated_completion_time, cpu_time, total_elapsed_time
FROM sys.dm_exec_requests
は私がSHRINKFILEに関する情報を見つけることができません。
私はこのクエリ(縮小操作)するまで待つ必要がある問題は、私は、次のやろうとしているので、終了します上記のクエリの結果のコマンド。
私が何か間違ったことをしましたか?なぜ私はDBの縮小操作の進捗状況を見ることができないのですか?
そして、私のメインのquesitonは次のとおりです。SHRINKFILEが完了するまで、どのように私は待つことができますか? たとえば、C#コードクエリから送信できますが、このクエリの結果では、SHRINKFILE操作が完了したかどうかの情報を取得しますか?
これは両方ともデータベースを断片化し、ログチェーンを破ることを認識していますか?これは、1)データベースの縮小を決して自動化しないでください。2)次回の完全バックアップが完了するまでデータベースの復旧機能が危険にさらされているため、自動化する必要はありません。例外的に手動でこれを行うだけで、完了するまで個人的に監視する必要があります。それ以外の場合、問題のホストを招待しています。そのうちのいくつかは悲惨です。 – RBarryYoung
私はすべてに同意します。そのため、データベースを変更している間にすべてのデータをブロックする必要があるのはなぜですか?たとえば、削除エントリのバックアップを追加するなどです。問題は、私たちの顧客の要求です。 –
私にとっては、このプロセスが完了し、進捗バーではないことを知るだけで十分です。ShrinkFile操作がSQL文で終了したとき(プロセスSPIDがもう利用できなくなったためにC#からプールすることもできます) –