![SQL Server 2000 需要在执行并行迁移备份时阻止登录](https://linux22.com/image/507962/SQL%20Server%202000%20%E9%9C%80%E8%A6%81%E5%9C%A8%E6%89%A7%E8%A1%8C%E5%B9%B6%E8%A1%8C%E8%BF%81%E7%A7%BB%E5%A4%87%E4%BB%BD%E6%97%B6%E9%98%BB%E6%AD%A2%E7%99%BB%E5%BD%95.png)
我正在寻找一种方法来防止登录,以便对数据库进行完整备份,以便从其当前的 SQL Server 2000 实例迁移到新的 SQL 2005 实例。我的一个朋友建议运行一个脚本,该脚本将使数据库进入回滚状态。由于不是 DBA,我的 DDL 非常差,运行我不理解的脚本可能不是最好的主意。
一个可能更简单的选项是简单地分离并复制到新服务器。
任何建议将不胜感激。
答案1
分离/复制/附加会起作用。(不要留下 LDF 文件。它们很重要,即使有些人不这么认为,特别是当您强制快速关闭数据库时。如果日志未正确附加到新服务器,您可能会丢失数据。)
我有另一种选择,它使用了 SQL Server 中被忽视的“暂停”功能。
我发现,当有大量用户同时访问该数据库时,将数据库设置为单用户可能会出现问题。在我的连接之前,他们就成为了“单用户”。
如果您擅长使用查询窗口,而不是使用 SSMS GUI,那么我的方法效果最好。如果您使用集群,此方法可能效果不佳(我已经好几年没有尝试过了,我不记得结果了。您不想意外触发故障转移。)
此外,如果在同一 SQL Server 上生产的其他应用程序还有其他数据库,则此方法可能无法正常工作。
以管理员身份登录查询窗口。您将使用此连接杀死 spid(稍后),然后最后一次备份数据库。
暂停 SQL Server 服务。(在 SSMS 中,右键单击服务器图标或使用控制面板小程序或任何类似的服务控制程序。)
这将防止任何此实例的新登录,包括管理员连接、db_owner 连接和 SQL Agent 连接,但现有连接不会断开。服务器暂停时,连接尝试将失败并收到错误消息。您可能需要警告您的用户或支持团队。
- 使用 KILL 优雅地关闭用户应用程序和/或踢出常规用户的现有连接。这将为您编写 kill 命令,只需先更改/使用要迁移的数据库,然后运行以下命令:从 master.dbo.sysprocesses 中选择“kill”+ convert(varchar, spid),其中 spid != @@SPID 和 dbid = DB_ID()
然后将输出复制到查询窗口并运行它。它将终止当前数据库中除您的数据库之外的所有连接。
- 最后,运行备份命令,就像您要做的一样。
如果需要,您可以使用与“暂停”相同的菜单上的“恢复”来允许登录。在让人们重新登录之前,将旧数据库设置为只读或离线(最好)。(离线比只读更好,因为您希望在将连接字符串指向新服务器时忽略某些内容时人们会收到错误消息。删除数据库也会收到错误消息,但离线不是永久的。如果您必须返回旧服务器,只需在线更改数据库就很容易,但是如果您删除了数据库,则必须进行恢复。在确定迁移成功后,您可以随时在明天删除离线数据库。)
当然,您需要将备份恢复到要迁移到的服务器,修复任何 SQL 登录,然后修复应用程序的连接字符串或更改服务器的 DNS 条目,具体取决于您如何处理它,打开数据库校验和功能,对所有表运行完整的重新索引,更新数据库兼容性级别(如果合适)等等。
如果您是新手,或者这非常重要或者用户要求很高,我建议您至少先尝试一次试运行。您不需要将所有人都赶出去进行试运行,只需备份并在新服务器上恢复即可。执行恢复会迫使您弄清楚文件的位置(驱动器号和路径在不同的服务器上可能不同),并且可以让您了解恢复需要多长时间。(在实际操作时,如果您已经在新服务器上拥有数据库的副本,那么如果您使用“替换”进行恢复,通常会比从头开始恢复要快一些。这为您在向用户估计系统迁移将停机多长时间时提供了一些回旋余地。)
除非您只使用 Windows 登录,否则您需要在“实际”操作之前测试 SQL 登录是否有效。最好有一个模拟生产的测试系统,您可以先在其中解决“WTF?”问题,但并非每个人都有这样的奢侈。
答案2
有很多方法可以做到这一点,其中一些比其他方法更优雅:
分离、复制到新服务器、连接到新服务器、重新连接到当前服务器
将数据库置于单用户模式并备份
断开服务器上的网线
阻止对端口 1433 的传入连接
答案3
将数据库置于单用户模式将大有裨益。您需要立即在当前连接中进行备份,以防止在关闭连接并尝试使用企业管理器进行备份时其他连接重新接入。完成后,您还需要将数据库脱机。以下是使用 northwind 的示例。
use northwind
alter database northwind set single_user with rollback immediate
backup database northwind to disk='c:\northwind.bak' with init
use master
alter database northwind set offline