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


Cuando hago una copia de seguridad o restauración de 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 más aún tengo que esperar a que termine. Si inicio la copia de seguridad o restauración con un script, ¿hay alguna manera de monitorear el progreso, o simplemente me siento y espero que termine (esperando que nada haya salido mal?)

Edited: 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.

Author: Trisped, 2008-09-30

12 answers

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. La copia de seguridad actualmente en ejecución contendrá la cadena "BACKUP" en el campo requestCommand. El bien llamado PercentComplete campo le dará el progreso de la copia de seguridad.

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

 9
Author: Portman,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2008-10-01 03:22:35

Encontré este script de ejemplo 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')
 197
Author: Veldmuis,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-10-21 07:01:08

Si conoce el sessionID, 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
 11
Author: Allen,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-06-30 02:23:37

Aquí hay un script simple que generalmente hace el truco 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') 
 5
Author: Wilfred Kimani,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-10-19 15:18:17

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, establece 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).

 4
Author: David L Morris,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2008-09-30 10:14:06
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
Author: Shahbaz I Shaikh,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-12-15 10:55:04
 3
Author: Pavel Chuchuva,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2008-09-30 10:06:28

Creo que la mejor manera de averiguar cómo su restauración o el progreso de 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, identificar la sesión por sí misma y realizar un porcentaje de progreso cada vez que se pulsa F5 o Ejecutar botón en SSMS!

La consulta fue realizada por el tipo que escribe este post

 3
Author: BMDaemon,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-04-11 18:13:22

Script para comprobar 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 la Base de datos o por un trabajo, y no puede usar la GUI nada más para verificar el progreso de esa Copia de Seguridad / Restauración.

Al combinar varios comandos, he generado el siguiente script que nos puede dar un resumen de las copias de seguridad y restauraciones actuales que están sucediendo 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')
 1
Author: Kundan Dasange,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-03-12 20:29:51

Para supervisar el progreso de la copia de seguridad o restauración completamente independiente 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' )
 0
Author: Liam Fleming,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-12-13 11:56:30

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

 0
Author: RC Bird,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-04-25 15:36:20

Simplemente ejecute bkp_status en la base de datos maestra obtendrá el estado de la copia de seguridad

 0
Author: ahsan Mumtaz Abbasi,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-07-05 03:46:53