无法在SQL Server(单用户)中还原数据库

7

我正在尝试在我的SQL Server 2005 Express Edition中恢复数据库。我知道要恢复数据库,需要将其设置为单用户模式。我正在使用以下命令将其设置为单用户模式:

USE [master]
ALTER DATABASE database_name SET SINGLE_USER WITH ROLLBACK IMMEDIATE

这个命令已经成功执行了,我甚至可以在对象资源管理器中看到一个小图像,显示这现在是单用户数据库。

现在我正在尝试恢复数据库,按照以下步骤进行 ->右键单击数据库,选择任务,然后还原数据库。我选择备份文件所在的路径,然后单击还原。

但是我仍然遇到了这个错误“无法获得独占访问权限,因为数据库正在使用(microsoft.sqlserver.smo)。我有什么遗漏的吗?我已经谷歌过了,几乎所有的网站都建议将数据库置于单用户模式下,没有其他方法。

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

编辑:感谢答案。两个回答都建议我同样的答案,所以我选择了一个答案。

我甚至从选项中选择了覆盖现有数据库。

3个回答

4

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

其次,当您尝试运行还原时,设置数据库为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;来执行最后的步骤,使数据库可用(回滚未提交的事务等)。


3
您可以使用此脚本杀死使用数据库的所有进程,然后尝试再次恢复它:
declare @sql as varchar(20), @spid as int
select @spid = min(spid)  from master..sysprocesses  where dbid = db_id('<database_name>') 
and spid != @@spid    

while (@spid is not null)
begin
    print 'Killing process ' + cast(@spid as varchar) + ' ...'
    set @sql = 'kill ' + cast(@spid as varchar)
    exec (@sql)

    select 
        @spid = min(spid)  
    from 
        master..sysprocesses  
    where 
        dbid = db_id('<database_name>') 
        and spid != @@spid
end 

print 'Process completed...'

1
  • 在左侧列表的“常规”下方,找到“选项”项目。
  • 确保选中“覆盖现有数据库”(“恢复选项”部分)。

祝好运。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接