錯誤提示:
消息 829,級別 21,狀態 1,第 1 行 數據庫 ID 15,頁 (1:21826) 已標記為 RestorePending,可能表明磁盤已損壞。要從此狀態恢復,請執行還原操作。
引起原因:
RestorePending一般是在進行頁恢復的過程中出現的,就是在進行了restore操作之后但還沒有進行recovery操作之前頁的狀態。
出現這樣的問題可以肯定這個表是損壞了,但是在查詢數據的時候如果不會查詢到損壞頁面的數據話是不會報錯的,也就是說可以有條件的使用這個表。
如果損壞的頁只有一個的話,那刪除掉這個壞表故障肯定就沒有了,因為一個頁里面只會放一個表的數據。
損壞的直接原因就是放在磁盤上面的數據被意外的修改了或者寫入的時候出錯這些,可能是磁盤問題,但是IO系統可能性更大。
可以好好的檢查系統日志和SQLServer的LOG,看看里面有沒有關於磁盤或者IO之類的警告、報錯信息,以進一步確定原因。
至於處理方法,如果表重要那就利用備份做頁面還原恢復數據,不重要的話就刪掉重建,
或者使用以下方式進行修復,在處理完壞頁之后再對整個數據庫做一次DBCC CHECKDB操作,確保沒有其他的壞頁。
解決辦法:
快速修復 DBCC CHECKDB ('數據庫名', REPAIR_FAST)
重建索引並修復 DBCC CHECKDB ('數據庫名', REPAIR_REBUILD)
如果必要允許丟失數據修復 DBCC CHECKDB ('數據庫名'', REPAIR_ALLOW_DATA_LOSS)
錯誤提示:
執行修復命令時,可能會出現以下錯誤:
未處理修復語句。數據庫需處於單用戶模式下解決
解決辦法:
此時我們需要將數據庫設置成單用戶模式:
右鍵點擊數據庫 -> 屬性 -> 選項 -> 狀態 -> 限制訪問 -> 選擇Single-> 確定。
錯誤提示:
當我們修復完數據庫后,需要將其恢復為多用戶模式,此時可能出現
數據庫 'xxx' 已打開,並且一次只能有一個用戶訪問
解決辦法:
在設置多用戶模式的時候可能會因為還有其它進程的連接導致設置無法進行,所以需要殺掉所有連接的進程。
方式一
USE master; GO DECLARE @SQL VARCHAR(3000); SET @SQL = ''; SELECT @SQL = @SQL+'; KILL ' + RTRIM(SPID) FROM [sys].[sysprocesses] AS sps WHERE [sps].[dbid] = DB_ID('test'); SET @SQL = SUBSTRING(@SQL, 2, LEN(@SQL)); EXEC(@SQL); GO
方式二
DECLARE @DBName SYSNAME; SET @DBName = 'BI_Monitor'; --這個是要刪除的數據庫庫名 DECLARE @KSQL NVARCHAR(1000) DECLARE tb CURSOR LOCAL FOR SELECT KSQL = 'KILL ' + CAST([sps].[spid] AS NVARCHAR(10)) FROM [sys].[sysprocesses] AS sps WHERE dbid = DB_ID(@DBName)--查詢@DBName相關的線程 --循環殺掉要刪除數據的相關線程 OPEN tb FETCH NEXT FROM tb INTO @KSQL WHILE @@FETCH_STATUS = 0 BEGIN EXECUTE(@KSQL); FETCH NEXT FROM tb INTO @KSQL END CLOSE tb DEALLOCATE tb
最后再將相應數據庫設置為多用戶模式即可。
ALTER DATABASE [test] SET MULTI_USER;--設置為多用戶模式