当我使用 MS SQL Server Management Studio 备份或恢复数据库时,我会直观地了解该过程的进展情况,以及我还需要等待多长时间才能完成。如果我使用脚本开始备份或恢复,有没有办法监控进度,或者我只是坐下来等待它完成(希望没有出现任何问题?)
编辑:我的具体需求是能够完全独立于启动备份或恢复的会话来监视备份或恢复进度。
我在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')
如果您知道 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,total_elapsed_time, estimated_completion_time, start_time
FROM sys.dm_exec_requests
WHERE command IN ('RESTORE DATABASE','BACKUP DATABASE')
是的。如果您已将 sp_who2k5 安装到主数据库中,则只需运行:
sp_who2k5 1,1
结果集将包括所有活动交易。当前运行的备份将在 requestCommand 字段中包含字符串“BACKUP”。恰当命名的 percentComplete 字段将为您提供备份进度。
注意:sp_who2k5 应该成为每个人工具包的一部分,它的作用远不止于此。
很多时候,您的备份(或恢复)活动已由另一个数据库管理员或某个作业启动,并且您无法使用 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')
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')
尝试一下:
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')
如果只是一个脚本,请在 BACKUP 命令中使用 STATS。
内部代码有点复杂。 例如,在 ODBC 中,您设置 SQL_ATTR_ASYNC_ENABLE,然后查找 SQL_STILL_EXECUTING 返回代码,并重复调用 SQLExecDirect 直到获得 SQL_SUCCESS(或 eqiv)。
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')
我认为了解恢复或备份进度的最佳方法是通过以下查询:
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 上的“执行”按钮时执行百分比进度!
该查询是由写此帖子
的人执行的在备份命令中添加
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.
对于在 RDS (AWS) 上运行 SQL Server 的任何人来说,msdb
数据库中有一个可调用的
内置过程,它为所有备份和恢复任务提供全面的信息:
exec msdb.dbo.rds_task_status;
这将提供每个任务的完整概要、其配置、有关执行的详细信息(例如完成的百分比和总持续时间)以及一个
task_info
列,这在尝试找出备份或恢复的问题时非常有用。
我在 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'
仅此而已。
我希望这有帮助
SELECT percent_complete, *
FROM sys.dm_exec_requests
WHERE command In ( 'RESTORE DATABASE', 'BACKUP DATABASE' )
exec msdb.dbo.rds_task_status;
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