Чи є сценарій SQL, який я можу використовувати, щоб визначити хід процесу резервного копіювання або відновлення SQL Server?


94

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

Відредаговано: Моя потреба полягає в тому, щоб мати можливість контролювати процес резервного копіювання або відновлення повністю окремо від сеансу, де було розпочато резервне копіювання або відновлення.

Відповіді:


12

Так. Якщо ви встановили sp_who2k5 у свою основну базу даних, ви можете просто запустити:

sp_who2k5 1,1

Набір результатів включатиме всі активні транзакції. В даний час запущені резервні копії будуть містити рядок "BACKUP" у полі requestCommand . Влучне ім'я процентаComplete надасть вам хід резервного копіювання.

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


Остерігайтеся дивних цитат у коді для sp_who2k5 !! Довелося замінити "на", щоб це працювало
Dinglemeyer NeverGonnaGiveUUp

Я усвідомлюю, що це дуже стара нитка, але посилання на збережений процес мертве.
Джон Ваклавскі,

216

Я знайшов цей приклад сценарію тут , що , здається, працює дуже добре:

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

2
Надане джерело посилання більше не вказує на статтю. Це оновлений: sql-articles.com/scripts/estimated-time-for-backup-restore
Марієн

Незважаючи на те, що відновлення триває 15 хвилин, воно просто фіксує 0% прогресу. Це велика база даних (80 гігів). Будь-які інші пропозиції?
користувач64141

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

6
Це насправді добре спрацювало для мене SELECT команда, percent_complete, start_time FROM sys.dm_exec_requests where command = 'RESTORE DATABASE'
eythort

10

Ось простий сценарій, який зазвичай робить для мене фокус:

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

Використовуйте STATS в команді BACKUP, якщо це просто сценарій.

Всередині коду це трохи складніше. Наприклад, у ODBC ви встановлюєте SQL_ATTR_ASYNC_ENABLE, а потім шукаєте код повернення SQL_STILL_EXECUTING і виконуєте кілька повторних викликів SQLExecDirect, поки не отримаєте SQL_SUCCESS (або eqiv).


4

Спробуйте wih:

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 години та визначити прогрес.
Велдмуїс

Я думаю, ви можете переспрямувати вихід скриптів у файл журналу, а потім час від часу перевіряти його.
Павло Чучува

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 або кнопку Execute у SSMS!

Запит виконав хлопець, який пише цей пост


1

Додати 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

ВИБЕРІТЬ ідентифікатор сеансу як SPID, команда, час_початку, відсоток_завершення, датадодавання (секунда, передбачуване_завершення_часу / 1000, дата отримання ()) як оцінка_завершення_часу, а.текст ЯК ЗАПИТ З СИС. команда в ('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, дуже інформативний, в основному галузевий стандарт. він також повертає відсотки завершеності.


Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.