Info2softは、ウェブサイトでより快適で適切な閲覧体験を提供するためにCookieを使用しています。 プライバシーポリシー
Loading...
データベース管理者にとって、復元状態から抜け出せないSQLデータベースへの対応は業務を妨害し、データアクセスを遮断し、基幹システムのダウンタイムを引き起こす可能性があります。この問題は多くの場合、復元処理の未完了または設定不備が原因で発生します。
本ガイドでは、データベースが復元状態でスタックする原因を解説し、DBAの実務経験に基づきT‑SQLコマンドを含む6つの実用的な解決方法を紹介し、効率的に問題を解消します。
データベースが復元モードのままになる大半のケースは、修正可能な単純な問題に起因します。考えられる原因と、後述する解決策との関連は以下の通りです。
以下に復元モードから抜け出すための実行可能な6つの対処法を記載します。順番に試すか、長期的な運用効率のためにSQL Serverバックアップソリューションの導入を検討してください。
この問題はNORECOVERYフラグを使用して復元を実行し、最終的なリカバリ手順が省略された場合に発生します。SQL Serverエンジンが追加のトランザクションログの適用を待機するため、復元状態のまま利用不可となります。
対処方法
適用するバックアップファイルがこれ以上存在しない場合、下記コマンドを実行してデータベースをオンライン化できます。
-- [YourDatabaseName]を実際のデータベース名に置き換え
RESTORE DATABASE [YourDatabaseName] WITH RECOVERY;
GO
動作原理
WITH RECOVERYパラメータは復元シーケンスが完了したことをSQL Serverに通知します。エンジンはコミットされていないトランザクションをロールバックするUndoフェーズを実行し、データの整合性を確保します。これによりデータベースの状態が「復元」から「オンライン」へ遷移し、ユーザーがアクセス可能になります。
SSMSの復元ウィザードにて「末尾ログバックアップを取得する」オプションにチェックを入れたままにし、バックアップが失敗する、または誤って「データベースを非稼働状態のままにする」を選択すると、データベースが復元状態でスタックします。
対処方法
正しい設定で復元処理を再実行します。手順は以下の通りです。


動作原理
これらの設定によりウィザードはリカバリ処理を最後まで実行します。RESTORE WITH RECOVERYを選択することでSQL Serverはデータを確定させオンライン化します。末尾ログバックアップを無効にすることで、破損またはアクセス不可のログファイルを待機する状態を回避します。
バックグラウンドタスクやアプリケーション接続が最終リカバリ手順をブロックする場合があります。SQL Serverがオンライン化に必要な排他アクセスを取得できないため、復元状態のままとなります。
対処方法
他のすべての接続を強制的に切断し、データベースがリカバリを完了できるようにします。下記スクリプトを実行します。
-- すべてのアクティブセッションを終了しトランザクションをロールバック
ALTER DATABASE [YourDatabaseName] SET SINGLE_USER WITH ROLLBACK IMMEDIATE;
GO
-- データベースをオンライン化
RESTORE DATABASE [YourDatabaseName] WITH RECOVERY;
GO
-- マルチユーザーモードに戻す
ALTER DATABASE [YourDatabaseName] SET MULTI_USER;
GO
動作原理
SET SINGLE_USER WITH ROLLBACK IMMEDIATEコマンドはユーザーを切断しトランザクションをロールバックすることでセッションロックを解除します。ロックが解消されるとエンジンは安全に最終リカバリフェーズを実行可能になります。データベースがオンラインに遷移後、MULTI_USERに切り替えることでアプリケーションが再接続できるようになります。
ミラーリングやAlways On可用性グループといったHA環境では、セカンダリデータベースはプライマリからのログ更新を受け入れるため、通常復元状態となります。サーバー間の通信が切断、またはグループからデータベースを不正に削除すると、セカンダリ側が復元状態から抜け出せなくなります。
対処方法
プライマリとセカンダリの接続を手動で解除する必要があります。データベースミラーリングの場合はセカンダリインスタンス上で下記コマンドを実行します。
-- ミラーリング関係を解除しデータベースを解放
ALTER DATABASE [YourDatabaseName] SET PARTNER OFF;
GO
可用性グループに参加しているデータベースの場合、セカンダリサーバーにて下記コマンドを実行します。
-- 可用性グループからデータベースを削除
ALTER DATABASE [YourDatabaseName] SET HADR OFF;
GO
動作原理
これらのコマンドはSQL Serverに対し、パートナーサーバーからのデータ受信を停止するよう指示します。PARTNERまたはHADRをOFFに設定することでセカンダリデータベースはスタンドアロンに変換されます。外部ログの待機状態が解除された後、解決策1のWITH RECOVERYコマンドでオンライン化できます。
ログシッピング構成では、セカンダリデータベースは仕様上「復元」または「スタンバイ」状態となり、プライマリからのトランザクションログバックアップを継続的に受信・適用します。経験の浅いDBAはこれを障害と誤認することがありますが、正常な動作です。
対処方法
まずデータベースがログシッピングの対象か確認してください。障害復旧のフェイルオーバーなど、実際にオンライン化する必要がある場合はログシッピングジョブを停止し、手動でデータベースをリカバリします。
-- ログシッピングを解除しデータベースをオンライン化する場合のみ実行
RESTORE DATABASE [YourDatabaseName] WITH RECOVERY;
GO
状態のままデータベースを読み取り可能にしたい場合は、ログシッピングの設定をNORECOVERYモードではなくスタンバイモードに変更してください。
動作原理
これは技術的な障害ではなく見かけ上の異常です。ログシッピングはコピー先データベースを非リカバリ状態に保ち、プライマリのログを追従させます。リカバリコマンドを実行するとログの待機を終了しデータを確定させアクセス可能になりますが、ログシッピングの連鎖は切断されます。
ハードウェアトラブル、ディスク領域不足、バックアップファイルの破損により復元が途中で失敗する場合があります。これによりデータベースがリカバリ保留または恒久的な復元状態に陥ります。この場合SQL Serverはデータとログシーケンス番号(LSN)の整合性を検証できず、オンライン化ができなくなります。
対処方法
破損による復元失敗が疑われる場合、スタックしたメタデータをクリアし、検証済みの正常なバックアップから再復元するのが最善策です。
-- 単純なリカバリが不可能な場合、スタックしたデータベースを削除
DROP DATABASE [YourDatabaseName];
GO
-- 正常なバックアップファイルから再復元
RESTORE DATABASE [YourDatabaseName]
FROM DISK = 'C:\Backups\YourBackup.bak'
WITH RECOVERY, REPLACE, STATS = 10;
GO
動作原理
メタデータ不整合またはデータ破損が発生すると、内部のリカバリRedo/Undoフェーズが失敗します。データベースを削除しREPLACEコマンドを使用することで破損したポインタを除去し、SQL Serverがファイルを再作成します。STATS = 10を指定することで進捗を監視し、処理の再ハングを防止できます。
大規模エンタープライズ環境では、手動のT‑SQLスクリプトやSSMS GUIだけに依存するのはリスクが伴います。複雑なデータを扱う大規模環境では、フラグの指定ミス一つで多大なダウンタイムが発生する可能性があります。業務継続性を確保するため、多くの組織はi2Backupのようなエンタープライズ向けソリューションを採用しています。
i2BackupがエンタープライズDBAの安定した環境維持を支援するポイント:
i2Backupのような堅牢なツールをインフラに導入することで、ミスが発生しやすい手動作業を高可用性ワークフローに置き換えます。これによりSQL Serverデータベースは常に保護・検証され、遅延なくオンライン化可能となります。
復元処理中にスタックしたSQLデータベースへの対応は、ユーザーがデータアクセスを待機している状況では大きな負担となります。ただし大半の場合、この状態はSQL Serverエンジンが最終的な指示または排他ロックを待機しているだけです。
手動操作のミスが大きなリスクとなる大規模エンタープライズ環境では、i2Backupのようなプロフェッショナルソリューションの導入により、自動化とリアルタイム同期でこれらの問題を根本的に回避できます。いずれの手法を選択する場合も、検証済みのバックアップを確保し、復元が失敗した際はSQL Serverエラーログを確認してください。適切なアプローチによりリカバリ関連のトラブルを迅速に解消し、安定した高性能なデータベース環境を維持できます。