116 votes

SQL-Server : Existe-t-il un script SQL que je peux utiliser pour déterminer la progression d'un processus de sauvegarde ou de restauration de 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 donc du temps qu'il me reste à 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 la progression, ou dois-je simplement m'asseoir et attendre qu'elle se termine (en espérant que rien ne s'est mal passé ?).

Édité : Mon besoin est spécifiquement de pouvoir surveiller la progression de la sauvegarde ou de la restauration de manière complètement distincte de la session où la sauvegarde ou la restauration a été initiée.

260voto

Veldmuis Points 1380

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

2 votes

Le lien source fourni ne pointe plus vers l'article. C'est celui qui a été mis à jour : sql-articles.com/scripts/estimated-time-for-backup-restore

0 votes

Même si la restauration est en cours depuis 15 minutes, il enregistre simplement une progression de 0 %. Il s'agit d'une grande base de données (80 gigas). Avez-vous d'autres suggestions ?

6 votes

@user63141 ; la restauration commence par une allocation de fichier. Si vous n'avez rien fait, alors l'initialisation instantanée du fichier n'est pas autorisée (voir msdn.microsoft.com/fr/us/library/ms175935.aspx ). Cela peut prendre un certain temps si vous avez de vieux disques ou une grande base de données.

18voto

Allen Points 41

Si vous connaissez l'ID de la session, vous pouvez utiliser la méthode suivante :

SELECT * FROM sys.dm_exec_requests WHERE session_id = 62

Ou si vous voulez réduire la liste :

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

7 votes

Cette méthode a bien fonctionné pour moi : SELECT command, percent_complete, start_time FROM sys.dm_exec_requests where command = 'RESTORE DATABASE'.

13voto

Portman Points 15878

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

sp_who2k5 1,1

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

Note : sp_who2k5 devrait faire partie de la boîte à outils de chacun, il fait beaucoup plus que cela.

0 votes

Attention aux guillemets bizarres dans le code de sp_who2k5 ! !! J'ai dû remplacer ' par ' pour que cela fonctionne.

0 votes

Je réalise que c'est un très vieux fil mais le lien pour obtenir la procédure stockée est mort.

4voto

David L Morris Points 917

Utilisez STATS dans la commande BACKUP si c'est juste un script.

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

3voto

Pavel Chuchuva Points 12220

0 votes

Sauf erreur de ma part, cela me limite à obtenir le retour d'information dans la même session que celle où je lance la sauvegarde. Dans notre cas, nous lançons une restauration de base de données avec un fichier BAT planifié à 4 heures du matin et je veux me connecter au serveur 3 ou 4 heures plus tard pour déterminer la progression.

0 votes

Je pense que vous pouvez rediriger la sortie script vers le fichier journal et l'examiner de temps en temps.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X