Esiste uno script SQL che posso utilizzare per determinare l'avanzamento di un processo di backup o ripristino di SQL Server?

StackOverflow https://stackoverflow.com/questions/152447

  •  02-07-2019
  •  | 
  •  

Domanda

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 per quanto ancora devo ancora aspettare che finisca. Se avvio il backup o ripristino con uno script, c'è un modo per monitorare l'avanzamento o posso semplicemente sedermi e aspettare che finisca (sperando che nulla sia andato storto?)

Modificato: La mia necessità è in particolare quella di poter monitorare il backup o ripristinare l'avanzamento completamente separato dalla sessione in cui è stato avviato il backup o il ripristino.

È stato utile?

Soluzione

Sì. Se hai installato sp_who2k5 nel tuo database principale, 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 opportunamente chiamato ti darà l'avanzamento del backup.

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

Altri suggerimenti

Ho trovato questo script di esempio qui che sembra funziona 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')

Se si conosce sessionID, è possibile utilizzare quanto segue:

SELECT * FROM sys.dm_exec_requests WHERE session_id = 62

O se vuoi restringerlo:

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

Ecco un semplice script che in genere 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') 

Usa STATS nel comando BACKUP se è solo uno script.

Il codice interno è un po 'più complicato. In ODBC, ad esempio, si imposta SQL_ATTR_ASYNC_ENABLE e si cerca il codice di ritorno SQL_STILL_EXECUTING e si eseguono alcune chiamate ripetute di SQLExecDirect fino a quando non si ottiene un SQL_SUCCESS (o eqiv).

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

Script per verificare l'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 del database o da un processo e non è possibile utilizzare la GUI per controllare l'avanzamento di tale backup / ripristino.

Combinando più comandi, ho generato sotto lo script che può darci un riepilogo degli attuali backup e ripristini 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')

Penso che il modo migliore per scoprire come sono i tuoi progressi di ripristino o backup con 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 esegue un progresso percentuale ogni volta che premi F5 o esegui il pulsante su SSMS!

La query è stata eseguita dal ragazzo che scrive questo post

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

Per monitorare l'avanzamento del backup o del ripristino completamente separato dalla sessione in cui è stato avviato il backup o il ripristino. Non sono richiesti 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' )

Sto usando sp_whoisactive, molto informativo e sostanzialmente uno standard industriale. restituisce anche la percentuale di completamento.

Aggiungi STATS = 10 o STATS = 1 nel 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.

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

esegui semplicemente bkp_status sul master db per ottenere lo stato del backup

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top