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

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

  •  02-07-2019
  •  | 
  •  

Pregunta

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

Editado: Mi necesidad es específicamente para 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.

¿Fue útil?

Solución

Sí. 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 actualmente en ejecución contendrán la cadena " BACKUP " en el campo requestCommand . El campo apropiadamente denominado percentComplete le dará el progreso de la copia de seguridad.

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

Otros consejos

Encontré este script de muestra aquí que parece estar trabajando 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')

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

SELECT * FROM sys.dm_exec_requests WHERE session_id = 62

O si quieres reducirlo:

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

Aquí hay un script simple que generalmente hace el truco por 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') 

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

El código interno es un poco más complicado. En ODBC, por ejemplo, establece SQL_ATTR_ASYNC_ENABLE y luego busca el código de retorno SQL_STILL_EXECUTING, y hace algunas llamadas repetidas de SQLExecDirect hasta que obtenga 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 para verificar el progreso de Copia de Seguridad y Restauración en SQL Server :

Muchas veces sucede que su administrador de la base de datos o un trabajo inició su actividad de copia de seguridad (o restauración), y no puede usar la GUI para verificar el progreso de dicha copia de seguridad / restauración.

Al combinar varios comandos, he generado una secuencia de comandos a continuación 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')

Creo que la mejor forma de averiguar cómo se realiza el proceso de 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 progreso porcentual cada vez que presiona F5 o el botón Ejecutar en SSMS!

La consulta fue realizada por el tipo que escribió esto post

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

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

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

Agrega STATS = 10 o STATS = 1 en el comando de copia de seguridad.

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.

SELECCIONE el ID de sesión como SPID, comando, tiempo_inicio, porcentaje_completo,         dateadd (segundo ,estimado_compleción_tiempo / 1000, getdate ()) como estimado_compleción_tiempo,         a.text AS Query DESDE sys.dm_exec_requests r APLICACIÓN DE CRUCE sys.dm_exec_sql_text (r.sql_handle) a DONDE r.command en ('BACKUP DATABASE', 'BACKUP LOG', 'RESTORE DATABASE', 'RESTORE LOG')

simplemente ejecute bkp_status en la base de datos maestra y obtendrá un estado de respaldo

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top