Есть ли сценарий SQL, который я могу использовать для определения хода процесса резервного копирования или восстановления SQL Server?
при резервном копировании или восстановлении базы данных с помощью MS SQL Server Management Studio я получаю визуальное представление о том, как далеко продвинулся процесс, и, следовательно, сколько времени мне еще нужно ждать его завершения. Если я начну резервное копирование или восстановление со скриптом, есть ли способ отслеживать прогресс, или я просто сижу и жду его завершения (надеясь, что ничего не пошло не так?)
редактировать: моя потребность в частности, чтобы иметь возможность контролировать резервное копирование или процесс восстановления полностью отделен от сеанса, в котором было инициировано резервное копирование или восстановление.
12 ответов:
да. Если вы установили sp_who2k5 в вашей базе данных master, вы можете просто запустить:
sp_who2k5 1,1
результирующий набор будет включать все активные транзакции. Текущая резервная копия(ы) будет содержать строку "BACKUP" в requestCommand
Я нашел этот пример скрипта здесь это, кажется, работает довольно хорошо:
SELECT r.session_id,r.command,CONVERT(NUMERIC(6,2),r.percent_complete) AS [Percent Complete],CONVERT(VARCHAR(20),DATEADD(ms,r.estimated_completion_time,GetDate()),20) AS [ETA 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 [ETA Min], CONVERT(NUMERIC(10,2),r.estimated_completion_time/1000.0/60.0/60.0) AS [ETA Hours], CONVERT(VARCHAR(1000),(SELECT SUBSTRING(text,r.statement_start_offset/2, CASE WHEN r.statement_end_offset = -1 THEN 1000 ELSE (r.statement_end_offset-r.statement_start_offset)/2 END) FROM sys.dm_exec_sql_text(sql_handle))) AS [SQL] FROM sys.dm_exec_requests r WHERE command IN ('RESTORE DATABASE','BACKUP DATABASE')
Если вы знаете sessionID, то вы можете использовать следующее:
SELECT * FROM sys.dm_exec_requests WHERE session_id = 62
или если вы хотите сузить ее:
SELECT command, percent_complete, start_time FROM sys.dm_exec_requests WHERE session_id = 62
вот простой скрипт, который обычно делает трюк для меня:
SELECT command, percent_complete,total_elapsed_time, estimated_completion_time, start_time FROM sys.dm_exec_requests WHERE command IN ('RESTORE DATABASE','BACKUP DATABASE')
используйте статистику в команде резервного копирования, если это просто скрипт.
внутри кода это немного сложнее. Например, в ODBC вы устанавливаете SQL_ATTR_ASYNC_ENABLE, а затем ищете код возврата SQL_STILL_EXECUTING и выполняете несколько повторных вызовов SQLExecDirect, пока не получите SQL_SUCCESS (или eqiv).
SELECT session_id as SPID, command, a.text AS Query, start_time, percent_complete, dateadd(second,estimated_completion_time/1000, getdate()) as estimated_completion_time FROM sys.dm_exec_requests r CROSS APPLY sys.dm_exec_sql_text(r.sql_handle) a WHERE r.command in ('BACKUP DATABASE','RESTORE DATABASE')
используйте параметр статистики:http://msdn.microsoft.com/en-us/library/ms186865.aspx
Я думаю, что лучший способ узнать, как ваш прогресс восстановления или резервного копирования является следующим запросом:
USE[master] GO SELECT session_id AS SPID, command, a.text AS Query, start_time, percent_complete, dateadd(second,estimated_completion_time/1000, getdate()) as estimated_completion_time FROM sys.dm_exec_requests r CROSS APPLY sys.dm_exec_sql_text(r.sql_handle) a WHERE r.command in ('BACKUP DATABASE','RESTORE DATABASE') GO
запрос выше, идентифицирует сеанс сам по себе и выполняет процент прогресса каждый раз, когда вы нажимаете кнопку F5 или Execute на SSMS!
запрос был выполнен парнем, который написал это post
скрипт для проверки хода резервного копирования и восстановления в SQL Server:
много раз случается, что ваша деятельность по резервному копированию (или восстановлению) была запущена другим администратором базы данных или заданием, и вы не можете использовать графический интерфейс для проверки хода этого резервного копирования / восстановления.
путем объединения нескольких команд, я создал ниже сценарий, который может дать нам резюме текущих резервных копий и восстановления которые происходят на сервере.
select r.session_id, r.blocking_session_id, db_name(database_id) as [DatabaseName], r.command, [SQL_QUERY_TEXT] = Substring(Query.TEXT, (r.statement_start_offset / 2) + 1, ( ( CASE r.statement_end_offset WHEN - 1 THEN Datalength(Query.TEXT) ELSE r.statement_end_offset END - r.statement_start_offset ) / 2 ) + 1), [SP_Name] =Coalesce(Quotename(Db_name(Query.dbid)) + N'.' + Quotename(Object_schema_name(Query.objectid, Query.dbid)) + N'.' + Quotename(Object_name(Query.objectid, Query.dbid)), ''), r.percent_complete, start_time, CONVERT(VARCHAR(20), DATEADD(ms, [estimated_completion_time], GETDATE()), 20) AS [ETA_COMPLETION_TIME], CONVERT(NUMERIC(6, 2), r.[total_elapsed_time] / 1000.0 / 60.0) AS [Elapsed_MIN], CONVERT(NUMERIC(6, 2), r.[estimated_completion_time] / 1000.0 / 60.0) AS [Remaning_ETA_MIN], CONVERT(NUMERIC(6, 2), r.[estimated_completion_time] / 1000.0 / 60.0/ 60.0) AS [ETA_Hours], wait_type, wait_time/1000 as Wait_Time_Sec, wait_resource from sys.dm_exec_requests r cross apply sys.fn_get_sql(r.sql_handle) as Query where r.session_id>50 and command IN ('RESTORE DATABASE','BACKUP DATABASE', 'RESTORE LOG', 'BACKUP LOG')
чтобы отслеживать ход резервного копирования или восстановления полностью отдельно от сеанса, в котором было инициировано резервное копирование или восстановление. Никаких сторонних инструментов не требуется. Протестировано на Microsoft SQL Server 2012.
SELECT percent_complete, * FROM sys.dm_exec_requests WHERE command In ( 'RESTORE DATABASE', 'BACKUP DATABASE' )