SQL-Server:是否有 SQL 脚本可用于确定 SQL Server 备份或还原过程的进度?

问题描述 投票:0回答:19

当我使用 MS SQL Server Management Studio 备份或恢复数据库时,我会直观地了解该过程的进展情况,以及我还需要等待多长时间才能完成。如果我使用脚本开始备份或恢复,有没有办法监控进度,或者我只是坐下来等待它完成(希望没有出现任何问题?)

编辑:我的具体需求是能够完全独立于启动备份或恢复的会话来监视备份或恢复进度。

sql-server backup restore
19个回答
260
投票

我在here找到了这个示例脚本,它似乎运行得很好:

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

18
投票

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

17
投票

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

SELECT command, percent_complete,total_elapsed_time, estimated_completion_time, start_time
  FROM sys.dm_exec_requests
  WHERE command IN ('RESTORE DATABASE','BACKUP DATABASE') 

13
投票

是的。如果您已将 sp_who2k5 安装到主数据库中,则只需运行:

sp_who2k5 1,1

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

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


7
投票

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

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

4
投票

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

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


4
投票
SELECT  session_id as SPID, command, start_time, percent_complete,
        dateadd(second,estimated_completion_time/1000, getdate()) as estimated_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.command in ('BACKUP DATABASE', 'BACKUP LOG', 'RESTORE DATABASE', 'RESTORE LOG')


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 上的“执行”按钮时执行百分比进度!

该查询是由写此帖子

的人执行的

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.

1
投票

对于在 RDS (AWS) 上运行 SQL Server 的任何人来说,msdb数据库中有一个可调用的

内置过程
,它为所有备份和恢复任务提供全面的信息:

exec msdb.dbo.rds_task_status;

这将提供每个任务的完整概要、其配置、有关执行的详细信息(例如完成的百分比和总持续时间)以及一个

task_info
列,这在尝试找出备份或恢复的问题时非常有用。


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

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

enter image description here

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

SELECT command, percent_complete, start_time FROM sys.dm_exec_requests where command = 'RESTORE DATABASE'
仅此而已。

我希望这有帮助


0
投票
监控备份或恢复进度,与启动备份或恢复的会话完全分开。无需第三方工具。在 Microsoft SQL Server 2012 上测试。

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

0
投票
我正在使用 sp_whoisactive,信息非常丰富,基本上是行业标准。它也返回完成百分比。


0
投票
您可以运行以下命令来获取有关 MS SQL 恢复进度的详细报告 -

exec msdb.dbo.rds_task_status;


    


0
投票
我喜欢下面的脚本来监视备份或任何一般发生的事情(不适用于监视加密/解密)。 我从比我更聪明的人那里复制了它,并做了相当明显的调整以获得完成估计时间。

SELECT percent_complete,estimated_completion_time/(1000*60) AS EstimatedCompletionTimeInMinutes ,r.start_time [Start Time],session_ID [SPID], DB_NAME(database_id) [Database], SUBSTRING(t.text,(r.statement_start_offset/2)+1, CASE WHEN statement_end_offset=-1 OR statement_end_offset=0 THEN (DATALENGTH(t.Text)-r.statement_start_offset/2)+1 ELSE (r.statement_end_offset-r.statement_start_offset)/2+1 END) [Executing SQL], Status,command,wait_type,wait_time,wait_resource, last_wait_type FROM sys.dm_exec_requests r OUTER APPLY sys.dm_exec_sql_text(sql_handle) t WHERE session_id != @@SPID -- don't show this query AND session_id > 50 -- don't show system queries ORDER BY r.start_time
    

-1
投票
只需在主数据库上运行 bkp_status 您将获得备份状态

© www.soinside.com 2019 - 2024. All rights reserved.