遅延トランザクション (SQL Server)
適用対象: SQL Server
SQL Server Enterprise では、ロールバック (元に戻す) に必要なデータがデータベースの起動時にオフラインになっている場合、破損したトランザクションが遅延することがあります。 遅延トランザクション は、ロールフォワード フェーズの完了時にコミットされておらず、ロールバックを妨げるエラーが発生しているトランザクションです。 トランザクションはロールバックできないので、遅延します。
Note
破損したトランザクションが遅延するのは、SQL Server Enterprise の場合のみです。 SQL Server の他のエディションでは、破損したトランザクションが原因で起動に失敗します。
通常、遅延トランザクションが発生する原因は、データベースがロールフォワードされている間に、I/O エラーによってトランザクションに必要なページを読み取れなくなったことにあります。 ただし、ファイル レベルのエラーによって遅延トランザクションが発生する場合もあります。 また、トランザクションのロールバックが必要な時点で部分復元シーケンスが停止し、トランザクションがオフラインになっているデータを必要とする場合にも、遅延トランザクションが発生する可能性があります。
ユーザー トランザクションのロールバック中に I/O エラーが発生すると、データベース全体がオフラインになります。 データベースがオンラインに戻ると、データベースに保持されていたすべてのロックが再実行フェーズで再度取得され、コミットされていないすべてのトランザクションのロールバックが試みられます。 トランザクションにより変更されるすべてのデータには、トランザクションをロールバックできるまで適切なロックが設定されます。 ロールバックできないトランザクションでロックが解除されるのは、破損が修復されデータベースが再起動されたとき、またはオンライン復元後に、データベースをオンラインにした状態で遅延トランザクションが解決されたときです。 そのときまで、遅延トランザクションは、ロックを保持することで、データベース全体に対する特定の操作を防ぐことができます。 たとえば、遅延トランザクションに CREATE TABLE 命令が含まれる場合、遅延トランザクションが解決するまでユーザーはテーブルを作成できません。
また、段階的な部分復元によってデータベースが復旧された時点で、まだ復元されていないオフラインのファイル グループに 1 つ以上のアクティブなトランザクションが影響していることが原因で、遅延トランザクションが発生する場合もあります。 これらのトランザクションはロールバックできないため、遅延トランザクションになります。
次の表に、データベースで復旧を引き起こす操作および I/O に問題が発生した場合の結果を示します。
アクション | 解決方法 (I/O の問題が発生する場合または必要なデータがオフラインの場合) |
---|---|
サーバーの起動 | 遅延トランザクション |
復元 | 遅延トランザクション |
添付 | アタッチの失敗 |
Autorestart | 遅延トランザクション |
データベースまたはデータベース スナップショットの作成 | 作成の失敗 |
データベース ミラーリングの再実行 | 遅延トランザクション |
ファイル グループのオフライン化 | 遅延トランザクション |
要件と制限
- データベースでは、FULL または BULK-LOGGED モデルが使用されている必要があります。
- データベースに対して少なくとも 1 つのデータベースとログのバックアップが完了している必要があります
- 遅延トランザクションは、データベースがオンラインになった後のトランザクションのロールバック中に発生したエラーには適用されません。 (例: ランタイム エラー)
- データベースのアタッチ中に復旧エラーが発生した場合、トランザクションを遅延させることはできません
- システム トランザクション (ページ割り当てなど) などの一部のトランザクションを遅延することはできません
トランザクションの DEFERRED 状態の解決
重要
遅延トランザクションにより、トランザクション ログはアクティブなままになります。 遅延トランザクションを保持する仮想ログ ファイルは、これらのトランザクションが遅延状態ではなくなるまで、切り捨てることができません。 ログの切り捨ての詳細については、「トランザクション ログ (SQL Server)」を参照してください。
トランザクションの遅延を解決するには、I/O エラーのない状態でデータベースを起動する必要があります。 遅延トランザクションが存在する場合は、I/O エラーの原因を解決する必要があります。 利用可能な解決策を、通常で行われる順序で記載すると、次のようになります。
データベースを再起動します。 問題が一時的なものである場合、遅延トランザクションが発生することなくデータベースが起動します。
ファイル グループがオフラインになっていたためにトランザクションが遅延した場合、ファイル グループをオンラインに戻します。
オフラインのファイル グループをオンラインに戻すには、次の Transact-SQL ステートメントを使用します。
RESTORE DATABASE database_name FILEGROUP=<filegroup_name>
データベースを復元します。 オフライン復元後は、すべての遅延トランザクションが解決されます。
完全復旧モデルまたは一括ログ復旧モデルでは、少数の破損したページによって遅延トランザクションが発生した場合、オンライン ページ復元によってエラーが解決することがあります (サポートされている場合)。
遅延トランザクションの原因となっているオフライン状態のファイル グループが不要になった場合は、これらのファイル グループが機能しないようにします。 ファイル グループがオフラインであったことが原因で遅延されたトランザクションは、ファイル グループを機能していない状態にすると、遅延状態ではなくなります。
重要
機能していないファイル グループを復旧することはできません。
詳細については、「機能していないファイル グループの削除 (SQL Server)」を参照してください。
不適切なページが原因でトランザクションが遅延し、適切なデータベースのバックアップが存在しない場合、データベースを修復するには、次のプロセスを使用します。
最初に、次の Transact-SQL ステートメントを実行して、データベースを緊急モードにします。
ALTER DATABASE <database_name> SET EMERGENCY
緊急モードの詳細については、「 データベースの状態」を参照してください。
次に、 DBCC CHECKDB、 DBCC CHECKALLOC、または DBCC CHECKTABLEのいずれかの DBCC ステートメントで DBCC REPAIR_ALLOW_DATA_LOSS オプションを使用して、データベースを修復します。
DBCC では、不適切なページが検出されると、そのページの割り当てが解除され、関連するすべてのエラーが修復されます。 この方法を使用すると、物理的に一貫性のある状態でデータベースをオンラインに戻すことができます。 ただし、追加されたデータが失われる場合もあるため、この方法は最後の手段として使用してください。
参照
復元と復旧の概要 (SQL Server)
機能していないファイル グループの削除 (SQL Server)
ファイル復元 (完全復旧モデル)
ファイルの復元 (単純復旧モデル)
ページ復元 (SQL Server)
段階的な部分復元 (SQL Server)
ALTER DATABASE (Transact-SQL)
RESTORE (Transact-SQL)