【问题标题】:SQL-Server: Is there a SQL script that I can use to determine the progress of a SQL Server backup or restore process?SQL-Server:是否有可用于确定 SQL Server 备份或还原过程进度的 SQL 脚本?
【发布时间】:2010-09-14 05:24:48
【问题描述】:

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

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

【问题讨论】:

    标签: sql-server backup restore


    【解决方案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操作的进度:

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

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

    就是这样。

    我希望这会有所帮助

    【讨论】:

      【解决方案2】:

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

      exec msdb.dbo.rds_task_status;
      

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

      【讨论】:

        【解决方案3】:

        选择 session_id 作为 SPID、命令、start_time、percent_complete、 dateadd(second,estimated_completion_time/1000, getdate()) as estimated_completion_time, a.text AS查询 FROM sys.dm_exec_requests r 交叉应用 sys.dm_exec_sql_text(r.sql_handle) a WHERE r.command in ('BACKUP DATABASE', 'BACKUP LOG', 'RESTORE DATABASE', 'RESTORE LOG')

        【讨论】:

          【解决方案4】:

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

          【讨论】:

            【解决方案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')
            

            【讨论】:

              【解决方案6】:

              Script to check the Backup and Restore progress in 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')
              

              【讨论】:

                【解决方案7】:

                我发现这个示例脚本 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')
                

                【讨论】:

                • 提供的源链接不再指向该文章。这是更新的:sql-articles.com/scripts/estimated-time-for-backup-restore
                • 即使恢复已经进行了 15 分钟,它也只记录了 0% 的进度。这是一个大型数据库(80 gigs)。还有其他建议吗?
                • @user63141;恢复从文件分配开始。如果您没有执行任何操作,则不允许进行即时文件初始化(请参阅msdn.microsoft.com/en-us/library/ms175935.aspx)。如果您有旧磁盘或大型数据库,这可能需要很长时间
                • 执行此查询时输出中没有行
                • 我认为,如果您将“RESTORE HEADERON”添加到 WHERE 子句的列表中,那么之后运行的任何备份验证作业也会取得进展。
                【解决方案8】:

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

                【讨论】:

                  【解决方案9】:

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

                  【讨论】:

                    【解决方案10】:

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

                    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 上的 Execute 按钮时自行识别会话并执行百分比进度!

                    查询是由写这个post的人执行的

                    【讨论】:

                      【解决方案11】:

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

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

                      【讨论】:

                        【解决方案12】:

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

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

                          【讨论】:

                            【解决方案14】:

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

                            【讨论】:

                            • 这实际上对我很有效 SELECT command, percent_complete, start_time FROM sys.dm_exec_requests where command = 'RESTORE DATABASE'
                            【解决方案15】:

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

                            sp_who2k5 1,1
                            

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

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

                            【讨论】:

                            • 当心 sp_who2k5 代码中的奇怪引号!必须将 ' 替换为 ' 才能正常工作
                            • 我意识到这是一个非常古老的线程,但是获取存储过程的链接已经失效。
                            【解决方案16】:

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

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

                            【讨论】:

                              【解决方案17】:

                              【讨论】:

                              • 除非我遗漏了什么,否则这会限制我在与我开始备份的会话相同的会话中获得反馈。在我们的例子中,我们在凌晨 4 点开始使用预定的 BAT 文件进行数据库恢复,我想在 3 或 4 小时后连接到服务器并确定进度。
                              • 我认为你可以将脚本输出重定向到日志文件,然后不时检查。
                              猜你喜欢
                              • 2013-03-25
                              • 1970-01-01
                              • 2010-12-12
                              • 2014-01-14
                              • 1970-01-01
                              • 1970-01-01
                              • 1970-01-01
                              • 1970-01-01
                              • 1970-01-01
                              相关资源
                              最近更新 更多