Мониторинг бэкапа и восстановления MSSQL: расчет ETA через DMV
- Длительное выполнение операции
RESTORE DATABASEилиBACKUPбез визуального прогресса в SSMS. - Необходимость точной оценки времени окончания восстановления (Estimated Time of Arrival) при ликвидации аварии.
- Подозрение на зависание сессии ввода-вывода или блокировку процесса дисковой подсистемой.
1. Запрос мониторинга операций BACKUP / RESTORE в реальном времени
SELECT
r.session_id,
r.command,
CONVERT(NUMERIC(6,2), r.percent_complete) AS [% Complete],
CONVERT(VARCHAR(20), DATEADD(ms, r.estimated_completion_time, GETDATE()), 120) AS [Estimated Completion Time],
CONVERT(NUMERIC(10,2), r.total_elapsed_time / 1000.0 / 60.0) AS [Elapsed Min],
CONVERT(NUMERIC(10,2), r.estimated_completion_time / 1000.0 / 60.0) AS [Estimated Remaining Min],
r.wait_type,
r.wait_time,
r.last_wait_type,
t.text AS [SQL Text]
FROM sys.dm_exec_requests r
CROSS APPLY sys.dm_exec_sql_text(r.sql_handle) t
WHERE r.command IN ('BACKUP DATABASE', 'RESTORE DATABASE', 'BACKUP LOG', 'RESTORE LOG', 'RESTORE HEADERONLY');2. Анализ ожиданий (Wait Types) во время выполнения операции
Если процесс не двигается, проверьте текущий тип ожидания сессии:
PAGEIOLATCH_SH / PAGEIOLATCH_EX: упор в скорость чтения/записи накопителей.ASYNC_IO_COMPLETION: медленный отклик удаленного сетевого хранилища или ленты.BACKUPIO / BACKUPBUFFER: несбалансированность параметровBUFFERCOUNTиMAXTRANSFERSIZE.
3. Расчет текущей скорости передачи данных (МБ/сек)
SELECT
session_id,
command,
percent_complete,
(reads * 8.0 / 1024 / (total_elapsed_time / 1000.0)) AS [Read_MB_per_sec],
(writes * 8.0 / 1024 / (total_elapsed_time / 1000.0)) AS [Write_MB_per_sec]
FROM sys.dm_exec_requests
WHERE command LIKE '%BACKUP%' OR command LIKE '%RESTORE%'; Частые вопросы (FAQ)
Почему percent_complete иногда зависает на 100% при RESTORE?
После наката данных наступает фаза восстановления (Redo/Undo Phase) и инициализации файлов. Если в базе было много активных незафиксированных транзакций или включена инициализация нулями (без IFI), процесс может занять значительное время.
Отображает ли sys.dm_exec_requests прогресс восстановления отдельных журналов транзакций?
Да, если восстанавливается крупный файл журнала. При накате множества мелких файлов транзакций каждая команда RESTORE LOG регистрируется как отдельная быстрая операция.
Как параметр STATS = 5 влияет на вывод в Management Studio?
Параметр STATS = 5 заставляет SQL Server выводить сообщение о статусе каждые 5% завершения во вкладку Messages клиента, что удобно для консольных скриптов sqlcmd.
Можно ли безопасно прервать зависшую операцию RESTORE через KILL <SPID>?
Да, однако прерывание переведет базу данных в состояние RESTORING или SUSPECT, и весь процесс восстановления придется начинать с самого начала.