在恢复SQL Server数据库之前等待连接关闭

我有一个使用两个数据库的Web应用程序。 DB1用户执行他们的CRUD(创建,读取,更新,删除)操作。 数据库DB2是用于报告目的的不同服务器上的只读数据库。 每个小时,我的DB1都会保存事务日志,而在DB2上,我有一份工作可以在DB2上恢复它们​​以保持它最新。

我面临的问题是,如果有用户在DB2上运行报告(经常发生),他们会从sql服务器断开连接,因为我获得了独占访问来恢复数据库。 恢复每个日志所需的时间范围在1-4分钟之间。

我如何实现让我们称之为等待 - 恢复功能,在我的作业等待用户的查询完成之前,将数据库切换到独占访问并恢复日志?

我的两台机器都运行SQL Server 2008 64位标准版


我的问题的很大一部分是使用池连接 - 在这种情况下,即使没有报告执行连接保持活着。 我修改了我的连接字符串,将连接池设置为false,并在循环中检查与报表DB的开放用户连接,直到值为0.幸运的是,我不必创建触发器来将用户关闭。


您可能有一个alter database设置单用户或管理员模式,其中包含“WITH IMMEDIATE ROLLBACK”。 这就是踢出用户的原因。 拿出这个条款,它会等待他们离开(但不会阻止新来的)。

RE:你杀sProc:你可能想看看“WITH IMMEDIATE ROLLBACK”选项。

至于阻止新的连接:我过去做的是禁用应用程序用户的登录(服务器主体),等待长达10分钟检查每分钟,看看是否每个人都在外面。 之后,我执行ALTER DATABASE ...以立即ROLLBACK,然后进入任何需要执行的OPS功能。

我很幸运,因为Logins总是一次性使用应用程序用户登录(即仅用于此目的的SQL登录)。如果你不能这样做,那么我现在唯一能想到的其他事情就是拒绝对DB用户(数据库主体)的CONNECT权限。 然后再去掉DENY。 我从来没有这样做过,但它应该像这样:

DENY CONNECT TO SomeDBUserName;

我假设你的恢复工作正在发生。 那么你需要的是一个登录触发器。 以下是创建登录触发器的方法:

登录触发器

会话建立时触发登录触发器。 此时会引发LOGON事件。

登录触发器的生命周期非常简单:用户连接到Sql Server,触发器触发,隐式事务处于打开状态,然后由您决定! 如果出于任何原因想要拒绝登录到Sql Server的尝试,只需发出ROLLBACK语句即可完成。

以下是一个示例登录触发器:

USE master;
GO
CREATE LOGIN security_login WITH PASSWORD = 'P@ssw0rd'; 
GO
GRANT VIEW SERVER STATE TO security_login;
GO
CREATE TRIGGER connection_deny_trigger
ON ALL SERVER WITH EXECUTE AS 'security_login'
FOR LOGON
AS
BEGIN
<*Your conditional code goes here*>
    ROLLBACK;
END;

你可以定义你的工作来做到这一点:

  • 第1步:启用登录触发器
  • 第2步:在循环中检查打开的用户连接到您的报告数据库,直到值为0

    SELECT COUNT(*) from sysprocesses where spid in(
    SELECT session_id FROM sys.dm_exec_sessions WHERE is_user_process = 1) AND
    dbid= DB_ID('YourReportingDatabase')
    
  • 步骤3:将数据库设置为单个用户并恢复您的日志

  • 步骤4:将数据库重置为多用户并禁用登录触发器

  • 拉吉

    链接地址: http://www.djcxy.com/p/42733.html

    上一篇: Wait for connections to close before restoring SQL Server database

    下一篇: A reverse of Haversine formula for MySQL?