我正在寻找一种方法来防止发生login,以便对数据库进行完全备份,以从当前的SQL Server 2000实例迁移到新的SQL 2005实例。 我的一个朋友build议运行一个脚本,使数据库进入回滚状态。 不是DBA,我的DDL非常差,运行我不明白的脚本可能不是最好的主意。
一个可能更容易的select是简单地分离和复制到新的服务器。
任何build议将不胜感激。
分离/复制/附加将工作。 (不要把LDF文件放在后面,即使有些人不这么认为,尤其是当你迫使数据库快速closures的时候,它们是很重要的,如果日志没有正确的连接到新服务器)。
我有另一个使用SQL Server的被忽视的“暂停”function的替代scheme。
我发现,当你有很多用户跳入这个数据库时,将数据库设置为单个用户可能会成为一个问题。 他们成为连接之前的“单一用户”。
如果您在查询窗口方便,而不是使用SSMS GUI,我的方法效果最好。 如果你正在使用一个集群,这种方法可能无法正常工作(我已经尝试了好几年了,而且我不记得结果,你不想意外地触发故障切换)。
另外,如果在同一个SQL Server上生产其他应用程序的其他数据库,则此方法可能无法正常工作。
以pipe理员身份login到查询窗口。 你将使用这个连接来杀死spids(一会儿),然后备份上次的数据库。
暂停SQL Server服务。 (在SSMS中,右键单击服务器图标或使用控制面板小程序或任何类似的服务控制程序。)
这将阻止任何新的login到这个实例,包括pipe理员连接,db_owner连接和SQL代理连接, 但现有的连接不会被删除。 服务器暂停时,尝试连接将失败,并收到错误消息。 您可能要警告您的用户或支持团队。
然后将输出复制到您的查询窗口并运行它。 它会杀死当前数据库中的每个连接,但你的。
如果需要,您可以在“暂停”相同的菜单上使用“恢复”,以便在完成后允许login。 将旧数据库设置为只读或脱机状态(最好是),然后再让其他人重新启动。(脱机比只读更好,因为您希望人们在连接string指向新的时候忽略了某些内容服务器,删除数据库也会得到你的错误信息,但是离线不是永久的,如果你必须回到旧的服务器,只要简单的改变在线数据库就行了,但是你必须经过恢复你放弃了数据库,在你确定你的迁移成功之后,你总是可以放弃离线数据库。)
当然,您需要将备份恢复到要迁移到的服务器,修复任何SQLlogin,然后修复应用程序的连接string或更改服务器的DNS条目,具体取决于您如何处理,启用数据库校验和function,在所有表上运行完全重新索引,更新数据库兼容级别(如果适用)等。
如果你是新手,或者如果这是特别重要的或者要求用户的话,我会build议至less尝试一次空转。 您不需要将所有人都踢出去,只需要进行备份并在新的服务器上恢复。 进行还原会强制您计算出文件的位置(驱动器号和path在不同的服务器上可能不同),并让您了解执行还原所需的时间。 (当真实的时候,如果你已经在新的服务器上有一个数据库的副本,如果你正在用“replace”来恢复,通常比从头开始恢复要快一些,这给了你一些摆动的空间向用户估计系统将迁移多长时间。)
除非您只使用Windowslogin,否则您需要先testing一下SQLlogin在“真实”之前的工作情况。 如果您有一个模仿生产的testing系统,那么您可以在哪里制定出“WTF”? 首先,但不是每个人都有这种奢侈。
有很多方法可以做到这一点,比其他方式更优雅:
分离,复制到新服务器,附加在新服务器上,重新附加在当前服务器上
将数据库置于单用户模式并备份
断开服务器上的网线
阻止传入连接到端口1433
将数据库放入单用户模式将会起作用。 您需要立即在当前连接中进行备份,以防止在closures连接时尝试使用企业pipe理器进行备份的其他连接重新启动。 完成后,您还希望将数据库脱机。 这是一个使用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