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.
źródło
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')
źródło
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
źródło
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')
źródło
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
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')
źródło
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).
źródło
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')
źródło
Użyj opcji STATS: http://msdn.microsoft.com/en-us/library/ms186865.aspx
źródło
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
źródło
Dodaj
STATS=10
lubSTATS=1
w 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.
źródło
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”)
źródło
Dla każdego, kto używa SQL Server w RDS (AWS), istnieje wbudowana procedura wywoływana w
msdb
bazie danych, która zapewnia kompleksowe informacje na temat wszystkich zadań tworzenia kopii zapasowych i przywracania:Zapewni to pełne podsumowanie każdego zadania, jego konfigurację, szczegóły wykonania (takie jak procent wykonania i całkowity czas trwania) oraz
task_info
kolumnę, która jest niezwykle pomocna podczas próby ustalenia, co jest nie tak z kopią zapasową lub przywracaniem.źródło
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 :
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
źródło
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' )
źródło
Używam sp_whoisactive, bardzo pouczającego standardu branżowego. zwraca również procent ukończenia.
źródło
po prostu uruchom bkp_status na głównej bazie danych, a otrzymasz status kopii zapasowej
źródło