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

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

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

Ответ 1

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

sp_who2k5 1,1

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

Примечание: sp_who2k5 должен быть частью каждого инструментария, он намного больше, чем просто.

Ответ 2

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

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')

Ответ 3

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

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

Ответ 4

Вот простой script, который обычно делает трюк для меня:

SELECT command, percent_complete,total_elapsed_time, estimated_completion_time, start_time
  FROM sys.dm_exec_requests
  WHERE command IN ('RESTORE DATABASE','BACKUP DATABASE') 

Ответ 5

Используйте STATS в команде BACKUP, если это всего лишь script.

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

Ответ 6

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')

Ответ 7

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

Ответ 9

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

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

Ответ 10

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

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')

Ответ 11

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

SELECT percent_complete, *
FROM sys.dm_exec_requests
WHERE command In ( 'RESTORE DATABASE', 'BACKUP DATABASE' )

Ответ 12

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

Ответ 13

Добавьте 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.

Ответ 14

ВЫБЕРИТЕ session_id в качестве SPID, команду, start_time, процент_компонента, dateadd (секунда, оценочное_компонентное_время /1000, getdate()) в качестве оценочного_компонента_время, a.text AS-запрос FROM sys.dm_exec_requests r CROSS APPLY sys.dm_exec_sql_text r). команда в ('BACKUP DATABASE', 'BACKUP LOG', 'RESTORE DATABASE', 'RESTORE LOG')

Ответ 15

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

exec msdb.dbo.rds_task_status;

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

Ответ 16

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