Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 优雅替换只读SQL Server数据库的最佳实践_Sql Server_Database Restore - Fatal编程技术网

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

Sql server 优雅替换只读SQL Server数据库的最佳实践,sql-server,database-restore,Sql Server,Database Restore,我有一个只读数据库,其中缓存了用于在站点上显示页面的信息。有些进程运行以生成数据库,有些进程运行在不同的服务器上。当我需要更新live数据库时,我会将此数据库还原到live服务器,并使用新名称和文件。然后我删除live数据库并将其重命名为原始名称。目前,我使用一个存储过程来执行此操作,该存储过程通过'sp_who'和'kill',然后是drop database命令,然后是'sp_renamedb'终止所有连接。现在,当我关闭所有连接时,对于当前访问这些页面的用户和爬虫程序,它将在站点上抛出一个

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

您可能希望通过以下命令使实时数据库脱机:

ALTER DATABASE name SET OFFLINE
你可以读更多,但上面写着:

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

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

如果在脱机状态下执行恢复/重命名时遇到问题,则需要以单用户模式使其恢复联机

在这种情况下,连接池或其他长时间运行的连接可能会导致问题。您可能希望设置脚本,以便在发出ALTER DATABASE set OFFLINE命令后等待一段时间(例如15分钟),如果数据库尚未脱机,则可以使用with NO_wait选项重新发出该命令以强制其脱机


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

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

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

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

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


这并不能立即帮到你,但在你网站的未来版本中值得考虑。

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

当您复制数据库的新版本时,请为其指定一个新名称,可能使用datetime命名,具体取决于您更新数据库的频率。一旦它存在,告诉您的web应用程序开始使用新数据库。这可以通过更改web.config中的连接字符串或将其设置为配置数据库来实现


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

以数据生成服务器作为发布服务器,以live server作为订阅服务器,设置事务复制。客户端连接不会注意到任何东西。

请注意使用这种方法的连接池。连接可能保持打开状态,即使没有人实际执行任何操作。默认情况下,ADO.NET会进行连接池。这也意味着,希望在您的网站上进行购买或完成信息搜索的客户不会认为数据库在他们的会话期间已关闭。当然,这将意味着你坐在那里等待他们完成。