【发布时间】:2010-09-14 05:24:48
【问题描述】:
当我使用 MS SQL Server Management Studio 备份或恢复数据库时,我可以直观地看到进程的进度,以及我还需要等待多长时间才能完成。如果我使用脚本启动备份或恢复,有没有办法监控进度,或者我只是坐下来等待它完成(希望没有任何问题?)
已编辑:我特别需要能够完全独立于启动备份或恢复的会话来监控备份或恢复进度。
【问题讨论】:
标签: sql-server backup restore
当我使用 MS SQL Server Management Studio 备份或恢复数据库时,我可以直观地看到进程的进度,以及我还需要等待多长时间才能完成。如果我使用脚本启动备份或恢复,有没有办法监控进度,或者我只是坐下来等待它完成(希望没有任何问题?)
已编辑:我特别需要能够完全独立于启动备份或恢复的会话来监控备份或恢复进度。
【问题讨论】:
标签: sql-server backup restore
在 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'
就是这样。
我希望这会有所帮助
【讨论】:
对于在 RDS (AWS) 上运行 SQL Server 的任何人,msdb 数据库中有一个可调用的 built-in procedure 为所有备份和恢复任务提供全面的信息:
exec msdb.dbo.rds_task_status;
这将提供每个任务的完整概要、其配置、有关执行的详细信息(例如完成百分比和总持续时间),以及一个 task_info 列,这在尝试找出备份或问题的问题时非常有用恢复。
【讨论】:
选择 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')
【讨论】:
在备份命令中添加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.
【讨论】:
试试看:
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')
【讨论】:
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')
【讨论】:
我发现这个示例脚本 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')
【讨论】:
只需在主数据库上运行 bkp_status 即可获得备份状态
【讨论】:
我正在使用 sp_whoisactive,它提供了非常丰富的信息,基本上是行业标准。它也返回完成百分比。
【讨论】:
我认为了解还原或备份进度的最佳方法是通过以下查询:
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的人执行的
【讨论】:
完全独立于启动备份或恢复的会话来监控备份或恢复进度。无需第三方工具。在 Microsoft SQL Server 2012 上测试。
SELECT percent_complete, *
FROM sys.dm_exec_requests
WHERE command In ( 'RESTORE DATABASE', 'BACKUP DATABASE' )
【讨论】:
这是一个简单的脚本,通常对我有用:
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 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')
【讨论】:
如果您知道 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
【讨论】:
是的。如果您已将sp_who2k5 安装到您的主数据库中,您可以简单地运行:
sp_who2k5 1,1
结果集将包括所有活动事务。当前运行的备份将在 requestCommand 字段中包含字符串“BACKUP”。恰当命名的 percentComplete 字段将为您提供备份进度。
注意:sp_who2k5 应该是每个人的工具包的一部分,它的作用远不止这些。
【讨论】:
如果只是一个脚本,请在 BACKUP 命令中使用 STATS。
内部代码有点复杂。例如,在 ODBC 中,您设置 SQL_ATTR_ASYNC_ENABLE,然后查找 SQL_STILL_EXECUTING 返回码,并重复调用 SQLExecDirect,直到获得 SQL_SUCCESS(或 eqiv)。
【讨论】:
【讨论】: