¿Existe un script SQL que pueda usar para determinar el progreso de un proceso de copia de seguridad o restauración de SQL Server?

94

Cuando hago una copia de seguridad o restauro una base de datos usando MS SQL Server Management Studio, obtengo una indicación visual de cuánto ha progresado el proceso y, por lo tanto, cuánto tiempo debo esperar para que termine. Si inicio la copia de seguridad o la restauración con un script, ¿hay alguna manera de monitorear el progreso, o simplemente me siento y espero a que termine (con la esperanza de que nada haya salido mal?)

Editado: Mi necesidad es específicamente poder monitorear el progreso de la copia de seguridad o restauración completamente separado de la sesión donde se inició la copia de seguridad o restauración.

Veldmuis
fuente

Respuestas:

12

Si. Si ha instalado sp_who2k5 en su base de datos maestra, simplemente puede ejecutar:

sp_who2k5 1,1

El conjunto de resultados incluirá todas las transacciones activas. Las copias de seguridad que se estén ejecutando actualmente contendrán la cadena "BACKUP" en el campo requestCommand . El campo percentComplete con el nombre apropiado le dará el progreso de la copia de seguridad.

Nota: sp_who2k5 debería ser parte del conjunto de herramientas de todos, hace mucho más que esto.

Portman
fuente
¡¡Cuidado con las citas extrañas en el código de sp_who2k5 !! Tuve que reemplazar 'con' para que esto funcione
Dinglemeyer NeverGonnaGiveUUp
Me doy cuenta de que este es un hilo muy antiguo, pero el enlace para obtener el proceso almacenado está muerto.
John Waclawski
216

Encontré este script de muestra aquí que parece estar funcionando bastante bien:

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
fuente
2
El enlace de origen proporcionado ya no apunta al artículo. Este es el actualizado: sql-articles.com/scripts/estimated-time-for-backup-restore
Marien
Aunque la restauración se ha realizado durante 15 minutos, simplemente registra un 0% de progreso. Es una gran base de datos (80 gigas). ¿Cualquier otra sugerencia?
user64141
5
@ user63141; la restauración comienza con una asignación de archivos. Si no ha hecho nada, no se permite la inicialización instantánea de archivos (consulte msdn.microsoft.com/en-us/library/ms175935.aspx ). Puede llevar bastante tiempo, si tiene discos viejos o una base de datos grande
Henrik Staun Poulsen
2
No hay filas en la salida cuando
ejecuté
1
Creo que si agrega 'RESTORE HEADERON' a la lista en la cláusula WHERE, también obtendrá progreso en cualquier trabajo de verificación de respaldo que se ejecute después.
goorj
16

Si conoce el ID de sesión, puede usar lo siguiente:

SELECT * FROM sys.dm_exec_requests WHERE session_id = 62

O si desea reducirlo:

SELECT command, percent_complete, start_time FROM sys.dm_exec_requests WHERE session_id = 62
Allen
fuente
6
Esto realmente funcionó bien para mí SELECT command, percent_complete, start_time FROM sys.dm_exec_requests donde command = 'RESTORE DATABASE'
eythort
10

Aquí hay un script simple que generalmente funciona para mí:

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

Script para verificar el progreso de la copia de seguridad y restauración en SQL Server :

Muchas veces sucede que su actividad de copia de seguridad (o restauración) ha sido iniciada por otro administrador de base de datos o por un trabajo, y no puede usar la GUI de ninguna otra manera para verificar el progreso de esa copia de seguridad / restauración.

Al combinar varios comandos, he generado el siguiente script que puede darnos un resumen de las copias de seguridad y restauraciones actuales que están ocurriendo en el servidor.

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

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

Use STATS en el comando BACKUP si es solo un script.

Dentro del código es un poco más complicado. En ODBC, por ejemplo, configura SQL_ATTR_ASYNC_ENABLE y luego busca el código de retorno SQL_STILL_EXECUTING, y realiza algunas llamadas repetidas de SQLExecDirect hasta obtener un SQL_SUCCESS (o eqiv).

David L Morris
fuente
4

Prueba 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')
Zaalouni Mohamed
fuente
3

Use la opción STATS: http://msdn.microsoft.com/en-us/library/ms186865.aspx

Pavel Chuchuva
fuente
A menos que me falte algo, esto me limita a recibir los comentarios en la misma sesión en la que inicio la copia de seguridad. En nuestro caso, iniciamos una restauración de la base de datos con un archivo BAT programado a las 4 de la mañana y quiero conectarme al servidor 3 o 4 horas más tarde y determinar el progreso.
Veldmuis
Creo que puede redirigir la salida del script al archivo de registro y luego examinarlo de vez en cuando.
Pavel Chuchuva
3

Creo que la mejor manera de averiguar cómo es el progreso de su restauración o copia de seguridad es mediante la siguiente consulta:

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 consulta anterior identifica la sesión por sí misma y realiza un porcentaje de progreso cada vez que presiona F5 o el botón Ejecutar en SSMS.

La consulta fue realizada por el tipo que escribe este post.

BMDaemon
fuente
1

Agregar STATS=10o STATS=1en el comando de respaldo.

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

SELECCIONE session_id como SPID, comando, start_time, percent_complete, dateadd (segundo, estimado_completion_time / 1000, getdate ()) como estimado_completion_time, un texto AS Query FROM sys.dm_exec_requests r CROSS APPLY sys.dm_exec_sql_text (r.sql_ERE). comando en ('BACKUP DATABASE', 'BACKUP LOG', 'RESTORE DATABASE', 'RESTORE LOG')

Ben
fuente
1

Para cualquier persona que ejecute SQL Server en RDS (AWS), hay un procedimiento integrado al que se puede llamar en la msdbbase de datos que proporciona información completa para todas las tareas de copia de seguridad y restauración:

exec msdb.dbo.rds_task_status;

Esto le dará un resumen completo de cada tarea, su configuración, detalles sobre la ejecución (como el porcentaje completado y la duración total) y una task_infocolumna que es inmensamente útil cuando se trata de averiguar qué está mal con una copia de seguridad o restauración.

bsplosion
fuente
0

Para monitorear el progreso de la copia de seguridad o la restauración completamente separado de la sesión donde se inició la copia de seguridad o la restauración. No se requieren herramientas de terceros. Probado en Microsoft SQL Server 2012.

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

Estoy usando sp_whoisactive, muy informativo y básicamente un estándar de la industria. también devuelve un porcentaje completo.

RC pájaro
fuente
-1

simplemente ejecute bkp_status en master db obtendrá el estado de la copia de seguridad

ahsan Mumtaz Abbasi
fuente