SQL-Server: есть ли сценарий SQL, который я могу использовать для определения хода процесса резервного копирования или восстановления SQL Server?

95

Когда я создаю резервную копию или восстанавливаю базу данных с помощью MS SQL Server Management Studio, я получаю визуальное представление о том, насколько далеко продвинулся процесс, и, следовательно, сколько еще мне еще нужно ждать его завершения. Если я начну резервное копирование или восстановление с помощью сценария, есть ли способ отслеживать прогресс, или я просто сижу и жду его завершения (надеясь, что все пошло не так?)

Отредактировано: Моя потребность состоит в том, чтобы иметь возможность отслеживать ход резервного копирования или восстановления полностью отдельно от сеанса, в котором было инициировано резервное копирование или восстановление.

Veldmuis
источник

Ответы:

12

Да. Если вы установили sp_who2k5 в свою основную базу данных, вы можете просто запустить:

sp_who2k5 1,1

Набор результатов будет включать все активные транзакции. Текущее резервное копирование (и) будет содержать строку «BACKUP» в поле requestCommand . Поле с удачным названием percentComplete покажет вам ход резервного копирования.

Примечание. Sp_who2k5 должен быть частью набора инструментов каждого, он делает гораздо больше, чем просто это.

Портман
источник
Остерегайтесь странных кавычек в коде для sp_who2k5 !! Пришлось заменить «на», чтобы это
заработало
Я понимаю, что это очень старый поток, но ссылка для получения сохраненного процесса мертва.
Джон Вацлавски
217

Я нашел этот пример сценария здесь , что , кажется, работает очень хорошо:

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')
Veldmuis
источник
2
Предоставленная ссылка на источник больше не указывает на статью. Это обновленный: sql-articles.com/scripts/estimated-time-for-backup-restore
Мариен
Несмотря на то, что восстановление длилось 15 минут, оно просто записывает 0% прогресса. База данных большая (80 гигов). Есть другие предложения?
user64141
5
@ user63141; восстановление начинается с размещения файла. Если вы ничего не сделали, то мгновенная инициализация файла не разрешена (см. Msdn.microsoft.com/en-us/library/ms175935.aspx ). Это может занять некоторое время, если у вас старые диски или большая база данных
Хенрик Стаун Поулсен,
2
Когда я выполнил этот запрос, в выходных данных нет строк
goutam
1
Я думаю, что если вы добавите «RESTORE HEADERON» в список в предложении WHERE, вы также получите прогресс в выполнении любых заданий проверки резервных копий, запущенных впоследствии.
goorj
16

Если вы знаете идентификатор сеанса, вы можете использовать следующее:

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
Аллен
источник
7
Это действительно хорошо сработало для меня команда SELECT, percent_complete, start_time FROM sys.dm_exec_requests, где command = 'RESTORE DATABASE'
eythort
11

Вот простой сценарий, который обычно помогает мне:

SELECT command, percent_complete,total_elapsed_time, estimated_completion_time, start_time
  FROM sys.dm_exec_requests
  WHERE command IN ('RESTORE DATABASE','BACKUP DATABASE') 
Уилфред Кимани
источник
6

Скрипт для проверки выполнения резервного копирования и восстановления в 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')

источник
5
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')
Шахбаз И Шейх
источник
4

Используйте СТАТУС в команде РЕЗЕРВНОЕ КОПИРОВАНИЕ, если это просто сценарий.

Внутри кода все немного сложнее. Например, в ODBC вы устанавливаете SQL_ATTR_ASYNC_ENABLE, а затем ищите код возврата SQL_STILL_EXECUTING и выполняете несколько повторных вызовов SQLExecDirect, пока не получите SQL_SUCCESS (или eqiv).

Дэвид Л. Моррис
источник
4

Попробуйте с:

SELECT * FROM sys.dm_exec_requests where command like '%BACKUP%'

SELECT command, percent_complete, start_time FROM sys.dm_exec_requests where command like '%BACKUP%'

SELECT command, percent_complete,total_elapsed_time, estimated_completion_time, start_time
  FROM sys.dm_exec_requests
  WHERE command IN ('RESTORE DATABASE','BACKUP DATABASE')
Заалуни Мохамед
источник
3

Используйте параметр STATS: http://msdn.microsoft.com/en-us/library/ms186865.aspx

Павел Чучува
источник
Если я чего-то не упускаю, это ограничивает меня возможностью получать обратную связь в том же сеансе, в котором я запускаю резервное копирование. В нашем случае мы начинаем восстановление БД с помощью запланированного файла BAT в 4 часа утра, и я хочу подключиться к серверу через 3 или 4 часа и определить прогресс.
Veldmuis
Я думаю, вы можете перенаправить вывод скрипта в файл журнала, а затем время от времени проверять его.
Павел Чучува
3

Я думаю, что лучший способ узнать, как идет ваше восстановление или резервное копирование, - это следующий запрос:

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 или кнопку «Выполнить» в SSMS!

Запрос выполнил парень, который пишет этот пост

BMDaemon
источник
2

Добавить STATS=10или STATS=1в резервной команде.

BACKUP DATABASE [xxxxxx] TO  DISK = N'E:\\Bachup_DB.bak' WITH NOFORMAT, NOINIT,  
NAME = N'xxxx-Complète Base de données Sauvegarde', SKIP, NOREWIND, NOUNLOAD, COMPRESSION,  STATS = 10
GO.
Заалуни Мохамед
источник
1

ВЫБЕРИТЕ session_id в качестве SPID, command, start_time, percent_complete, dateadd (second, Estimated_completion_time / 1000, getdate ()) как Estimated_completion_time, a.text AS Query FROM sys.dm_exec_requests r CROSS APPLY sys.dm_exec_sql_text (r.sql_text (r.sql) a. команда в ('BACKUP DATABASE', 'BACKUP LOG', 'RESTORE DATABASE', 'RESTORE LOG')

Бен
источник
1

Для всех, кто использует SQL Server на RDS (AWS), есть встроенная процедура, вызываемая в msdbбазе данных, которая предоставляет исчерпывающую информацию для всех задач резервного копирования и восстановления:

exec msdb.dbo.rds_task_status;

Это даст полное изложение каждой задачи, ее конфигурацию, подробную информацию о выполнении (например, процент выполнения и общая продолжительность), а также task_infoстолбец, который очень полезен при попытке выяснить, что не так с резервным копированием или восстановлением.

взрыв
источник
0

Для отслеживания хода выполнения резервного копирования или восстановления полностью отдельно от сеанса, в котором было инициировано резервное копирование или восстановление. Никаких сторонних инструментов не требуется. Протестировано на Microsoft SQL Server 2012.

SELECT percent_complete, *
FROM sys.dm_exec_requests
WHERE command In ( 'RESTORE DATABASE', 'BACKUP DATABASE' )
Лиам Флеминг
источник
0

Я использую sp_whoisactive, очень информативный, в основном промышленный стандарт. он также возвращает процент завершения.

RC Bird
источник
0

У меня была аналогичная проблема при работе над операцией восстановления базы данных на MS SQL Server 2012.

Однако для моего собственного сценария мне просто нужно было видеть ход операции ВОССТАНОВЛЕНИЕ БАЗЫ ДАННЫХ в окне сценария.

Все, что мне нужно было сделать, это добавить в скрипт опцию STATS:

USE master;
GO

ALTER DATABASE mydb SET SINGLE_USER WITH ROLLBACK IMMEDIATE;
GO
    
RESTORE DATABASE mydb
    FROM DISK = 'C:\Program Files\Microsoft SQL Server\MSSQL12.MSSQLSERVER\MSSQL\Backup\my_db_21-08-2020.bak'
    WITH REPLACE,
         STATS = 10,
         RESTART,
    MOVE 'my_db' TO 'C:\Program Files\Microsoft SQL Server\MSSQL12.MSSQLSERVER\MSSQL\DATA\my_db.mdf',
    MOVE 'my_db_log' TO 'C:\Program Files\Microsoft SQL Server\MSSQL12.MSSQLSERVER\MSSQL\DATA\mydb_log.ldf'
GO
    
ALTER DATABASE mydb SET MULTI_USER;
GO

Затем я переключился на вкладку « Сообщения » окна «Сценарий», чтобы увидеть, как выполняется операция ВОССТАНОВЛЕНИЕ БАЗЫ ДАННЫХ :

введите описание изображения здесь

Если вы хотите получить дополнительную информацию после операции ВОССТАНОВЛЕНИЕ БАЗЫ ДАННЫХ, вы можете использовать эту команду, предложенную eythort :

SELECT command, percent_complete, start_time FROM sys.dm_exec_requests where command = 'RESTORE DATABASE'

Вот и все.

надеюсь, это поможет

Обещание Престон
источник
-1

просто запустите bkp_status на master db, вы получите статус резервной копии

Ахсан Мумтаз Аббаси
источник