Gibt es ein SQL-Skript, mit dem ich den Fortschritt eines SQL Server-Sicherungs- oder Wiederherstellungsprozesses bestimmen kann?

94

Wenn ich eine Datenbank mit MS SQL Server Management Studio sichern oder wiederherstellen kann, wird visuell angezeigt, wie weit der Prozess fortgeschritten ist und wie lange ich noch warten muss, bis er abgeschlossen ist. Wenn ich die Sicherung oder Wiederherstellung mit einem Skript starte, gibt es eine Möglichkeit, den Fortschritt zu überwachen, oder lehne ich mich einfach zurück und warte, bis er abgeschlossen ist (in der Hoffnung, dass nichts schief gelaufen ist?)

Bearbeitet: Ich muss insbesondere in der Lage sein, den Fortschritt der Sicherung oder Wiederherstellung vollständig unabhängig von der Sitzung zu überwachen, in der die Sicherung oder Wiederherstellung initiiert wurde.

Veldmuis
quelle

Antworten:

12

Ja. Wenn Sie sp_who2k5 in Ihrer Master-Datenbank installiert haben , können Sie einfach Folgendes ausführen:

sp_who2k5 1,1

Die Ergebnismenge enthält alle aktiven Transaktionen. Die derzeit laufende Backup (s) wird die Zeichenfolge „BACKUP“ im enthält requestCommand Feld. Das treffend benannte Feld " ProzentComplete" zeigt den Fortschritt der Sicherung an.

Hinweis: sp_who2k5 sollte Teil des Toolkits aller sein, es kann viel mehr als nur das.

Portman
quelle
Hüte dich vor den seltsamen Anführungszeichen im Code für sp_who2k5 !! Musste 'durch' ersetzen, um dies zum
Laufen
Mir ist klar, dass dies ein sehr alter Thread ist, aber der Link zum Abrufen des gespeicherten Prozesses ist tot.
John Waclawski
216

Ich habe hier dieses Beispielskript gefunden , das ziemlich gut zu funktionieren scheint:

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
quelle
2
Der bereitgestellte Quelllink verweist nicht mehr auf den Artikel. Dies ist die aktualisierte: sql-articles.com/scripts/estimated-time-for-backup-restore
Marien
Obwohl die Wiederherstellung 15 Minuten lang durchgeführt wurde, wird lediglich ein Fortschritt von 0% aufgezeichnet. Es ist eine große Datenbank (80 Gigs). Irgendwelche anderen Vorschläge?
user64141
5
@ user63141; Die Wiederherstellung beginnt mit einer Dateizuordnung. Wenn Sie nichts getan haben, ist die sofortige Dateiinitialisierung nicht zulässig (siehe msdn.microsoft.com/en-us/library/ms175935.aspx ). Es kann eine Weile dauern, wenn Sie alte Festplatten oder eine große Datenbank haben
Henrik Staun Poulsen
2
Es gibt keine Zeilen in der Ausgabe, als ich diese Abfrage ausführte
Goutam
1
Ich denke, wenn Sie 'RESTORE HEADERON' zur Liste in der WHERE-Klausel hinzufügen, erhalten Sie auch Fortschritte bei allen Sicherungsüberprüfungsjobs, die anschließend ausgeführt werden.
Goorj
16

Wenn Sie die Sitzungs-ID kennen, können Sie Folgendes verwenden:

SELECT * FROM sys.dm_exec_requests WHERE session_id = 62

Oder wenn Sie es eingrenzen möchten:

SELECT command, percent_complete, start_time FROM sys.dm_exec_requests WHERE session_id = 62
Allen
quelle
6
Das funktionierte wirklich gut für mich Befehl, PERCENT_COMPLETE, START_TIME FROM sys.dm_exec_requests SELECT wo Befehl = 'RESTORE DATABASE'
eythort
10

Hier ist ein einfaches Skript, das im Allgemeinen den Trick für mich erledigt:

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
quelle
6

Skript zum Überprüfen des Fortschritts beim Sichern und Wiederherstellen in SQL Server :

Oft kommt es vor, dass Ihre Sicherungs- (oder Wiederherstellungs-) Aktivität von einem anderen Datenbankadministrator oder von einem Job gestartet wurde und Sie über die GUI nichts anderes verwenden können, um den Fortschritt dieser Sicherung / Wiederherstellung zu überprüfen.

Durch die Kombination mehrerer Befehle habe ich das folgende Skript generiert, das uns eine Zusammenfassung der aktuellen Sicherungen und Wiederherstellungen auf dem Server geben kann.

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

quelle
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
quelle
4

Verwenden Sie STATS im Befehl BACKUP, wenn es sich nur um ein Skript handelt.

Innerhalb des Codes ist es etwas komplizierter. In ODBC setzen Sie beispielsweise SQL_ATTR_ASYNC_ENABLE, suchen nach dem Rückkehrcode SQL_STILL_EXECUTING und führen einige wiederholte Aufrufe von SQLExecDirect durch, bis Sie SQL_SUCCESS (oder eqiv) erhalten.

David L Morris
quelle
4

Versuchen Sie es mit:

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
quelle
3

Verwenden Sie die Option STATS: http://msdn.microsoft.com/en-us/library/ms186865.aspx

Pavel Chuchuva
quelle
Sofern mir nichts fehlt, kann ich das Feedback nicht in derselben Sitzung erhalten, in der ich die Sicherung starte. In unserem Fall starten wir um 4 Uhr morgens eine DB-Wiederherstellung mit einer geplanten BAT-Datei, und ich möchte 3 oder 4 Stunden später eine Verbindung zum Server herstellen und den Fortschritt ermitteln.
Veldmuis
Ich denke, Sie können die Skriptausgabe in die Protokolldatei umleiten und sie dann von Zeit zu Zeit untersuchen.
Pavel Chuchuva
3

Ich denke, der beste Weg, um herauszufinden, wie Ihr Wiederherstellungs- oder Sicherungsfortschritt ist, ist die folgende Abfrage:

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

In der obigen Abfrage identifizieren Sie die Sitzung selbst und führen jedes Mal einen prozentualen Fortschritt durch, wenn Sie auf SSMS die Taste F5 oder Ausführen drücken!

Die Abfrage wurde von dem Typ durchgeführt, der diesen Beitrag geschrieben hat

BMDaemon
quelle
1

Hinzufügen STATS=10oder STATS=1im Sicherungsbefehl.

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
quelle
1

SELECT session_id als SPID, Befehl, start_time, Prozent_complete, dateadd (zweite, geschätzte_completion_time / 1000, getdate ()) als geschätzte_completion_time, a.text AS Abfrage FROM sys.dm_exec_requests r CROSS APPLY sys.dm_exec_sql_text (r.sql_hand). Befehl in ('BACKUP DATABASE', 'BACKUP LOG', 'RESTORE DATABASE', 'RESTORE LOG')

Ben
quelle
1

Für alle, die SQL Server unter RDS (AWS) ausführen, gibt es eine integrierte Prozedur, die in der msdbDatenbank aufgerufen werden kann und umfassende Informationen für alle Sicherungs- und Wiederherstellungsaufgaben enthält:

exec msdb.dbo.rds_task_status;

Auf diese Weise erhalten Sie einen vollständigen Überblick über jede Aufgabe, ihre Konfiguration, Details zur Ausführung (z. B. abgeschlossener Prozentsatz und Gesamtdauer) sowie eine task_infoSpalte, die äußerst hilfreich ist, wenn Sie herausfinden möchten, was mit einer Sicherung oder Wiederherstellung nicht stimmt.

bsplosion
quelle
0

So überwachen Sie den Sicherungs- oder Wiederherstellungsfortschritt vollständig getrennt von der Sitzung, in der die Sicherung oder Wiederherstellung initiiert wurde. Keine Tools von Drittanbietern erforderlich. Getestet auf Microsoft SQL Server 2012.

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

Ich verwende sp_whoisactive, sehr informativ und im Grunde genommen Industriestandard. es gibt auch Prozent vollständig zurück.

RC Bird
quelle
-1

Führen Sie einfach bkp_status auf der Master-Datenbank aus. Sie erhalten den Sicherungsstatus

Ahsan Mumtaz Abbasi
quelle