dbcc checkdb('XYZ', REPAIR_ALLOW_DATA_LOSS) 表示 XYZ 已打开,并且一次只能有一个用户

dbcc checkdb('XYZ', REPAIR_ALLOW_DATA_LOSS) 表示 XYZ 已打开,并且一次只能有一个用户

我有一个数据库,XYZ,它的日志文件损坏了,现在由于日志文件完全无法使用,这导致这个特定的数据库无法使用,我需要重建它。

我已经对这个过程进行了大量研究,但是在 dbcc checkdb 上遇到了困难。

我运行了命令

alter database xyz SET single_user with immediate rollback

随后

use master
dbcc checkdb('xyz',REPAIR_ALLOW_DATA_LOSS)

但我一直遇到这个错误:

Msg 924, Level 14, State 1, Line 2
Database 'XYZ' is already open and can only have one user at a time.

我研究过的所有信息都表明数据库需要处于紧急模式,然后数据库需要处于单用户模式。如果我将数据库恢复为多用户模式,则表明数据库需要处于单用户模式。好吧,我这样做了,然后遇到了这个问题。

我已经跑了

select spid from master..sysprocesses where dbid = DB_ID('XYZ') and spid <> @@spid

检查是否有任何进程正在使用数据库,但没有返回任何行,日志也没有显示有关数据库正在恢复或任何此类信息。数据库确实显示为“紧急”。

有任何想法吗?

答案1

将数据库恢复为多用户模式并尝试以下操作。

alter database xyz SET single_user with rollback immediate 

dbcc checkdb('xyz',REPAIR_ALLOW_DATA_LOSS)

很可能在您进入之前,另一个进程正在获取数据库连接。结合这两个语句应该可以确保您获得该连接。

答案2

级别 14 属于权限被拒绝。这意味着您无法访问数据库,因为有人正在使用它。

您可以使用sp_who它提供有关 Microsoft SQL Server 数据库引擎实例中的当前用户、会话和进程的信息。

之后,您可以将数据库设置为单用户模式并执行修复操作。在对数据库执行任何操作之前,请复制数据库。

如果你打算使用“修复允许数据丢失”选项,那么你必须非常小心。这应该是修复损坏的最后手段。

相关内容