无法在sql server中恢复数据库(single_user)

use*_*693 7 sql-server sql-server-2005-express

我正在尝试在我的sql server 2005 express版中恢复数据库.我知道要恢复数据库,我需要让它成为单个用户.我给这个命令让它成为单个用户

USE [master]
ALTER DATABASE database_name SET SINGLE_USER WITH ROLLBACK IMMEDIATE
Run Code Online (Sandbox Code Playgroud)

这个命令执行得很正常,我甚至可以在这个数据库的对象资源管理器中看到一个小图像,显示这个现在是单个用户.

现在我尝试通过以下步骤恢复数据库 - >右键单击数据库和任务,然后恢复数据库.我正在选择备份文件所在的路径,然后单击"还原".

但我仍然得到这个错误"因为数据库正在使用中无法获得独占访问权限(microsoft.sqlserver.smo).我错过了什么.我用Google搜索了所有网站,并且所有网站都建议数据库需要在单个用户中模式,没有别的.

我没有尝试分离和附加数据库方法.我以前从未这样做过,想知道这样做是否安全.

编辑:谢谢你的答案.两个人都建议我回答相同,所以我选择了一个答案.

我甚至选择从选项覆盖现有数据库.

Eri*_*ikE 4

首先,最好进行备份和恢复,而不是分离和附加。

其次,您用来设置数据库的会话很可能是SINGLE_USER在您尝试运行恢复时仍然拥有该数据库的会话(因为您使用的是 GUI,它在自己的会话下连接,因此无法获得访问权限)。

要么作为文本命令进行恢复,要么切换查询窗口以首先使用另一个数据库,例如 master。或者您可以关闭查询窗口,使其不再连接。

您可以随时查看谁与 联系select * from master.dbo.sysprocesses

更新

假设您要恢复的数据库已经存在,并且磁盘上只有一个备份文件(其中没有多个备份)并且恢复完整备份后不需要恢复日志文件,那么通过脚本恢复是超级,超级简单:

RESTORE DATABASE DBName FROM DISK = 'C:\path\DBNameBackup.bak';
Run Code Online (Sandbox Code Playgroud)

学习此语法将使您的生活更轻松,因为当您设置 SINGLE_USER 时,您已经处于连接的唯一会话中。另外,我发现输入恢复命令比使用 GUI 更快,而且我喜欢对事物的控制。重复这一点最终会在你的脑海中巩固它,你不必再查找语法了。

恢复日志文件甚至没有那么困难。只需记住一件简单的事情WITH NORECOVERY

RESTORE DATABASE DBName FROM DISK = 'C:\path\DBNameBackup.bak' WITH NORECOVERY;
RESTORE LOG DBName FROM DISK = 'C:\path\DBNameBackup1.log' WITH NORECOVERY;
RESTORE LOG DBName FROM DISK = 'C:\path\DBNameBackup2.log' WITH NORECOVERY;
RESTORE LOG DBName FROM DISK = 'C:\path\DBNameBackup3.log' WITH NORECOVERY;
... 4 5 6 7 and so on
RESTORE LOG DBName FROM DISK = 'C:\path\DBNameBackupX.log' WITH RECOVERY;
Run Code Online (Sandbox Code Playgroud)

在那里...您已经非常轻松地恢复了日志文件。您甚至可以使用 ! 恢复到准确的时间点WITH STOPAT!另外,如果您忘记并意外提交了最后一个日志恢复语句WITH NORECOVERY,那么您只需RESTORE DATABASE DBName WITH RECOVERY;执行最后的步骤以使数据库可用(回滚未提交的事务等)。