特定の復旧ポイントにデータベースを復旧するためのベスト プラクティス

このトピックは、完全復旧モデルまたは一括ログ復旧モデルを使用する SQL Server データベースのみに適用されます。このトピックでは、特定の復旧ポイント (特定の時点マークされたトランザクション、またはログ シーケンス番号 (LSN)) にデータベースを復元する場合のベスト プラクティスをいくつか紹介します。

特定の復元時点が不明な場合の STANDBY を使用した検索

特定の時点にデータベースを復元しようとした際に、復旧目標 (つまり、最適な復旧ポイント) に最も適した時点が正確にわからない場合があります。この復旧ポイントを見つけるには、RESTORE … WITH STANDBY **=**standby_file_name を、目的の時点が目的の復旧ポイントよりも前の STOPAT 句と共に使用します。STANDBY 復元操作では、データベースが読み取り専用アクセスで復旧されます。これにより、データベースを調べて最適な復旧ポイントを見つけることができます。

STANDBY 復元操作を連続して使用すると、最適な復旧ポイントが見つかるまで、プライマリ データ ファイル (および必要に応じてその他のデータ ファイル) を段階的にロールフォワードすることができます。最適な復旧ポイントを特定できたら、データベースを再度ロールフォワードし、WITH STOPAT を使用して最適な復旧ポイントを目的の時点に指定できます。目的の時点に到達したら、WITH RECOVERY オプションを使用して部分的に復元されたデータベースを復旧します。

次に、他にファイルがある場合は、それらを復元および復旧し、データベースとの一貫性を確保します。目的の復旧ポイントまでのログ バックアップをすべて復元したら、その復旧ポイント後に作成された最初のログ バックアップを復元します。

STANDBY オプションの詳細については、「RESTORE の引数 (Transact-SQL)」を参照してください。

復元シーケンスの早い段階での特定時点の指定

復元シーケンスは、1 つ以上の復元フェーズによってデータを移動する、1 つ以上の復元操作で構成されます。シーケンスの目的について情報を多く指定するほど、最初からのやり直しが必要となるようなエラーが発生する可能性は低くなります。特定の時点への復元の場合、SQL Server データベース エンジンは復元シーケンスの開始時 (および途中) で指定された情報を使用して、復元の目標となる特定の時点を見極めます。必要な情報の指定が遅すぎると、シーケンスは失敗します。復元シーケンスの早い段階で目的の時点の情報を指定し、目標とする特定の時点を超えた時点に復元されないようにしてください。

特定の復旧ポイントに復元する場合は、すべての RESTORE LOG ステートメントで、RECOVERY オプションと共に STOPAT、STOPBEFOREMARK、または STOPATMARK を使用して目的の時点を指定します。RECOVERY オプションと STOPAT オプションを同時に指定したときに、指定した時点の情報がトランザクション ログ バックアップに格納されていない場合 (指定した日時がトランザクション ログに記録されている時点より後の場合など)、警告が生成されます。この場合、データベースは復旧されません。復旧ポイントに到達すると、データベースが復旧され、次のログ バックアップを復元する操作が失敗します。ログ バックアップを復元するときに RECOVERY オプションと STOPAT オプションを同時に指定すると、目的の時点を超えてログが復元されることはありません。

重要な注意事項重要

部分復元シーケンスで FILESTREAM ファイル グループを除外した場合、特定の時点への復元はサポートされません。復元シーケンスを強制的に実行して続行することもできます。ただし、RESTORE ステートメントから除外された FILESTREAM ファイル グループは復元できません。特定の時点への復元を強制的に実行するには、STOPAT、STOPATMARK、または STOPBEFOREMARK オプションに CONTINUE_AFTER_ERROR オプションを組み合わせて指定します。これらのオプションは、後続の RESTORE LOG ステートメントでも指定する必要があります。CONTINUE_AFTER_ERROR を指定した場合、部分復元シーケンスは正常に実行されますが、FILESTREAM ファイル グループは復元できなくなります。

例 : 特定の時点への復元

次の復元シーケンスの例では、最初のログ バックアップを適用するときに初めて、特定の時点に復元することが指定されています。この例では、差分バックアップ後の最初のログ バックアップが目的の時点です。

RESTORE DATABASE database_name FROM full_backup 
    WITH NORECOVERY;
RESTORE DATABASE database_name FROM full_differential_backup 
    WITH NORECOVERY;
RESTORE LOG database_name FROM log_backup 
    WITH STOPAT = time, RECOVERY;
RESTORE LOG database_name FROM log_backup 
    WITH STOPAT = time, RECOVERY;

RESTORE DATABASE database_name FROM full_backup 
    WITH NORECOVERY;
RESTORE DATABASE database_name FROM full_differential_backup 
    WITH NORECOVERY;
RESTORE LOG database_name FROM log_backup 
    WITH STOPAT = time, RECOVERY;
RESTORE LOG database_name FROM log_backup 
    WITH STOPAT = time, RECOVERY;

指定されたログの復元が成功するかどうかは、time がログ バックアップによってキャプチャされた期間内にあるかどうかによって決まります。以下の表を参照してください。

time とログ バックアップのキャプチャ期間との関係

結果

time がキャプチャ期間より前

復元は失敗し、ロールフォワードは行われません。

time がキャプチャ期間内

最後の復元が成功し、データベースが復旧されます。

time がキャプチャ期間より後

ロールフォワードは成功しますが、time に到達していないため、データベースは復旧されません。

後続のすべての RESTORE ステートメントでの特定の時点の宣言

特定の時点は、STOPAT、STOPBEFOREMARK、または STOPATMARK オプションが指定されたステートメントのみで有効です。RESTORE ステートメントでこのオプションを指定しなかった場合は、バックアップ全体が復元されます。

特定の時点への復元シーケンスの実行中、time に新しい値を指定することによって復旧ポイントを変更できます (ただし、time に新しく指定する時点までデータベースが復元されていないことが前提です)。

注意

STOPBEFOREMARK および STOPATMARK オプションには、mark_name および lsn_number の 2 つのパラメーターがあります。mark_name パラメーターは、RESTORE LOG ステートメントでのみサポートされ、ログ バックアップのトランザクション マークを指定します。lsn_number パラメーターは、RESTORE DATABASE ステートメントおよび RESTORE LOG ステートメントの両方でサポートされ、ログ シーケンス番号を指定します。

変更履歴

変更内容

WITH STANDBY は復旧処理の結果を元に戻すためだけのものであることを明確にするために、「特定の復元時点が不明な場合の STANDBY を使用した検索」を修正しました。