Existe um script SQL que posso usar para determinar o andamento de um processo de backup ou restauração do SQL Server?

94

Quando faço backup ou restauro um banco de dados usando o MS SQL Server Management Studio, recebo uma indicação visual de quanto o processo avançou e, portanto, quanto tempo ainda preciso esperar para que ele termine. Se eu iniciar o backup ou restaurar com um script, há uma maneira de monitorar o progresso ou devo apenas sentar e esperar que ele termine (esperando que nada tenha dado errado?)

Editado: minha necessidade é especificamente poder monitorar o andamento do backup ou restauração completamente separado da sessão onde o backup ou restauração foi iniciado.

Veldmuis
fonte

Respostas:

12

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

sp_who2k5 1,1

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

Nota: sp_who2k5 deve fazer parte do kit de ferramentas de todos, ele faz muito mais do que apenas isso.

Portman
fonte
Cuidado com as citações estranhas no código de sp_who2k5 !! Tive que substituir "por" para fazer isso funcionar
Dinglemeyer NeverGonnaGiveUUp
Sei que este é um tópico muito antigo, mas o link para obter o procedimento armazenado está morto.
John Waclawski
216

Encontrei este script de amostra 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')
Veldmuis
fonte
2
O link da fonte fornecido não aponta mais para o artigo. Este é o atualizado: sql-articles.com/scripts/estimated-time-for-backup-restore
Marien
Mesmo que a restauração esteja em andamento por 15 minutos, ela simplesmente registra 0% de progresso. É um grande banco de dados (80 GB). Alguma outra sugestão?
user64141
5
@ user63141; a restauração começa com uma alocação de arquivo. Se você não fez nada, a inicialização instantânea de arquivos não é permitida (consulte msdn.microsoft.com/en-us/library/ms175935.aspx ). Pode demorar um pouco, se você tiver discos antigos ou um grande banco de dados
Henrik Staun Poulsen
2
Não há linhas na saída quando
executei
1
Acho que, se você adicionar 'RESTORE HEADERON' à lista da cláusula WHERE, também obterá progresso em quaisquer trabalhos de verificação de backup executados posteriormente.
goorj
16

Se você souber o ID da sessão, poderá usar o seguinte:

SELECT * FROM sys.dm_exec_requests WHERE session_id = 62

Ou se você quiser restringir:

SELECT command, percent_complete, start_time FROM sys.dm_exec_requests WHERE session_id = 62
Allen
fonte
6
Isso realmente funcionou bem para mim Comando SELECT, percent_complete, start_time FROM sys.dm_exec_requests onde command = 'RESTORE DATABASE'
eythort
10

Aqui está um script simples que geralmente funciona 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') 
Wilfred Kimani
fonte
6

Script para verificar o andamento do Backup e Restauração no SQL Server :

Muitas vezes acontece que sua atividade de backup (ou restauração) foi iniciada por outro administrador de banco de dados ou por um trabalho, e você não pode mais usar a GUI para verificar o andamento desse backup / restauração.

Ao combinar vários comandos, eu gerei o script abaixo 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')

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

Use STATS no comando BACKUP se for apenas um script.

Dentro do código é um pouco mais complicado. No ODBC, por exemplo, você define SQL_ATTR_ASYNC_ENABLE e, em seguida, procura o código de retorno SQL_STILL_EXECUTING e faz algumas chamadas repetidas de SQLExecDirect até obter um SQL_SUCCESS (ou eqiv).

David L Morris
fonte
4

Experimente 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')
Zaalouni Mohamed
fonte
3

Use a opção STATS: http://msdn.microsoft.com/en-us/library/ms186865.aspx

Pavel Chuchuva
fonte
A menos que esteja faltando alguma coisa, isso me limita a obter o feedback na mesma sessão em que inicio o backup. Em nosso caso, iniciamos uma restauração de banco de dados com um arquivo BAT agendado às 4 da manhã e desejo me conectar ao servidor 3 ou 4 horas depois e determinar o andamento.
Veldmuis
Acho que você pode redirecionar a saída do script para o arquivo de log e examiná-lo de tempos em tempos.
Pavel Chuchuva
3

Acho que a melhor maneira de descobrir como o andamento da sua restauração ou backup é pela 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, identifica a sessão por si só e realiza uma porcentagem de progresso toda vez que você pressiona F5 ou o botão Executar no SSMS!

A consulta foi realizada pelo cara que escreve esta postagem

BMDaemon
fonte
1

Adicione STATS=10ou STATS=1no comando de 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.
Zaalouni Mohamed
fonte
1

SELECT session_id como SPID, command, start_time, percent_complete, dateadd (second, estimado_completion_time / 1000, getdate ()) como estimado_completion_time, a.text AS Query FROM sys.dm_exec_requests r CROSS APPLY sys.dm_exec_sql_text (r.sql_handle). comando em ('BACKUP DATABASE', 'BACKUP LOG', 'RESTORE DATABASE', 'RESTORE LOG')

Ben
fonte
1

Para qualquer pessoa que execute o SQL Server em RDS (AWS), há um procedimento integrado que pode ser chamado no msdbbanco de dados que fornece informações abrangentes para todas as tarefas de backup e restauração:

exec msdb.dbo.rds_task_status;

Isso fornecerá um resumo completo de cada tarefa, sua configuração, detalhes sobre a execução (como porcentagem concluída e duração total) e uma task_infocoluna que é extremamente útil ao tentar descobrir o que há de errado com um backup ou restauração.

bsplosão
fonte
0

Para monitorar o progresso do backup ou restauração, completamente separado da sessão onde o backup ou restauração foi iniciado. Nenhuma ferramenta de terceiros necessária. Testado no Microsoft SQL Server 2012.

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

Estou usando sp_whoisactive, um padrão basicamente da indústria muito informativo. ele retorna a porcentagem concluída também.

RC Bird
fonte
-1

simplesmente execute bkp_status no banco de dados master você obterá o status de backup

ahsan Mumtaz Abbasi
fonte