データベースの状態が「未確認」になりデータベースにアクセスできない

SQL Serverでデータベースの状態が「未確認」になりデータベースにアクセスできない現象について紹介します。

現象

SQL Serverでデータベースの状態が「未確認」になります。
データベースの状態が「未確認」になりデータベースにアクセスできない:画像1

SQL Server Management Studio のオブジェクトエクスプローラのデータベースのノードに「未確認」が表示されます。
データベースの状態が「未確認」になりデータベースにアクセスできない:画像2

原因

データベースが破損、または整合性に問題があります。

対処法 (完全復旧モデル、バックアップ時点までのロールバックが許容できる場合

完全復旧モデルの場合は、エラーが発生する直前の状態にデータベースをロールバックします。また、バックアップ時点までのロールバックが許容できる場合は、バックアップをリストアします。

対処法 (完全復旧モデルでない場合、バックアップ時点までのロールバックは避けたい場合)

バックアップをリストアできない場合は以下の手順で修復します。ただし、完全な一貫性は保証されず、データの欠損や不整合が出る可能性があります。

1.「未確認」のデータベースを緊急モードにする

「未確認」の状態になっているデータベースを緊急モードにします。

SQL Server Management Studioなどで、以下のSQLコマンドを実行します。

USE master       
GO      
ALTER DATABASE 対象データベース SET EMERGENCY
GO

コマンド例

USE master       
GO      
ALTER DATABASE iPentecSandBox SET EMERGENCY
GO


コマンドが成功すると、データベースの状態が「緊急」になります。
データベースの状態が「未確認」になりデータベースにアクセスできない:画像3

2.CHECKDB を実行しデータベースをチェックする

下記のSQLコマンドを実行し、データベースをチェックします。

DBCC CHECKDB(対象データベース)   
GO

コマンド例

DBCC CHECKDB(iPentecSandBox )   
GO

チェックが実行され、チェック結果のメッセージが表示されます。

エラーが無い場合

CHECKDB により、データベース 'iPentecSandBox' に 0 個のアロケーション エラーと 0 個の一貫性エラーが見つかりました。
DBCC の実行が完了しました。DBCC がエラー メッセージを出力した場合は、システム管理者に相談してください。

エラーがある場合 (軽度)

CHECKDB により、データベース '(データベース名)' に 0 個のアロケーション エラーと 2 個の一貫性エラーが見つかりました。 
repair_rebuild は DBCC CHECKDB ((データベース名)) で見つかったエラーの最小修復レベルです。
DBCC の実行が完了しました。DBCC がエラー メッセージを出力した場合は、システム管理者に相談してください。

エラーがある場合 (重度)

CHECKDB により、データベース '(データベース名)' に 0 個のアロケーション エラーと 18 個の一貫性エラーが見つかりました。
repair_allow_data_loss は DBCC CHECKDB ((データベース名)) で見つかったエラーの最小修復レベルです。
DBCC の実行が完了しました。DBCC がエラー メッセージを出力した場合は、システム管理者に相談してください。

3.データベースの修復

データベースを修復します。

「repair_rebuild は DBCC CHECKDB ((データベース名)) で見つかったエラーの最小修復レベルです。」の場合

下記SQLを実行してシングルユーザーモードに変更します。

ALTER DATABASE 対象データベース SET SINGLE_USER            
GO     


下記SQLを実行してデータベースの修復をします。

DBCC CHECKDB('対象データベース','REPAIR_REBUILD')          
GO

「repair_allow_data_loss は DBCC CHECKDB ((データベース名)) で見つかったエラーの最小修復レベルです。」の場合

下記SQLを実行してシングルユーザーモードに変更します。

ALTER DATABASE 対象データベース SET SINGLE_USER            
GO     


下記SQLを実行してデータベースの修復をします。

DBCC CHECKDB('対象データベース','REPAIR_ALLOW_DATA_LOSS')          
GO


修復処理が開始されます。修復の進行状況のメッセージが表示されます。修復が完了すると以下のメッセージ(一例)が表示されます。

CHECKDB により、データベース '(データベース名)' に 0 個のアロケーション エラーと 17 個の一貫性エラーが見つかりました。
CHECKDB により、データベース '(データベース名)' で 0 個のアロケーション エラーと 14 個の一貫性エラーが解決されました。
repair_allow_data_loss は DBCC CHECKDB ((データベース名), repair_allow_data_loss) で見つかったエラーの最小修復レベルです。
DBCC の実行が完了しました。DBCC がエラー メッセージを出力した場合は、システム管理者に相談してください。

4.エラー解消の確認

CHECKDB での確認

再度下記のCHECKDBのSQLコマンドを実行し、データベースをチェックします。

DBCC CHECKDB(対象データベース)   
GO
エラーが無い場合(例)
CHECKDB により、データベース 'iPentecSandBox' に 0 個のアロケーション エラーと 0 個の一貫性エラーが見つかりました。
DBCC の実行が完了しました。DBCC がエラー メッセージを出力した場合は、システム管理者に相談してください。

のメッセージが表示されることを確認します。

CHECKCONSTRAINTS での整合性確認

下記のコマンドを実行し、テーブル、データベースの整合性をチェックします。

USE [対象データベース]           
GO        
DBCC CHECKCONSTRAINTS
GO   

エラーが無い場合(例)
DBCC の実行が完了しました。DBCC がエラー メッセージを出力した場合は、システム管理者に相談してください。

5.データベースをオンラインにする

下記SQLコマンドを実行し、データベースをオンラインにします。

ALTER DATABASE [対象データベース] SET ONLINE

下記SQLコマンドを実行し、データベースのシングルユーザーモードを解除します。

ALTER DATABASE [対象データベース] SET MULTI_USER

コマンド例

ALTER DATABASE [iPentecSandBox] SET ONLINE
GO
ALTER DATABASE [iPentecSandBox] SET MULTI_USER
GO

コマンドが成功すると、データベースが通常のオンライン状態に戻ります。
データベースの状態が「未確認」になりデータベースにアクセスできない:画像4


AuthorPortraitAlt
著者
iPentec.com の代表。ハードウェア、サーバー投資、管理などを担当。
Office 365やデータベースの記事なども担当。
作成日: 2017-01-22
Copyright © 1995–2025 iPentec all rights reserverd.