我想要一个单独的 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.
);
本质上,如果此查询返回零行,则目录处于空闲状态,我会执行还原。如果没有,那么恢复不会在那个时候发生。
我自己没有尝试过,但我认为你需要的功能是内置的,如果你在配置日志传送辅助时取消选中“在恢复备份时断开数据库中的用户”复选框。
查询效果很好。我在恢复工作中成功使用了它。没有任何进程在查询过程中被踢出数据库。