我正在寻找一种防止登录发生的方法,以便对数据库进行完整备份以从其当前的 SQL Server 2000 实例迁移到新的 SQL 2005 实例。我的一个朋友建议运行一个脚本,将数据库置于回滚状态。不是 DBA,我的 DDL 很差,运行我不理解的脚本可能不是最好的主意。
一种可能更容易的选择是简单地分离并复制到新服务器。
任何建议将不胜感激。
我正在寻找一种防止登录发生的方法,以便对数据库进行完整备份以从其当前的 SQL Server 2000 实例迁移到新的 SQL 2005 实例。我的一个朋友建议运行一个脚本,将数据库置于回滚状态。不是 DBA,我的 DDL 很差,运行我不理解的脚本可能不是最好的主意。
一种可能更容易的选择是简单地分离并复制到新服务器。
任何建议将不胜感激。
有很多方法可以做到这一点,其中一些比其他的更优雅:
分离、复制到新服务器、附加到新服务器、重新附加到当前服务器
将数据库置于单用户模式并备份
断开服务器上的网线
阻止到端口 1433 的传入连接
将数据库置于单用户模式将是一种享受。您需要立即在当前连接中进行备份,以防止在您关闭连接并尝试使用企业管理器进行备份时其他连接重新进入。完成后,您还希望使数据库脱机。这是使用北风的示例。
分离/复制/附加将起作用。(不要留下 LDF 文件。它们很重要,尽管有些人不这么认为,尤其是当您快速强制关闭数据库时。如果日志未正确附加到新服务器。)。
我还有另一种选择,它使用了 SQL Server 中被忽视的“暂停”功能。
我发现当您有很多用户跳入该数据库时,将数据库设置为单个用户可能会成为问题。在我连接之前,他们将成为“单一用户”。
如果您使用查询窗口而不是使用 SSMS GUI,那么我的方法效果最好。如果您使用的是集群,此方法可能效果不佳(我已经尝试了多年,我不记得结果。您不想意外触发故障转移。)
此外,如果在同一 SQL Server 上生产的其他应用程序还有其他数据库,则此方法可能无法正常工作。
以管理员身份登录查询窗口。您将使用此连接来杀死 spid(稍后),然后最后一次备份数据库。
暂停 SQL Server 服务。(在 SSMS 中,右键单击服务器图标或使用控制面板小程序或任何类似的服务控制程序。)
这将阻止对此实例的任何新登录,包括管理员连接、db_owner 连接和 SQL 代理连接,但不会删除现有连接。当服务器暂停时,连接尝试将失败并收到错误消息。您可能想要警告您的用户或支持团队。
然后将输出复制到您的查询窗口并运行它。它会杀死当前数据库中的每个连接,但你的。
如果需要,您可以在与“暂停”相同的菜单上使用“恢复”来允许在完成后登录。在让人们重新进入之前将旧数据库设置为只读或离线(最好)。(离线比只读更好,因为您希望人们在将连接字符串指向新数据库时忽略某些内容时收到错误消息服务器。删除数据库也会收到错误消息,但脱机不是永久的。如果您必须回到旧服务器,只需在线更改数据库很容易,但如果出现这种情况,您必须进行恢复您删除了数据库。在您确定迁移成功后,您明天可以随时删除脱机数据库。)
当然,您需要将备份恢复到要迁移到的服务器,修复任何 SQL 登录,然后修复应用程序的连接字符串或更改服务器的 DNS 条目,具体取决于您的处理方式,打开数据库校验和功能,对所有表运行完整的重新索引,更新数据库兼容性级别(如果合适的话)等等,等等。
如果您是新手,或者如果这特别重要或有苛刻的用户,我建议您先尝试至少一次试运行。您无需将所有人都踢出去进行空运行,只需备份并在新服务器上恢复即可。进行还原会迫使您确定文件的去向(驱动器号和路径在不同的服务器上可能不同),并让您了解还原需要多长时间。(如果是真的,如果您已经在新服务器上拥有数据库的副本,那么“使用替换”恢复通常比从头开始要快一点。这给您提供了一些回旋余地向用户估计系统将在迁移中关闭多长时间。)
除非您只使用 Windows 登录,否则您想在“真实”执行之前测试 SQL 登录是否有效。最好有一个模拟生产的测试系统,在那里你可以计算出你的“WTF”?首先是片刻,但不是每个人都有这种奢侈。