![dbcc checkdb('XYZ', REPAIR_ALLOW_DATA_LOSS) 表示 XYZ 已打开,并且一次只能有一个用户](https://linux22.com/image/804173/dbcc%20checkdb('XYZ'%2C%20REPAIR_ALLOW_DATA_LOSS)%20%E8%A1%A8%E7%A4%BA%20XYZ%20%E5%B7%B2%E6%89%93%E5%BC%80%EF%BC%8C%E5%B9%B6%E4%B8%94%E4%B8%80%E6%AC%A1%E5%8F%AA%E8%83%BD%E6%9C%89%E4%B8%80%E4%B8%AA%E7%94%A8%E6%88%B7.png)
我有一个数据库,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 数据库引擎实例中的当前用户、会话和进程的信息。
之后,您可以将数据库设置为单用户模式并执行修复操作。在对数据库执行任何操作之前,请复制数据库。
如果你打算使用“修复允许数据丢失”选项,那么你必须非常小心。这应该是修复损坏的最后手段。