1

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

4

4 回答 4

1

您可能想要做的是使用以下命令使实时数据库脱机:

ALTER DATABASE name SET OFFLINE

你可以在这里阅读更多,但它说:

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

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

如果您在离线时无法进行恢复/重命名,您需要在单用户模式下将其恢复在线。

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

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

于 2008-12-16T19:07:18.250 回答
1

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

于 2008-12-16T19:42:29.347 回答
0

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

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

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

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

它并不能直接帮助您,但是对于您网站的未来版本值得考虑。

于 2008-12-16T19:19:00.473 回答
0

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

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

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

于 2008-12-16T19:33:41.457 回答