是否可以使用SQL脚本确定SQL Server备份或还原过程的进度?


94

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

编辑:我特别需要能够独立于启动备份或还原的会话来监视备份或还原进度。

Answers:


12

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

sp_who2k5 1,1

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

注意:sp_who2k5应该成为每个人工具包的一部分,它不仅要做很多。


当心sp_who2k5代码中奇怪的引号!必须用'代替'
才能使它

我意识到这是一个非常旧的线程,但是获取存储的proc的链接已死。
John Waclawski

216

我在这里发现此示例脚本似乎运行良好:

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
提供的源链接不再指向该文章。这是更新的版本:sql-articles.com/scripts/estimated-time-for-backup-restore
Marien

即使还原已经进行了15分钟,它仅记录了0%的进度。这是一个大型数据库(80个演出)。还有其他建议吗?
user64141

5
@ user63141; 还原从文件分配开始。如果您尚未执行任何操作,则不允许即时文件初始化(请参阅msdn.microsoft.com/en-us/library/ms175935.aspx)。这可能需要相当长一段时间,如果你有旧的磁盘或大型数据库
亨里克Staun波尔森

2
当我执行此查询时,输出中没有行
goutam

1
我认为,如果将“ RESTORE HEADERON”添加到WHERE子句中的列表中,那么以后在运行任何备份验证作业时也会获得进展。
goorj

16

如果您知道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

6
这实际上对我来说效果很好SELECT命令,percent_complete,start_time FROM sys.dm_exec_requests,其中命令=“ RESTORE DATABASE”
eythort,2015年

10

这是一个简单的脚本,通常可以帮我解决问题:

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

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

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

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

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


4

尝试wih:

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

除非我缺少任何内容,否则这将限制我在与开始备份的会话相同的会话中获得反馈。在我们的案例中,我们从凌晨4点开始使用计划的BAT文件启动数据库还原,我想在3或4小时后连接到服务器并确定进度。
Veldmuis

我认为您可以将脚本输出重定向到日志文件,然后不时检查它。
帕维尔·楚楚瓦

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

上面的查询,每次您按SS5上的F5或Execute按钮时,就可以自行识别会话并执行百分比进度!

该查询是由撰写此帖子的人执行的


1

在备份命令中添加STATS=10STATS=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.

1

SELECT session_id作为SPID,命令,start_time,percent_complete,dateadd(second,estimated_completion_time / 1000,getdate())作为estimate_completion_time,从sys.dm_exec_requests中查询文本AS。命令(“ BACKUP DATABASE”,“ BACKUP LOG”,“ RESTORE DATABASE”,“ RESTORE LOG”)


1

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

exec msdb.dbo.rds_task_status;

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


0

要监视备份或还原进度,与启动备份或还原的会话完全分开。无需第三方工具。在Microsoft SQL Server 2012上测试。

SELECT percent_complete, *
FROM sys.dm_exec_requests
WHERE command In ( 'RESTORE DATABASE', 'BACKUP DATABASE' )

0

我正在使用sp_whoisactive,非常有用的基本行业标准。它也返回完成百分比。


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.