Existe um script SQL que eu possa usar para determinar o progresso de um backup do SQL Server ou processo de restauração?

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

  •  02-07-2019
  •  | 
  •  

Pergunta

Quando eu backup ou restaurar um banco de dados usando o MS SQL Server Management Studio, recebo uma indicação visual de quão longe o processo progrediu e, assim, quanto tempo eu ainda preciso esperar que ela termine. Se eu começar o backup ou restauração com um script, há uma maneira de monitorar o progresso, ou eu só sentar e esperar que ela termine (esperando que nada tem de errado for?)

Editado:. Minha necessidade é especificamente para ser capaz de monitorar o backup ou restaurar progresso completamente separado da sessão onde o backup ou restauração foi iniciada

Foi útil?

Solução

Sim. Se você tiver instalado o sp_who2k5 em seu banco de dados mestre, você pode simplesmente executar:

sp_who2k5 1,1

O conjunto de resultados incluirá todas as transações ativas. O backup em execução no momento (s) irá conter a string "BACKUP" no campo requestCommand. O apropriadamente chamado percentComplete lhe dará o andamento do backup.

Nota: sp_who2k5 deve ser uma parte de todos toolkit, ele faz muito mais do que apenas isso

.

Outras dicas

Eu encontrei este script de exemplo aqui que parece estar funcionando muito bem:

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 você sabe o sessionID então você pode usar o seguinte:

SELECT * FROM sys.dm_exec_requests WHERE session_id = 62

Ou se você quer reduzi-lo:

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

Aqui está um script simples que geralmente faz o truque para mim:

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 no comando BACKUP se é apenas um script.

código dentro é um pouco mais complicado. Em ODBC por exemplo, você definir SQL_ATTR_ASYNC_ENABLE e depois olhar para o código SQL_STILL_EXECUTING retorno, e fazer algumas chamadas repetidas de SQLExecDirect até obter um SQL_SUCCESS (ou 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 o backup e restauração progressos no SQL Server :

Muitas vezes acontece que o seu backup (ou restaurar) a atividade foi iniciada por outro administrador de base ou por um trabalho, e você não pode usar o GUI mais nada para verificar o andamento de que Backup / Restore.

Ao combinar vários comandos, eu geraram abaixo script que pode nos dar um resumo dos backups e restaurações atuais que estão acontecendo no 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')

Eu acho que a melhor maneira de descobrir como o seu restaurar ou progresso do backup é através da seguinte 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

A consulta acima, identificar a sessão por si só e realizar uma porcentagem progredir cada vez que você pressione F5 ou o botão Executar no SSMS!

A consulta foi realizada pelo cara que escrever este pós

Tente com:

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 monitorar o backup ou restaurar progresso completamente separado da sessão em que foi iniciado o backup ou restauração. Não há ferramentas de terceiros necessários. Testado em Microsoft SQL Server 2012.

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

Eu estou usando sp_whoisactive, muito informativo um padrão da indústria, basicamente. ele retorna por cento completo, bem.

Adicionar STATS=10 ou STATS=1 no comando 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.

SELECIONAR session_id como SPID, comando, start_time, percent_complete, dateadd (segunda, estimated_completion_time / 1000, getdate ()) como estimated_completion_time, a.text AS consulta DE sys.dm_exec_requests r CRUZ APLICAR sys.dm_exec_sql_text (r.sql_handle) um ONDE r.command in ( 'BACKUP DATABASE', 'BACKUP LOG', 'Restore Database', 'Restaurar LOG')

simplesmente executar bkp_status no master db você terá status de backup

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top