SQL Server データベースを特定の時点に復元する方法 (完全復旧モデル)

適用対象:SQL Server

このトピックでは、SQL Server Management Studio または Transact-SQL を使用して、SQL Server で特定の時点にデータベースを復元する方法について説明します。 このトピックは、完全復旧モデルまたは一括ログ復旧モデルを使用する SQL Server データベースにのみ関連しています。

重要

一括ログ復旧モデルでは、ログ バックアップに一括ログ記録された変更内容が含まれていると、そのバックアップ内の特定の時点への復旧を行うことができません。 データベースは、トランザクション ログ バックアップの終了時点へ復旧する必要があります。

推奨事項

  • 不明な時点を特定するには、STANDBY を使用します。

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

アクセス許可

復元するデータベースが存在しない場合、ユーザーはCREATE DATABASEを実行するためにRESTORE権限を持っている必要があります。 データベースが存在する場合、 RESTORE のアクセス許可は、 sysadmin 固定サーバー ロールと dbcreator 固定サーバー ロールのメンバーと、データベースの所有者 (dbo) に既定で設定されます (FROM DATABASE_SNAPSHOT オプションの場合、データベースは常に存在します)。

RESTORE アクセス許可は、メンバーシップ情報をサーバーが常に即座に参照できるロールに付与されます。 固定データベース ロールのメンバーシップは、データベースがアクセス可能で破損していない場合にのみ確認できるため( RESTORE の実行時には常に当てはまるとは限りません)、 db_owner 固定データベース ロールのメンバーには RESTORE 権限がありません。

SQL Server Management Studio を使用する

特定の時点にデータベースを復元するには

  1. オブジェクト エクスプローラーで、SQL Server データベース エンジンの適切なインスタンスに接続し、サーバー ツリーを展開します。

  2. [データベース] を展開します。 データベースに応じて、ユーザー データベースを選択するか、または System Databases を展開してシステム データベースを選択します。

  3. データベースを右クリックして [タスク]をポイントし、 [復元]をポイントして、 [データベース]をクリックします。

  4. [全般] ページの 復元元のセクションを使用して、復元するバックアップ セットの復元元ファイルと場所を指定します。 次のいずれかのオプションを選択してください。

    • データベース

      復元するデータベースをドロップダウン リストから選択します。 このリストには、 msdb バックアップ履歴に従ってバックアップされたデータベースのみが含まれます。

    別のサーバーで作成されたバックアップの場合、復元先のサーバーには指定されたデータベースのバックアップ履歴情報が存在しません。 この場合、 [デバイス] をクリックして、復元するファイルまたはデバイスを手動で指定します。

    • デバイス

      参照ボタン ([...]) をクリックし、 [バックアップ デバイスの選択] ダイアログ ボックスを開きます。 [バックアップ メディアの種類] ボックスから、デバイスの種類を 1 つ選択します。 [バックアップ メディア] ボックスにデバイスを追加するには、 [追加]をクリックします。

      [バックアップ メディア] ボックスに目的のデバイスを追加したら、 [OK] をクリックして、 [全般] ページに戻ります。

      [ソース: デバイス: データベース] ボックスの一覧で、復元するデータベースの名前を選択します。

      メモ この一覧は [デバイス] をクリックした場合にのみ使用できます。 選択されたデバイスにバックアップを持つデータベースのみが使用できるようになります。

  5. 復元先のセクション[データベース] ボックスに、復元するデータベースの名前が自動的に表示されます。 データベースの名前を変更するには、 [データベース] ボックスに新しい名前を入力します。

  6. [タイムライン] をクリックして、 [バックアップのタイムライン] ダイアログ ボックスにアクセスします。

  7. [復元先] セクションで、 [特定の日付と時刻]をクリックします。

  8. [日付][時刻] ボックスを使用するか、スライダー バーを使用して、復元を止める特定の日付と時刻を指定します。 [OK] を選択します。

    [タイムラインの間隔] ボックスを使用して、タイムラインに表示される時間を変更します。

  9. 特定の時点を指定すると、データベース復旧アドバイザーによって、その特定の時点に復元するために必要なバックアップだけが [復元するバックアップ セット] グリッドの [復元] 列で選択されます。 これらの選択されたバックアップは、特定の時点への復元用として推奨される復元プランを示しています。 特定の時点への復元操作には選択されているバックアップのみを使用するようにします。

    [復元するバックアップ セット] グリッドの列の詳細については、「データベースの復元 ([全般] ページ)」を参照してください。 データベースの復旧アドバイザーの詳細については、「復元と復旧の概要 (SQL Server)」を参照してください。

  10. [オプション] ページの [復元オプション] パネルでは、状況に応じて、次の任意のオプションを選択できます。

    • [既存のデータベースを上書きする (WITH REPLACE)]

    • [レプリケーションの設定を保存する (WITH KEEP_REPLICATION)]

    • [復元するデータベースへのアクセスを制限する (WITH RESTRICTED_USER)]

    これらのオプションの詳細については、「データベースの復元 ([オプション] ページ)」を参照してください。

  11. [復旧状態] ボックスのオプションを選択します。 このボックスの選択内容により、復元操作後のデータベースの状態が決まります。

    • RESTORE WITH RECOVERY は既定の動作であり、コミットされていないトランザクションをロールバックしてデータベースを使用する準備が整います。 別のトランザクション ログは復元できません。 このオプションは、必要なバックアップをすべて復元する場合に選択します。

    • RESTORE WITH NORECOVERY 。データベースは動作せず、コミットされていないトランザクションはロールバックされません。 別のトランザクション ログは復元できます データベースは、復旧されるまで使用できません。

    • RESTORE WITH STANDBY は、データベースを読み取り専用モードのままにします。 コミットされていないトランザクションは元に戻されますが、復旧結果を元に戻せるように元に戻す操作をスタンバイ ファイルに保存します。

    オプションの詳細については、「データベースの復元 ([オプション] ページ)」を参照してください。

  12. 選択した時点まで復元するために必要であれば、[復元の前にログ末尾のバックアップを実行する] が選択されます。 この設定を変更する必要はありません。ログの末尾をバックアップする必要がない場合でも、そのように選択してかまいません。

  13. データベースへのアクティブな接続がある場合、復元操作は失敗する可能性があります。 Management Studio とデータベース間のすべてのアクティブな接続を閉じるには、[既存の接続を閉じる] オプションをオンにします。 このチェック ボックスをオンにすると、データベースは復元操作の実行前にシングル ユーザー モードに設定され、復元操作の完了後にマルチユーザー モードに設定されます。

  14. 復元のたびに確認を求めるには、[各バックアップを復元する前に確認する] をオンにします。 通常は、その必要はありません。データベースが大きく、復元操作のステータスを監視する必要がある場合にのみ使用します。

Transact-SQL の使用

始める前に

指定した時点への復元は、常にログ バックアップから行われます。 復元シーケンスのすべての RESTORE LOG ステートメントで、ターゲット時刻またはトランザクションを同じ STOPAT 句で指定する必要があります。 ポイントインタイム復元の前提条件として、まず目標の復元時間より早い完全なデータベースバックアップを復元する必要があります。 このデータベースの完全バックアップは、データベースの最新の完全バックアップより古くてもかまいません。ただし、これは、データベースの完全バックアップを復元した後で、目的の時点を含むログ バックアップまで後続のログ バックアップをすべて復元する場合に限ります。

復元するデータベース バックアップを特定するために、必要に応じて、 RESTOREDATABASE ステートメントで WITH STOPAT 句を指定して、指定したターゲット時刻に対してデータ バックアップが最新すぎる場合にエラーを発生させることができます。 データ バックアップに目的の時点が含まれている場合でも、常にデータ バックアップ全体が復元されます。

基本的な Transact-SQL 構文

RESTORE LOG database_name FROM <backup_device> WITH STOPAT =time, RECOVERY...

復旧ポイントは、 time で指定する datetimeの値以前に行われた最後のトランザクション コミットの時点です。

特定の時点より前に行われた変更のみを復元するには、復元するバックアップごとに WITH STOPAT =time を指定します。 これにより、目的の時点を過ぎる危険性を回避できます。

特定の時点にデータベースを復元するには

この手順の例については、このセクションの後半の「 例 (Transact-SQL)」を参照してください。

  1. データベースを復元するサーバー インスタンスに接続します。

  2. NORECOVERY オプションを使用して、 RESTOREDATABASE ステートメントを実行します。

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

  3. 存在する場合は、データベースを復旧せずに、最後の差分データベース バックアップを復元します (RESTOREDATABASEdatabase_name FROM backup_device WITH NORECOVERY)。

  4. 各トランザクション ログ バックアップを作成したのと同じ順序で適用し、ログの復元を停止する時刻 (RESTOREDATABASEdatabase_name FROM <backup_device> WITH STOPAT =time, RECOVERY) を指定します。

    RECOVERY および STOPAT オプション。 トランザクション ログ バックアップに、要求した時点の情報が格納されていない場合、たとえば、指定した日時がトランザクション ログに記録されている時点より後の場合などに、警告が生成されます。この場合、データベースは復旧されません。

例 (Transact-SQL)

次の例では、データベースを 12:00 AMApril 15, 2020 の状態に復元し、複数のログ バックアップが関連する復元操作を行います。 バックアップ デバイス AdventureWorksBackupsにおいて、復元するデータベース全体のバックアップはデバイス上の 3 番目のバックアップ セット (FILE = 3)、最初のログ バックアップは 4 番目のバックアップ セット (FILE = 4)、2 番目のログ バックアップは 5 番目のバックアップ セット (FILE = 5) です。

重要

AdventureWorks2025 データベースは、単純復旧モデルを使用しています。 ただし、ログ バックアップを可能にするために、データベースの完全バックアップを行う前に、 ALTER DATABASE AdventureWorks SET RECOVERY FULLを使用して、データベースが完全復旧モデルを使用するように設定されています。

RESTORE DATABASE AdventureWorks  
   FROM AdventureWorksBackups  
   WITH FILE=3, NORECOVERY;  
  
RESTORE LOG AdventureWorks  
   FROM AdventureWorksBackups  
   WITH FILE=4, NORECOVERY, STOPAT = 'Apr 15, 2020 12:00 AM';  
  
RESTORE LOG AdventureWorks  
   FROM AdventureWorksBackups  
   WITH FILE=5, NORECOVERY, STOPAT = 'Apr 15, 2020 12:00 AM';  
RESTORE DATABASE AdventureWorks WITH RECOVERY;   
GO  
  

関連タスク