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.
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.
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')
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 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')
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).
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')
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
Utilisez l'option STATS: http://msdn.Microsoft.com/en-us/library/ms186865.aspx
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')
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')
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')
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. .
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.
J'utilise sp_whoisactive, très informatif, essentiellement un standard de l'industrie. elle renvoie également le pourcentage terminé.
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' )