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

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

現象

SQL Serverでデータベースの状態が「未確認」になります。


SQL Server Management Studio のオブジェクトエクスプローラのデータベースのノードに「未確認」が表示されます。

原因

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

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

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

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

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

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

「未確認」の状態になっているデータベースを緊急モードにします。
SQL Server Management Studioなどで、以下のSQLコマンドを実行します。
USE master       
GO      
ALTER DATABASE 対象データベース SET EMERGENCY
GO

コマンド例

USE master       
GO      
ALTER DATABASE iPentecSandBox SET EMERGENCY
GO

コマンドが成功すると、データベースの状態が「緊急」になります。

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
コマンドが成功すると、データベースが通常のオンライン状態に戻ります。


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