在备份\还原期间解析备份\还原路径和文件名

时间:2018-11-13 15:47:22

标签: tsql database-backups database-restore

我正在编写一个Web应用程序,用于监视备份和还原的过程。我被要求添加到其中的一种方式是显示备份\还原路径和文件名 正在发生 。 我当然能够获得在备份\还原期间运行的命令行,所以我想做的就是从该命令行中提取路径和文件名。 因此,使用我当前的代码,我可以自己获得回报:

BACKUP DATABASE [DatabaseName] TO DISK = N'\\nas01\sqlbackups$\ServerName\DatabaseName.bak'   WITH NOFORMAT,   INIT,   NAME = N'DatabaeName-Full Database Backup',   SKIP,   NOREWIND,   NOUNLOAD,   STATS = 10  

我想从中提取的是 \\ nas01 \ sqlbackups $ \ ServerName \ DatabaseName.bak

如果不从代码中提取代码,是否有办法从另一个正在运行的表 中获取它?

这是我运行以获取当前备份\还原状态的代码:

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.total_elapsed_time / 1000.0 / 60.0 / 60.0) AS [Elapsed Hours]
,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 [TSQLCode]    
        FROM sys.dm_exec_requests r 
WHERE command IN (
    'RESTORE DATABASE'
    ,'BACKUP DATABASE'
    ,'BACKUP LOG'
    ,'RESTORE LOG'
    )

1 个答案:

答案 0 :(得分:0)

我可以肯定,但是我认为Backup History可以向您显示有关正在进行的备份的信息。不过,您可以尝试。否则,您可以尝试解析命令文本。首先删除“ TO DISK”之前的文本,找到第一和第二个引号,然后得到它们之间的文本。使用如下代码:

declare @cmd nvarchar(max) = N'BACKUP DATABASE [DatabaseName] TO DISK = N''\\nas01\sqlbackups$\ServerName\DatabaseName.bak''   WITH NOFORMAT,   INIT,   NAME = N''DatabaeName-Full Database Backup'',   SKIP,   NOREWIND,   NOUNLOAD,   STATS = 10  '

-- Remove the text before "TO DISK"
set @cmd = SUBSTRING(@cmd, PATINDEX(N'%TO DISK%', @cmd), LEN(@cmd))
print @cmd
-- Remove the text before and including the first quote
set @cmd = SUBSTRING(@cmd, PATINDEX(N'%''%', @cmd) + 1, LEN(@cmd))
print @cmd
-- Get the text from the start to the next quote
set @cmd = SUBSTRING(@cmd, 1, PATINDEX(N'%''%', @cmd) - 1)
print @cmd