Sql-Server

dbcc checkdb(‘XYZ’, REPAIR_ALLOW_DATA_LOSS) 表示 XYZ 已經打開,一次只能有一個使用者

  • November 26, 2020

我有一個數據庫 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

檢查使用數據庫的任何程序,但不返回任何行,並且日誌不顯示有關正在恢復的數據庫的任何內容或任何類似性質的內容。數據庫確實顯示為“緊急情況”。

有任何想法嗎?

將數據庫恢復為多使用者模式並嘗試以下操作。

alter database xyz SET single_user with rollback immediate 

dbcc checkdb('xyz',REPAIR_ALLOW_DATA_LOSS)

在您進入數據庫之前,可能另一個程序正在獲取數據庫連接。結合這兩個語句應該確保您獲得該連接。

級別 14 屬於權限被拒絕。這意味著,您無法訪問數據庫,因為有人正在使用它。

您可以使用sp_who,它提供有關 Microsoft SQL Server 數據庫引擎實例中目前使用者、會話和程序的資訊。

之後,您可以將數據庫設置為單使用者模式並執行修復操作。在對數據庫執行任何操作之前,請複制您的數據庫。

如果您要使用修復允許數據失去選項,那麼您必須非常小心。它應該是修復腐敗的最後手段。

引用自:https://serverfault.com/questions/538105