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 SQL Server?


95

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'avancement du processus, et donc du temps qu'il me faut encore attendre pour qu'il se termine. Si je lance la sauvegarde ou la restauration avec un script, existe-t-il un moyen de surveiller la progression, ou est-ce que je m'assois et attend qu'elle se termine (en espérant que rien ne s'est mal passé?)

Modifié: Mon besoin est spécifiquement de pouvoir surveiller la progression de la sauvegarde ou de la restauration complètement indépendamment de la session où la sauvegarde ou la restauration a été lancée.

Réponses:


12

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 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 percentComplete, qui porte bien son nom , vous donnera 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.


Méfiez-vous des citations étranges dans le code de sp_who2k5 !! J'ai dû remplacer `` par '' pour que cela fonctionne
Dinglemeyer NeverGonnaGiveUUp

Je me rends compte que c'est un fil très ancien, mais le lien pour obtenir le proc stocké est mort.
John Waclawski

216

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

2
Le lien source fourni ne pointe plus vers l'article. Ceci est la mise à jour: sql-articles.com/scripts/estimated-time-for-backup-restore
Marien

Même si la restauration dure depuis 15 minutes, elle enregistre simplement 0% de progression. C'est une grande base de données (80 concerts). D'autres suggestions?
user64141

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

2
Il n'y a pas de lignes dans la sortie lorsque j'ai exécuté cette requête
goutam

1
Je pense que si vous ajoutez «RESTORE HEADERON» à la liste de la clause WHERE, vous obtiendrez également des progrès sur tous les travaux de vérification de sauvegarde exécutés par la suite.
goorj

16

Si vous connaissez le sessionID, vous pouvez utiliser ce qui suit:

SELECT * FROM sys.dm_exec_requests WHERE session_id = 62

Ou si vous souhaitez le réduire:

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

7
Cela a en fait bien fonctionné pour moi Commande SELECT, percent_complete, start_time FROM sys.dm_exec_requests où command = 'RESTORE DATABASE'
eythort

11

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

6

Script pour 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 vous ne pouvez pas utiliser l’interface graphique pour vérifier l’avancement 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 actuelles qui se produisent 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')

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

4

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, puis recherchez le code de retour SQL_STILL_EXECUTING et effectuez des appels répétés de SQLExecDirect jusqu'à ce que vous obteniez un SQL_SUCCESS (ou eqiv).


4

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

3

À moins que je ne manque quelque chose, cela me limite à obtenir les commentaires dans la même session que celle où je démarre la sauvegarde. Dans notre cas, nous lançons une restauration de base de données avec un fichier BAT programmé à 4 heures du matin et je souhaite me connecter au serveur 3 ou 4 heures plus tard et déterminer la progression.
Veldmuis

Je pense que vous pouvez rediriger la sortie du script vers le fichier journal, puis l'examiner de temps en temps.
Pavel Chuchuva

3

Je pense que le meilleur moyen de savoir comment votre restauration ou votre sauvegarde progresse est de 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, identifiez la session par elle-même et effectuez une progression en pourcentage chaque fois que vous appuyez sur F5 ou sur le bouton Exécuter sur SSMS!

La requête a été effectuée par le type qui a écrit ce message


2

Ajouter STATS=10ou STATS=1dans 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.

1

SELECT session_id as SPID, command, start_time, percent_complete, dateadd (second, estimation_completion_time / 1000, getdate ()) as estime_completion_time, a.text AS Query FROM sys.dm_exec_requests r CROSS APPLY sys.dm_exec_sql_text (r.sql_handle) a WHERE_handle. commande dans ('BACKUP DATABASE', 'BACKUP LOG', 'RESTORE DATABASE', 'RESTORE LOG')


1

Pour toute personne exécutant SQL Server sur RDS (AWS), il existe une procédure intégrée appelable dans la msdbbase de données 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 terminé et la durée totale) et une task_infocolonne extrêmement utile lorsque vous essayez de comprendre ce qui ne va pas avec une sauvegarde ou une restauration.


0

Pour surveiller la progression de la sauvegarde ou de la restauration indépendamment 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

J'utilise sp_whoisactive, très informatif, une norme essentiellement industrielle. il renvoie également un pourcentage achevé.


0

J'ai eu un problème similaire lorsque je travaillais sur une opération de restauration de base de données sur MS SQL Server 2012.

Cependant, pour mon propre scénario, j'avais juste besoin de voir la progression de l' opération DATABASE RESTORE dans la fenêtre de script

Tout ce que j'avais à faire était d'ajouter l'option STATS au script:

USE master;
GO

ALTER DATABASE mydb SET SINGLE_USER WITH ROLLBACK IMMEDIATE;
GO
    
RESTORE DATABASE mydb
    FROM DISK = 'C:\Program Files\Microsoft SQL Server\MSSQL12.MSSQLSERVER\MSSQL\Backup\my_db_21-08-2020.bak'
    WITH REPLACE,
         STATS = 10,
         RESTART,
    MOVE 'my_db' TO 'C:\Program Files\Microsoft SQL Server\MSSQL12.MSSQLSERVER\MSSQL\DATA\my_db.mdf',
    MOVE 'my_db_log' TO 'C:\Program Files\Microsoft SQL Server\MSSQL12.MSSQLSERVER\MSSQL\DATA\mydb_log.ldf'
GO
    
ALTER DATABASE mydb SET MULTI_USER;
GO

Et puis je suis passé à l' onglet Messages de la fenêtre Script pour voir la progression de l' opération DATABASE RESTORE :

entrez la description de l'image ici

Si vous souhaitez obtenir plus d'informations après l'opération DATABASE RESTORE, vous pouvez utiliser cette commande suggérée par eythort :

SELECT command, percent_complete, start_time FROM sys.dm_exec_requests where command = 'RESTORE DATABASE'

C'est tout.

J'espère que ça aide


-1

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

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.