我想有一个单独的 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
查询效果很好。我成功地在恢复作业中使用它。在查询过程中,从未有任何进程被踢出数据库。