代码之家  ›  专栏  ›  技术社区  ›  eulerfx

优雅替换只读SQL Server数据库的最佳实践

  •  1
  • eulerfx  · 技术社区  · 16 年前

    我有一个只读数据库,其中缓存了用于在网站上显示页面的信息。有一些进程运行来生成数据库,而这些进程运行在不同的服务器上。当我需要更新实时数据库时,我会将此数据库还原到实时服务器,并将其还原为新的名称和文件。然后我删除了实时数据库,并将其重命名为原始名称。目前,我使用的是一个存储过程,它通过“sp_who”和“kill”终止所有连接,然后是drop database命令,然后是“sp_renamedb”。现在,当我终止所有连接时,它将在当前访问这些页面的人员和爬虫程序的站点上抛出一个错误,是否有更好的方法来执行此过程?

    4 回复  |  直到 16 年前
        1
  •  1
  •   Michael Sharek    16 年前

    您可能需要使用以下命令使实时数据库脱机:

    ALTER DATABASE name SET OFFLINE
    

    你可以读更多 here 但它说:

    上面的命令试图立即使命名数据库离线。如果用户或后台进程当前连接到数据库,则无法完成该命令。在这种情况下,alter database语句将被阻塞,并等待所有连接关闭。这样可以确保不会意外回滚任何事务。在阻塞期间,不允许与数据库建立新的连接。

    一旦数据库脱机,您应该能够安全地执行恢复/重命名操作,并在完成后使其恢复联机状态。当数据库处于脱机状态时,您可能需要进行一些游戏来查看允许的内容。

    如果在恢复/重命名处于脱机状态时遇到问题,您将希望在单用户模式下使其重新联机。

    在这种情况下,连接池或其他长时间运行的连接可能会导致问题。您可能需要设置一个脚本,以便在发出alter database set offline命令(例如15分钟)后等待一段时间,如果数据库仍不脱机,则可以使用不带等待选项重新发出该命令,以强制其脱机。

    如果这对您来说还不够强大,您还可以优雅地关闭SQL Server…这还需要等到服务器中的所有工作都完成后才能停止。

        2
  •  1
  •   Chris Teixeira    16 年前

    将数据生成服务器设置为发布服务器,将实时服务器设置为订阅服务器。客户机连接不会注意到任何事情。

        3
  •  0
  •   BenAlabaster    16 年前

    +1对于Mike Sharek-我喜欢您的解决方案,它非常整洁,可以防止用户突然断开连接(非常粗鲁)。

    另一种选择是,如果你不想坐在那里等用户注销几个小时。您可以通过构建在站点中的Ajax机制向连接的客户机发送警报,该站点基本上处于“打开”状态,并等待服务器发出的通知一段时间,然后超时并重新连接,因此实际上xmlhttp对象总是在等待响应。在接收响应时,它将在屏幕上显示它,然后打开另一个连接。然后有一个管理员界面,将消息推送到等待的Ajax组件。

    这将允许您以类似于Microsoft的Outlook Mobile Access工作方式的近似实时方式发送消息,允许用户在10分钟内收到通知,该网站将停机进行维护。

    我不确定是否有任何预构建的组件可以做到这一点,但我确信它不会太难实现。

    从即时的意义上讲,它并没有帮助你,但是它值得你为网站的未来版本考虑。

        4
  •  0
  •   Darryl Braaten    16 年前

    如果你想为你的用户做一些真正无缝的事情。我会这样做的。

    当您复制数据库的新版本时,根据您更新它的频率,给它一个新的名称,可能用日期时间命名。一旦它存在,告诉您的Web应用程序开始使用新的数据库。这可以通过更改web.config中的连接字符串或将其设置为配置数据库来完成。

    一旦经过一定的时间,根据站点的使用特性,删除旧的数据库。