У меня есть база данных 21 Gb; 20 Gb из них - файлы (FileStream), и я удаляю все файлы из таблицы, но когда я делаю резервную копию резервного файла по-прежнему 21 ГБ.
Чтобы решить эту проблему, я стал идеей "освободить неиспользуемое пространство".
Итак, я пытаюсь уменьшить мою базу данных следующим образом:
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 Гб, я вижу, что неиспользуемое пространство было успешно очищено. Другими словами, приведенный выше код Sql работает исправно (база данных через XX минут устарела).
Проблема Мне нужно подождать, пока этот запрос (операция сокращения) завершится, поэтому я пытаюсь сделать следующее:
SELECT percent_complete, start_time, status, command, estimated_completion_time, cpu_time, total_elapsed_time
FROM sys.dm_exec_requests
Я не могу найти информацию о команде SHRINKFILE в результатах вышеуказанного запроса.
Я сделал что-то не так? почему я не вижу прогресса в сокращении работы БД?
И мой главный вопрос: как я могу дождаться завершения SHRINKFILE? Например, могу ли я отправить запрос с кодом С#, и в результате этого запроса я получу информацию о том, что операция SHRINKFILE финиширована или нет?