SQL-Server: czy istnieje skrypt SQL, którego mogę użyć do określenia postępu procesu tworzenia kopii zapasowej lub przywracania programu SQL Server?

97

Kiedy wykonuję kopię zapasową lub przywracam bazę danych za pomocą MS SQL Server Management Studio, otrzymuję wizualne wskazanie, jak daleko zaszedł proces, a tym samym ile jeszcze muszę czekać na jego zakończenie. Jeśli rozpocznę tworzenie kopii zapasowej lub przywracanie za pomocą skryptu, czy jest sposób na monitorowanie postępu, czy po prostu siedzę i czekam, aż się zakończy (mając nadzieję, że nic nie poszło nie tak?)

Po edycji: Moją potrzebą jest w szczególności możliwość monitorowania postępu tworzenia kopii zapasowych lub przywracania całkowicie niezależnie od sesji, w której rozpoczęto tworzenie kopii zapasowej lub przywracanie.

Veldmuis
źródło

Odpowiedzi:

12

Tak. Jeśli zainstalowałeś sp_who2k5 w swojej głównej bazie danych, możesz po prostu uruchomić:

sp_who2k5 1,1

Zestaw wyników będzie zawierał wszystkie aktywne transakcje. Aktualnie uruchomione kopie zapasowe będą zawierać ciąg „BACKUP” w polu requestCommand . Pole percentComplete o trafnej nazwie pokaże postęp tworzenia kopii zapasowej.

Uwaga: sp_who2k5 powinien być częścią zestawu narzędzi dla każdego, robi o wiele więcej niż tylko to.

Portman
źródło
Uważaj na dziwne cudzysłowy w kodzie sp_who2k5 !! Aby to działało,
trzeba
Zdaję sobie sprawę, że to bardzo stary wątek, ale link do pobrania przechowywanego procesu jest martwy.
John Wacławski
220

Znalazłem tutaj przykładowy skrypt , który wydaje się działać całkiem nieźle:

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
źródło
2
Podany link źródłowy nie wskazuje już na artykuł. To jest zaktualizowany: sql-articles.com/scripts/estimated-time-for-backup-restore
Marien
Mimo że przywracanie trwało 15 minut, po prostu rejestruje 0% postęp. To duża baza danych (80 koncertów). Jakieś inne sugestie?
user64141
5
@ user63141; przywracanie rozpoczyna się od alokacji plików. Jeśli nic nie zrobiłeś, natychmiastowa inicjalizacja pliku jest niedozwolona (patrz msdn.microsoft.com/en-us/library/ms175935.aspx ). Może to zająć trochę czasu, jeśli masz stare dyski lub dużą bazę danych
Henrik Staun Poulsen
2
Nie ma żadnych wierszy w danych wyjściowych, gdy wykonałem to zapytanie
goutam
1
Myślę, że jeśli dodasz `` RESTORE HEADERON '' do listy w klauzuli WHERE, uzyskasz postęp we wszystkich zadaniach weryfikacji kopii zapasowych uruchamianych później.
goorj
17

Jeśli znasz identyfikator sesji, możesz użyć następującego:

SELECT * FROM sys.dm_exec_requests WHERE session_id = 62

Lub jeśli chcesz to zawęzić:

SELECT command, percent_complete, start_time FROM sys.dm_exec_requests WHERE session_id = 62
Allen
źródło
7
To faktycznie działało dobrze dla mnie polecenie SELECT, percent_complete, start_time FROM sys.dm_exec_requests gdzie polecenie = 'RESTORE DATABASE'
eythort
13

Oto prosty skrypt, który generalnie załatwia sprawę:

SELECT command, percent_complete,total_elapsed_time, estimated_completion_time, start_time
  FROM sys.dm_exec_requests
  WHERE command IN ('RESTORE DATABASE','BACKUP DATABASE') 
Wilfred Kimani
źródło
6

Skrypt do sprawdzania postępu tworzenia kopii zapasowych i przywracania w programie SQL Server :

Wiele razy zdarza się, że tworzenie kopii zapasowej (lub przywracanie) zostało rozpoczęte przez innego administratora bazy danych lub przez zadanie i nie można używać graficznego interfejsu użytkownika do niczego innego, aby sprawdzić postęp tej kopii zapasowej / przywracania.

Łącząc wiele poleceń, wygenerowałem poniższy skrypt, który może dać nam podsumowanie aktualnych kopii zapasowych i przywracania, które mają miejsce na serwerze.

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

źródło
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')
Shahbaz I Shaikh
źródło
4

Użyj STATYSTYKI w poleceniu BACKUP, jeśli jest to tylko skrypt.

Wewnątrz kodu jest to trochę bardziej skomplikowane. Na przykład w ODBC ustawiasz SQL_ATTR_ASYNC_ENABLE, a następnie szukasz kodu powrotu SQL_STILL_EXECUTING i wykonujesz kilka powtarzających się wywołań SQLExecDirect, aż uzyskasz SQL_SUCCESS (lub eqiv).

David L Morris
źródło
4

Spróbuj 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')
Zaalouni Mohamed
źródło
3

Użyj opcji STATS: http://msdn.microsoft.com/en-us/library/ms186865.aspx

Pavel Chuchuva
źródło
O ile czegoś nie brakuje, ogranicza mnie to do uzyskania informacji zwrotnej w tej samej sesji, w której rozpoczynam tworzenie kopii zapasowej. W naszym przypadku rozpoczynamy przywracanie bazy danych z zaplanowanym plikiem BAT o 4 rano i chcę połączyć się z serwerem 3 lub 4 godziny później i określić postęp.
Veldmuis,
Myślę, że można przekierować dane wyjściowe skryptu do pliku dziennika, a następnie od czasu do czasu go sprawdzać.
Pavel Chuchuva
3

Myślę, że najlepszym sposobem sprawdzenia postępu przywracania lub tworzenia kopii zapasowych jest następujące zapytanie:

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

Powyższe zapytanie pozwala zidentyfikować sesję samodzielnie i wykonać procentowy postęp za każdym razem, gdy naciśniesz F5 lub przycisk Wykonaj w SSMS!

Zapytanie zostało wykonane przez faceta, który napisał ten post

BMDaemon
źródło
2

Dodaj STATS=10lub STATS=1w poleceniu kopii zapasowej.

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.
Zaalouni Mohamed
źródło
2

SELECT session_id as SPID, command, start_time, percent_complete, dateadd (sekunda, szacowany_czas_kończenia / 1000, getdate ()) jako szacowany_kompletion_time, a.text AS zapytanie z sys.dm_exec_requests r CROSS APPLY sys.dm_exec_sql_text (r.sql_handE). polecenie w („BACKUP DATABASE”, „BACKUP LOG”, „RESTORE DATABASE”, „RESTORE LOG”)

Ben
źródło
1

Dla każdego, kto używa SQL Server w RDS (AWS), istnieje wbudowana procedura wywoływana w msdbbazie danych, która zapewnia kompleksowe informacje na temat wszystkich zadań tworzenia kopii zapasowych i przywracania:

exec msdb.dbo.rds_task_status;

Zapewni to pełne podsumowanie każdego zadania, jego konfigurację, szczegóły wykonania (takie jak procent wykonania i całkowity czas trwania) oraz task_infokolumnę, która jest niezwykle pomocna podczas próby ustalenia, co jest nie tak z kopią zapasową lub przywracaniem.

bsplosion
źródło
1

Podobny problem miałem podczas pracy nad operacją przywracania bazy danych na MS SQL Server 2012.

Jednak w moim własnym scenariuszu wystarczyło zobaczyć postęp PRZYWRACANIA BAZY DANYCH operacji w oknie skryptu

Wystarczyło dodać do skryptu opcję STATYSTYKA:

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

Następnie przełączyłem się na zakładkę Wiadomości w oknie Skrypt, aby zobaczyć postęp operacji PRZYWRACANIA BAZY DANYCH :

wprowadź opis obrazu tutaj

Jeśli chcesz uzyskać więcej informacji po operacji PRZYWRÓCENIE BAZY DANYCH, możesz użyć polecenia sugerowanego przez eythort :

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

To wszystko.

mam nadzieję, że to pomoże

Obietnica Preston
źródło
0

Monitorowanie postępu tworzenia kopii zapasowych lub przywracania całkowicie niezależnie od sesji, w której rozpoczęto tworzenie kopii zapasowej lub przywracanie. Nie są wymagane żadne narzędzia innych firm. Przetestowano na Microsoft SQL Server 2012.

SELECT percent_complete, *
FROM sys.dm_exec_requests
WHERE command In ( 'RESTORE DATABASE', 'BACKUP DATABASE' )
Liam Fleming
źródło
0

Używam sp_whoisactive, bardzo pouczającego standardu branżowego. zwraca również procent ukończenia.

RC Bird
źródło
-1

po prostu uruchom bkp_status na głównej bazie danych, a otrzymasz status kopii zapasowej

ahsan Mumtaz Abbasi
źródło