106

当我使用 MS SQL Server Management Studio 备份或恢复数据库时,我可以直观地看到该过程已经进行了多长时间,因此我还需要等待多长时间才能完成。如果我使用脚本启动备份或恢复,有没有办法监控进度,或者我只是坐下来等待它完成(希望没有出错?)

已编辑:我特别需要能够完全独立于启动备份或恢复的会话来监控备份或恢复进度。

4

17 回答 17

237

我在这里找到了这个示例脚本,它似乎运行良好:

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')
于 2008-09-30T10:08:50.780 回答
17

如果您知道 sessionID,那么您可以使用以下内容:

SELECT * FROM sys.dm_exec_requests WHERE session_id = 62

或者,如果您想缩小范围:

SELECT command, percent_complete, start_time FROM sys.dm_exec_requests WHERE session_id = 62
于 2012-06-30T00:31:58.133 回答
14

这是一个简单的脚本,通常对我有用:

SELECT command, percent_complete,total_elapsed_time, estimated_completion_time, start_time
  FROM sys.dm_exec_requests
  WHERE command IN ('RESTORE DATABASE','BACKUP DATABASE') 
于 2016-10-19T13:23:24.410 回答
12

是的。如果您已将sp_who2k5安装到您的 master 数据库中,您可以简单地运行:

sp_who2k5 1,1

结果集将包括所有活动事务。当前运行的备份将在requestCommand字段中包含字符串“BACKUP”。恰当命名的percentComplete字段将为您提供备份进度。

注意: sp_who2k5 应该是每个人工具包的一部分,它的作用远不止于此。

于 2008-10-01T03:22:35.117 回答
6

用于检查 SQL Server 中的备份和还原进度的脚本

很多时候,您的备份(或还原)活动已由另一个数据库管理员或作业启动,您无法使用 GUI 其他任何东西来检查该备份/还原的进度。

通过组合多个命令,我生成了下面的脚本,它可以为我们提供服务器上正在发生的当前备份和恢复的摘要。

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')
于 2018-03-12T20:29:51.287 回答
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')
于 2015-12-15T10:54:42.673 回答
5

试试看:

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')
于 2019-01-28T11:17:15.020 回答
4

如果它只是一个脚本,请在 BACKUP 命令中使用 STATS。

内部代码有点复杂。例如,在 ODBC 中,您设置 SQL_ATTR_ASYNC_ENABLE,然后查找 SQL_STILL_EXECUTING 返回码,并重复调用 SQLExecDirect,直到获得 SQL_SUCCESS(或 eqiv)。

于 2008-09-30T10:14:06.100 回答
3

使用 STATS 选项:http: //msdn.microsoft.com/en-us/library/ms186865.aspx

于 2008-09-30T10:06:28.960 回答
3

我认为了解还原或备份进度的最佳方法是通过以下查询:

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

上面的查询,每次按 F5 或 SSMS 上的执行按钮时,都会自行识别会话并执行百分比进度!

查询是由写这篇文章的人执行的

于 2017-04-11T18:13:22.203 回答
2

在备份命令中添加STATS=10或。STATS=1

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.
于 2019-01-28T11:20:18.910 回答
2

SELECT session_id as SPID, command, start_time, percent_complete, dateadd(second,estimated_completion_time/1000, getdate()) as estimate_completion_time, a.text AS Query FROM sys.dm_exec_requests r CROSS APPLY sys.dm_exec_sql_text(r.sql_handle) a WHERE r. ('备份数据库','备份日志','恢复数据库','恢复日志')中的命令

于 2019-06-15T10:42:58.130 回答
1

对于在 RDS (AWS) 上运行 SQL Server 的任何人,数据库中有一个可调用的内置过程msdb,它为所有备份和恢复任务提供全面的信息:

exec msdb.dbo.rds_task_status;

这将提供每个任务的完整概要、其配置、有关执行的详细信息(例如完成百分比和总持续时间),以及task_info在尝试找出备份或还原问题时非常有用的列。

于 2019-07-23T19:52:21.800 回答
1

在 MS SQL Server 2012 上进行数据库还原操作时,我遇到了类似的问题。

但是,对于我自己的场景,我只需要在脚本窗口中查看DATABASE RESTORE操作的进度

我所要做的就是在脚本中添加 STATS 选项:

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

然后我切换到Script 窗口的Messages选项卡,查看DATABASE RESTORE操作的进度:

在此处输入图像描述

如果您想在 DATABASE RESTORE 操作获取更多信息,可以使用eythort建议的以下命令:

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

就这样。

我希望这有帮助

于 2020-08-26T22:38:00.563 回答
0

完全独立于启动备份或恢复的会话来监控备份或恢复进度。无需第三方工具。在 Microsoft SQL Server 2012 上测试。

SELECT percent_complete, *
FROM sys.dm_exec_requests
WHERE command In ( 'RESTORE DATABASE', 'BACKUP DATABASE' )
于 2016-04-07T01:19:22.420 回答
0

我正在使用 sp_whoisactive,它提供了非常丰富的信息,是一个基本的行业标准。它也返回完成百分比。

于 2017-04-25T15:36:20.380 回答
-1

只需在主数据库上运行 bkp_status 即可获得备份状态

于 2017-07-05T03:46:53.213 回答