首先,最好备份和恢复,而不是分离和附加。
其次,您用于将数据库设置为的会话很可能是SINGLE_USER
您尝试运行还原时仍然拥有它的会话(因为您使用的是 GUI,它在自己的会话下连接,所以它无法获得访问权)。
要么作为文本命令执行恢复,要么切换查询窗口以首先使用另一个数据库,例如 master。或者您可以关闭查询窗口,使其不再连接。
您可以随时查看谁与select * from master.dbo.sysprocesses
.
更新
假设您要恢复的数据库已经存在,并且如果您在磁盘上有一个备份文件(其中没有多个备份)并且在恢复完整备份后不需要恢复日志文件,那么通过脚本恢复是超级,超级简单:
RESTORE DATABASE DBName FROM DISK = 'C:\path\DBNameBackup.bak';
学习此语法将使您的生活更轻松,因为当您设置 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;
那里...你已经很容易地恢复了你的日志文件。您甚至可以使用WITH STOPAT
! 此外,如果您忘记并意外提交了最后一个日志恢复语句WITH NORECOVERY
,那么您只需发出RESTORE DATABASE DBName WITH RECOVERY;
执行最后步骤以使数据库可用(回滚未提交的事务等)。