这是在恢复日志之前等待空闲数据库目录的正确方法吗(对于 Sql Server 日志传送)?

这是在恢复日志之前等待空闲数据库目录的正确方法吗(对于 Sql Server 日志传送)?

我想有一个单独的 SQL Server 实例专门用于“报告”角色。我决定通过日志传送填充该服务器(因为镜像不起作用,而可用性组非常昂贵)。我已经弄清楚,我只需要按间隔备份事务日志,将它们复制到报告实例可以访问的位置,然后在目标实例上执行恢复。

我没有找到一个被广泛接受的解决方案,即无法在没有对目标目录的独占访问权的情况下恢复日志。我想经常刷新数据,但刷新过程要等待任何积极的最终用户正在运行的报告/查询;由于连接池的存在,您无法仅跟踪打开的连接。因此,我的解决方案的关键是能够确定数据库目录是否“繁忙”。我想出了这个查询,它列出了“活动”查询——我的进程应该等待的查询。有谁知道为什么不会可以工作吗,或者有人可以确认它是否可以工作?(例如,阻止信息是否与我已经检查的信息有关?)

SELECT USER_NAME(user_id) AS LoginName
    , DB_NAME(database_id) AS DbCat
    , blocking_session_id AS BlockedBy
    , open_transaction_count AS OpenTrans
    , status AS ExecStatus
    , cpu_time AS CpuTime
    , logical_reads AS LogicalReads
    , *
    FROM sys.dm_exec_requests
    WHERE session_id != @@SPID
        AND database_id = DB_ID()
        AND status != 'background' --always non-client activity; not something that should block log-shipping.
        AND (open_transaction_count > 0 --open transactions always need to be waited on
            OR status != 'sleeping' --sleeping=idle, except when there's an open transaction.
        );

本质上,如果此查询返回零行,则目录处于空闲状态,我会执行恢复。如果没有,则这次不会发生恢复。

答案1

我自己没有尝试过,但我认为您需要的功能是内置的,如果您在配置日志传送辅助时取消选中“在恢复备份时断开数据库中的用户连接”复选框。

在此处输入图片描述

答案2

查询效果很好。我成功地在恢复作业中使用它。在查询过程中,从未有任何进程被踢出数据库。

相关内容