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?

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

  •  02-07-2019
  •  | 
  •  

Question

Lorsque je sauvegarde ou restaure une base de données à l'aide de MS SQL Server Management Studio, je reçois une indication visuelle de l'état d'avancement du processus et donc 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.

Était-ce utile?

La solution

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

sp_who2k5 1,1

L'ensemble de résultats inclura toutes les transactions actives. La ou les sauvegardes en cours d'exécution contiendront la chaîne "BACKUP". dans le champ requestCommand . Le champ percentComplete , bien nommé, 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.

Autres conseils

J'ai trouvé cet exemple de script ici qui semble travaille plutôt 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 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

Voici un script simple qui fait généralement l'affaire 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') 

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

À l'intérieur du 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).

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

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

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 publier

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

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

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

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.

SELECT session_id comme SPID, commande, heure_début, pourcentage_complete,         dateadd (seconde, estimation_completion_time / 1000, getdate ()) comme estimation_completion_time,         Requête a.text AS A PARTIR DE sys.dm_exec_requests r CROSS APPLY sys.dm_exec_sql_text (r.sql_handle) a WHERE r.command in ('' BACKUP DATABASE '', 'BACKUP LOG', 'RESTORE DATABASE', 'RESTORE LOG' '

exécutez simplement bkp_status sur la base de données principale, vous obtiendrez le statut de sauvegarde

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top