データベースをデータベース スナップショットに戻す

適用対象: SQL Server

オンライン データベースのデータが破損した場合、特定のケースでは、データベースをバックアップから復元する代わりに、データベースをデータが破損した日付より前のデータベース スナップショットに復帰させる方が適切であることがあります。 たとえば、テーブルの削除など、最近の重大なユーザー エラーを元に戻すには、データベースの復帰が役立つ場合があります。 ただし、スナップショットの作成後に行った変更はすべて失われます。

始める前に

制限事項と制約事項

元に戻す操作は、次の状況ではサポートされません。

  • データベースのスナップショットが複数あります。 元に戻す場合、データベースのスナップショットは 1 つだけになります。そのスナップショットにデータベースを戻します。

  • 読み取り専用のファイル グループまたは圧縮されたファイル グループがデータベースにある。

  • ファイルは現在オフラインだが、スナップショットの作成時はオンラインだった。

データベースを復帰する前に、次の制限について検討してください。

  • 復帰は、メディアの復旧を目的としたものではありません。 データベース スナップショットはデータベース ファイルの不完全なコピーであるため、データベースまたはデータベース スナップショットが壊れた場合、スナップショットから復帰することはほぼ不可能です。 復帰が可能であっても、データベースまたはデータベース スナップショットが壊れている場合は、問題が解決しない可能性が高くなります。 このため、データベースの保護には、定期的なバックアップと復元プランのテストが必要です。 詳しくは、「SQL Server データベースのバックアップと復元」をご覧ください。

    Note

    データベース スナップショットの作成時点の状態にソース データベースを復元できるようにする必要がある場合は、完全復旧モデルを使用し、そのためのバックアップ ポリシーを実装してください。

  • 元のソース データベースは、復帰されたデータベースで上書きされるため、スナップショットの作成後にデータベースに行った更新内容はすべて失われます。

  • また、復帰操作によって古いログ ファイルが上書きされ、ログが再構築されます。 そのため、復帰したデータベースをユーザー エラーの時点までロール フォワードすることはできません。 したがって、データベースを復帰させる前に、ログをバックアップすることをお勧めします。

    Note

    元のログを復元してデータベースをロール フォワードすることはできませんが、元のログ ファイルの情報は失われたデータを再構築する際に役に立つ場合があります。

  • 復帰によってログ バックアップ チェーンが中断されます。 したがって、復帰したデータベースのログ バックアップを行う前に、最初にデータベース全体のバックアップまたはファイルのバックアップを行う必要があります。 データベースの完全バックアップをお勧めします。

  • 復帰操作中、スナップショットとソース データベースは両方とも使用できなくなります。 ソース データベースとスナップショットは、どちらも「復旧中」とマークされます。復帰操作中にエラーが発生した場合は、データベースを再起動すると、復帰操作の終了が試行されます。

  • 復帰したデータベースのメタデータは、スナップショット時のメタデータと同じです。

  • 復帰を行うと、すべてのフルテキスト カタログが削除されます。

前提条件

ソース データベースとデータベースの スナップショットが次の前提条件を満たすことを確認してください。

セキュリティ

アクセス許可

ソース データベースで RESTORE DATABASE 権限を持つユーザーは、データベース スナップショットが作成されたときの状態に復帰させることができます。

データベースをデータベース スナップショットに戻す方法 (Transact-SQL の使用)

データベースをデータベース スナップショットに戻すには

Note

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

  1. データベースを戻す対象になるデータベース スナップショットを特定します。 データベース内のスナップショットは、SQL Server Management Studio で参照できます (詳細については、「データベース スナップショットの表示 (SQL Server)」を参照してください)。 また、sys.databases (Transact-SQL) カタログ ビューの source_database_id 列から、ビューのソース データベースを特定することもできます。

  2. 他のデータベース スナップショットを削除します。

    スナップショットの削除の詳細については、「データベース スナップショットの削除 (Transact-SQL)」を参照してください。 データベースで完全復旧モデルを使用している場合は、データベースを戻す前にログをバックアップする必要があります。 詳細については、「トランザクション ログのバックアップ (SQL Server)」または「データベースが破損したときのトランザクション ログのバックアップ (SQL Server)」を参照してください。

  3. データベースを戻す操作を実行します。

    データベースを戻す操作には、ソース データベースに対して RESTORE DATABASE 権限が必要です。 データベースを戻すには、次の Transact-SQL ステートメントを使用します。

    RESTORE DATABASE database_name FROM DATABASE_SNAPSHOT =database_snapshot_name

    database_name はソース データベースで、 database_snapshot_name はデータベースを戻す対象になるスナップショットの名前です。 このステートメントでは、バックアップ デバイスではなく、スナップショット名を指定する必要があることに注意してください。

    詳細については、「RESTORE (Transact-SQL)」を参照してください。

    Note

    データベースを戻す操作中、スナップショットとソース データベースはどちらも使用できません。 ソース データベースおよびスナップショットは「復旧中」とマークされます。データベースを戻す操作中にエラーが発生した場合は、データベースを再び起動したときに、データベースを戻す操作の完了を試行します。

  4. データベース スナップショットの作成後にデータベース所有者を変更した場合、戻したデータベースのデータベース所有者を更新できます。

    Note

    戻したデータベースでは、データベース スナップショットの権限と構成 (データベース所有者や復旧モデルなど) が保持されます。

  5. データベースを起動します。

  6. 必要に応じて (特に、完全 (または一括ログ) 復旧モデルを使用している場合)、戻したデータベースをバックアップします。 データベースをバックアップするには、「データベースの完全バックアップの作成 (SQL Server)」を参照してください。

例 (Transact-SQL)

ここでは、データベースをデータベース スナップショットに戻す、次の例を示します。

A. AdventureWorks データベースのスナップショットを戻す

この例では、現在、 AdventureWorks2022 データベースに 1 つだけスナップショットが存在することを想定しています。 データベースを戻す対象になるスナップショットを作成する例については、「データベース スナップショットの作成 (Transact-SQL)」を参照してください。

USE master;  
-- Reverting AdventureWorks to AdventureWorks_dbss1800  
RESTORE DATABASE AdventureWorks from   
DATABASE_SNAPSHOT = 'AdventureWorks_dbss1800';  
GO  

B. Sales データベースのスナップショットを戻す

この例では、現在、 Sales データベースに 2 つのスナップショット ( sales_snapshot0600 および sales_snapshot1200) が存在することを想定しています。 古いスナップショットを削除し、新しいスナップショットにデータベースを戻します。

この例で使用するサンプル データベースおよびスナップショットを作成するためのコードについては、次の各トピックを参照してください。

  • Sales データベースと sales_snapshot0600 スナップショットについては、「CREATE DATABASE(SQL Server Transact-SQL)」の「ファイル グループのあるデータベースを作成する」および「データベース スナップショットを作成する」を参照してください。

  • sales_snapshot1200 スナップショットについては、「データベース スナップショットの作成 (Transact-SQL)」の「Sales データベースのスナップショットを作成する」を参照してください。

--Test to see if sales_snapshot0600 exists and if it   
-- does, delete it.  
IF EXISTS (SELECT database_id FROM sys.databases  
    WHERE NAME='sales_snapshot0600')  
    DROP DATABASE SalesSnapshot0600;  
GO  
-- Reverting Sales to sales_snapshot1200  
USE master;  
RESTORE DATABASE Sales FROM DATABASE_SNAPSHOT = 'sales_snapshot1200';  
GO  

Related Tasks

参照

データベース スナップショット (SQL Server)
RESTORE (Transact-SQL)
sys.databases (Transact-SQL)
データベース ミラーリングとデータベース スナップショット (SQL Server)