Share via


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

データベース スナップショットは冗長ストレージではありません。このため、ディスク エラーやその他の種類の破損から保護されません。ただし、オンライン データベースでユーザー エラーが発生した場合は、エラー発生時点より前のデータベース スナップショットにデータベースを戻すことができます。

重要な注意事項重要

データベースの保護には、定期的なバックアップと復元プランのテストが欠かせません。データベース スナップショットを作成した時点の状態にソース データベースを復元する必要がある場合は、そのためのバックアップ ポリシーを実装してください。

データベースを戻す処理により、元のソース データベースが戻したデータベースで上書きされます。スナップショットに戻すと、すべてのフルテキスト カタログが削除されます。

重要な注意事項重要

データベースを戻す前に、「データベース スナップショットへの復帰」に記載されている内容を理解しておく必要があります。

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

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

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

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

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

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

    RESTORE DATABASE <database_name> FROM DATABASE_SNAPSHOT =<database_snapshot_name>

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

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

    注意

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

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

    注意

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

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

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

使用例

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

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

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

USE master;
-- Reverting AdventureWorks2008R2 to AdventureWorks2008R2_dbss1800
RESTORE DATABASE AdventureWorks2008R2 from 
DATABASE_SNAPSHOT = 'AdventureWorks2008R2_dbss1800';
GO

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

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

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

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

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

--Test to see if sales_snapshot0600 exists and if it 
-- does, delete it.
IF EXISTS (SELECT dbid 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