web-dev-qa-db-fra.com

Existe-t-il un script SQL que je peux utiliser pour déterminer la progression d'un processus de sauvegarde ou de restauration SQL Server?

Lorsque je sauvegarde ou restaure une base de données à l'aide de MS SQL Server Management Studio, j'obtiens une indication visuelle de l'état d'avancement du processus et, par conséquent, du temps qu'il me reste encore à attendre pour qu'il se termine. Si je lance la sauvegarde ou la restauration avec un script, y a-t-il un moyen de surveiller les progrès, ou dois-je simplement m'asseoir et attendre que cela se termine (en espérant que rien ne s'est mal passé?)

Modifié: Mon besoin spécifique est de pouvoir surveiller la progression de la sauvegarde ou de la restauration de manière totalement distincte de la session où la sauvegarde ou la restauration a été lancée.

87
Veldmuis

Oui. Si vous avez installé sp_who2k5 dans votre base de données master, vous pouvez simplement exécuter:

sp_who2k5 1,1

Le résultat comprendra toutes les transactions actives. La ou les sauvegardes en cours d'exécution contiendront la chaîne "BACKUP" dans le champ requestCommand. Le champ bien nommé percentComplete vous indiquera la progression de la sauvegarde.

Remarque: sp_who2k5 devrait faire partie de la boîte à outils de tout le monde, il fait bien plus que cela.

10
Portman

J'ai trouvé cet exemple de script ici qui semble fonctionner assez 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')
204
Veldmuis

Si vous connaissez le sessionID, vous pouvez utiliser les éléments suivants:

SELECT * FROM sys.dm_exec_requests WHERE session_id = 62

Ou si vous voulez le réduire:

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

Voici un script simple qui fait généralement le tour pour moi:

SELECT command, percent_complete,total_elapsed_time, estimated_completion_time, start_time
  FROM sys.dm_exec_requests
  WHERE command IN ('RESTORE DATABASE','BACKUP DATABASE') 
6
Wilfred Kimani

Utilisez STATS dans la commande BACKUP s'il ne s'agit que d'un script.

Dans le code, c'est un peu plus compliqué. Dans ODBC, par exemple, vous définissez SQL_ATTR_ASYNC_ENABLE, recherchez le code retour SQL_STILL_EXECUTING et effectuez des appels répétés de SQLExecDirect jusqu'à l'obtention d'un SQL_SUCCESS (ou eqiv).

4
David L Morris
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
Shahbaz I Shaikh

Je pense que le meilleur moyen de connaître l'état d'avancement de votre restauration ou de votre sauvegarde est d'utiliser la requête suivante: 

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 requête ci-dessus identifie la session elle-même et effectue une progression en pourcentage chaque fois que vous appuyez sur la touche F5 ou Execute sur SSMS!

La requête a été effectuée par le gars qui a écrit ceci post

3
BMDaemon
3
Pavel Chuchuva

Script permettant de vérifier la progression de la sauvegarde et de la restauration dans SQL Server :

Il arrive souvent que votre activité de sauvegarde (ou de restauration) ait été démarrée par un autre administrateur de base de données ou par un travail et que vous ne puissiez plus utiliser l'interface graphique pour vérifier la progression de cette sauvegarde/restauration.

En combinant plusieurs commandes, j'ai généré le script ci-dessous qui peut nous donner un résumé des sauvegardes et des restaurations en cours sur le serveur.

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')
2
Kundan Dasange

Essayez avec:

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')
1
Zaalouni Mohamed

SELECT session_id en tant que SPID, commande, heure_début, pourcentage_complète, date_dernier (seconde, heure_complétion_estimé/1000, getdate ()) en tant que heure_accomplissement_estimé, a.text AS requête de sys.dm_exec_requests r CROSS APPLY sys.dm_exec_sql_text (r.sql_handle) commande dans ('BACKUP DATABASE', 'BACKUP LOG', 'RESTORE DATABASE', 'RESTORE LOG')

0
Ben

Pour ceux qui exécutent SQL Server sur RDS (AWS), il existe une procédure intégrée appelable dans la base de données msdb qui fournit des informations complètes sur toutes les tâches de sauvegarde et de restauration:

exec msdb.dbo.rds_task_status;

Cela donnera un aperçu complet de chaque tâche, sa configuration, des détails sur l'exécution (comme le pourcentage achevé et la durée totale), ainsi qu'une colonne task_info qui est extrêmement utile pour tenter de comprendre ce qui ne va pas avec une sauvegarde ou une restauration. .

0
bsplosion

Ajoutez STATS=10 ou STATS=1 dans la commande de sauvegarde.

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.
0
Zaalouni Mohamed

J'utilise sp_whoisactive, très informatif, essentiellement un standard de l'industrie. elle renvoie également le pourcentage terminé. 

0
RC Bird

Pour surveiller la progression de la sauvegarde ou de la restauration complètement distinct de la session où la sauvegarde ou la restauration a été lancée Aucun outil tiers requis. Testé sur Microsoft SQL Server 2012.

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