SQL Server: esiste uno script SQL che posso utilizzare per determinare lo stato di avanzamento di un processo di backup o ripristino di SQL Server?


95

Quando eseguo il backup o il ripristino di un database utilizzando MS SQL Server Management Studio, ottengo un'indicazione visiva di quanto è progredito il processo e quindi di quanto tempo ancora devo aspettare che finisca. Se avvio il backup o ripristino con uno script, c'è un modo per monitorare l'avanzamento, oppure mi siedo e aspetto che finisca (sperando che nulla sia andato storto?)

Modificato: la mia esigenza è specificamente quella di poter monitorare il backup o ripristinare l'avanzamento completamente separato dalla sessione in cui è stato avviato il backup o il ripristino.

Risposte:


12

Sì. Se hai installato sp_who2k5 nel tuo database master, puoi semplicemente eseguire:

sp_who2k5 1,1

Il gruppo di risultati includerà tutte le transazioni attive. I backup attualmente in esecuzione conterranno la stringa "BACKUP" nel campo requestCommand . Il campo percentComplete dal nome appropriato ti fornirà lo stato di avanzamento del backup.

Nota: sp_who2k5 dovrebbe essere una parte del toolkit di tutti, fa molto di più di questo.


Attenzione alle strane citazioni nel codice per sp_who2k5 !! Ho dovuto sostituire 'con' per farlo funzionare
Dinglemeyer NeverGonnaGiveUp

Mi rendo conto che questo è un thread molto vecchio ma il collegamento per ottenere il proc memorizzato è morto.
John Waclawski

216

Ho trovato questo script di esempio qui che sembra funzionare abbastanza bene:

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
Il collegamento alla fonte fornito non punta più all'articolo. Questo è quello aggiornato: sql-articles.com/scripts/estimated-time-for-backup-restore
Marien

Anche se il ripristino è in corso da 15 minuti, registra semplicemente lo 0% di avanzamento. È un database di grandi dimensioni (80 giga). Qualche altro suggerimento?
user64141

5
@ user63141; il ripristino inizia con un'allocazione di file. Se non hai fatto nulla, l'inizializzazione istantanea dei file non è consentita (vedi msdn.microsoft.com/en-us/library/ms175935.aspx ). Potrebbe volerci un po 'di tempo, se si dispone di vecchi dischi o di un database di grandi dimensioni
Henrik Staun Poulsen

2
Non ci sono righe nell'output quando ho eseguito questa query
goutam

1
Penso che se aggiungi "RESTORE HEADERON" all'elenco nella clausola WHERE, otterrai progressi anche su qualsiasi lavoro di verifica del backup eseguito successivamente.
goorj

16

Se conosci il sessionID, puoi utilizzare quanto segue:

SELECT * FROM sys.dm_exec_requests WHERE session_id = 62

O se vuoi restringere il campo:

SELECT command, percent_complete, start_time FROM sys.dm_exec_requests WHERE session_id = 62

7
Questo in realtà ha funzionato bene per me SELECT command, percent_complete, start_time FROM sys.dm_exec_requests dove command = 'RESTORE DATABASE'
eythort

11

Ecco uno script semplice che generalmente fa il trucco per me:

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

Script per controllare lo stato di avanzamento del backup e del ripristino in SQL Server :

Molte volte accade che l'attività di backup (o ripristino) sia stata avviata da un altro amministratore di database o da un lavoro e non è possibile utilizzare la GUI nient'altro per controllare l'avanzamento di tale backup / ripristino.

Combinando più comandi, ho generato lo script di seguito che può darci un riepilogo dei backup e dei ripristini correnti che stanno avvenendo sul 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

Usa STATS nel comando BACKUP se è solo uno script.

All'interno del codice è un po 'più complicato. In ODBC, ad esempio, si imposta SQL_ATTR_ASYNC_ENABLE e quindi si cerca il codice di ritorno SQL_STILL_EXECUTING ed si eseguono alcune chiamate ripetute di SQLExecDirect finché non si ottiene SQL_SUCCESS (o eqiv).


4

Prova con:

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

A meno che non mi manchi qualcosa, questo mi limita a ricevere il feedback nella stessa sessione di quella in cui avvio il backup. Nel nostro caso iniziamo un ripristino del DB con un file BAT pianificato alle 4 del mattino e voglio connettermi al server 3 o 4 ore dopo e determinare lo stato di avanzamento.
Veldmuis

Penso che tu possa reindirizzare l'output dello script al file di registro e quindi esaminarlo di volta in volta.
Pavel Chuchuva

3

Penso che il modo migliore per scoprire come l'avanzamento del ripristino o del backup sia tramite la seguente query:

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

La query sopra, identifica la sessione da sola ed esegui un avanzamento percentuale ogni volta che premi F5 o il pulsante Esegui su SSMS!

La query è stata eseguita dal ragazzo che scrive questo post


2

Aggiungi STATS=10o STATS=1nel comando di backup.

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

SELEZIONA session_id come SPID, command, start_time, percent_complete, dateadd (second, rated_completion_time / 1000, getdate ()) as rated_completion_time, a.text AS Query FROM sys.dm_exec_requests r CROSS APPLY sys.dm_exec_sql_text (r.sql_handle. comando in ('BACKUP DATABASE', 'BACKUP LOG', 'RESTORE DATABASE', 'RESTORE LOG')


1

Per chiunque esegua SQL Server su RDS (AWS), è disponibile una procedura incorporata richiamabile nel msdbdatabase che fornisce informazioni complete per tutte le attività di backup e ripristino:

exec msdb.dbo.rds_task_status;

Ciò fornirà una panoramica completa di ciascuna attività, la sua configurazione, i dettagli sull'esecuzione (come la percentuale completata e la durata totale) e una task_infocolonna che è estremamente utile quando si cerca di capire cosa c'è di sbagliato in un backup o ripristino.


0

Per monitorare l'avanzamento del backup o del ripristino completamente separato dalla sessione in cui è stato avviato il backup o il ripristino. Non sono necessari strumenti di terze parti. Testato su Microsoft SQL Server 2012.

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

0

Sto usando sp_whoisactive, molto informativo, uno standard di settore. restituisce anche la percentuale di completamento.


0

Ho riscontrato un problema simile durante il lavoro sull'operazione di ripristino del database su MS SQL Server 2012.

Tuttavia, per il mio scenario, avevo solo bisogno di vedere lo stato di avanzamento dell'operazione DATABASE RESTORE nella finestra dello script

Tutto quello che dovevo fare era aggiungere l'opzione STATS allo script:

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

Quindi sono passato alla scheda Messaggi della finestra Script per vedere lo stato di avanzamento dell'operazione RESTORE DATABASE :

inserisci qui la descrizione dell'immagine

Se vuoi avere maggiori informazioni dopo l'operazione RESTORE DATABASE puoi usare questo comando suggerito da eythort :

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

È tutto.

Spero che aiuti


Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.