データベースの全体復元の実行 (完全復旧モデル)

データベースの全体復元の目的は、データベース全体を復元することです。復元の実行中は、データベース全体がオフラインになります。データベースの各部がオンラインになる前に、すべてのデータが一貫性のある状態に復旧されます。一貫性のある状態とは、データベースのすべての部分が同じ時点にあり、コミットされていないトランザクションが存在しない状態を示します。

完全復旧モデルでは、特定の時点にデータベースを復元できます。特定の時点とは、利用可能な最新のバックアップ、特定の日時、またはマークされたトランザクションを指します。

セキュリティに関する注意セキュリティに関する注意

不明なソースや信頼されていないソースからのデータベースは、アタッチまたは復元しないことをお勧めします。そのようなデータベースには、意図しない Transact-SQL コードを実行したり、スキーマまたは物理データベース構造を変更することによりエラーを発生させる悪意のあるコードが含まれている可能性があります。不明なソースや信頼されていないソースのデータベースを使用する前に、運用に使用していないサーバーでそのデータベースに対し DBCC CHECKDB を実行し、さらに、そのデータベースのストアド プロシージャやその他のユーザー定義コードなどのコードを調べます。

データベース全体の復元

通常、障害が発生した時点までデータベースを復旧するには、次の基本的な手順が必要です。

  1. アクティブなトランザクション ログ (ログの末尾と呼ばれます) をバックアップします。これにより、ログ末尾のバックアップが作成されます。アクティブなトランザクション ログを使用できない場合は、そのログ部分にあるすべてのトランザクションが失われます。

    重要な注意事項重要

    一括ログ復旧モデルで、一括ログ操作が含まれるすべてのログをバックアップするには、データベース内のすべてのデータ ファイルへのアクセス許可が必要です。データ ファイルにアクセスできないと、トランザクション ログをバックアップできません。その場合は、最新のログ バックアップ以降に加えられたすべての変更を手動で再実行する必要があります。

    詳細については、「ログ末尾のバックアップ」を参照してください。

  2. データベースの最新の完全バックアップが復元されますが、データベースは復旧されません (RESTORE DATABASE database_name FROM backup_device WITH NORECOVERY)。

  3. 差分バックアップが存在する場合は、データベースを復旧しないで最新の差分バックアップを復元します (RESTORE DATABASE database_name FROM differential_backup_device WITH NORECOVERY)。

  4. バックアップを復元した直後に作成された、最初のトランザクション ログのバックアップから順番に、NORECOVERY を指定してログを復元します。

  5. データベースを復旧します (RESTORE DATABASE database_name WITH RECOVERY)。または、この手順を最後のログ バックアップの復元と組み合わせることもできます。

  6. データベースの全体復元を行うと、通常、ログ バックアップ内の特定の時点またはマークされたトランザクションまで復旧できます。ただし、一括ログ復旧モデルの場合は、一括ログ操作による変更がログ バックアップに含まれていると、特定の時点への復旧はできません。詳細については、「バックアップ内の特定の時点へのデータベースの復元」を参照してください。

次の図に、このプロセスを示します。(1) 障害が発生した後、(2) ログ末尾のバックアップが作成されます。次に、データベースが障害発生時点まで復元されます。このときに、データベース バックアップと、それ以降の差分バックアップ、および、ログ末尾のバックアップを含め、差分バックアップ後に作成されたすべてのログ バックアップが復元されます。

障害発生時点へのデータベースの全体復元

データベースを完全に復元する場合は、1 つの復元シーケンスを使用する必要があります。データベースの全体復元シナリオ向けの復元シーケンスで使用する重要なオプションの例を以下に示します。このシナリオでは、障害が発生した時点までデータベースが復元されます。復元シーケンスは、1 つ以上の復元フェーズによってデータを移動する、1 つ以上の復元操作で構成されます。説明の目的に関係しない構文や詳細は、省略しています。

データベースが復元され、ロールフォワードされます。ロールフォワードの時間を短縮するために、データベースの差分が使用されます。この復元シーケンスは、作業の損失を回避することを目的としています。復元される最後のバックアップが、ログ末尾のバックアップになります。

復元シーケンスの RESTORE の基本構文は次のとおりです。

  1. RESTORE DATABASE database FROM full database backup WITH NORECOVERY;

  2. RESTORE DATABASE database FROM full_differential_backup WITH NORECOVERY;

  3. RESTORE LOG database FROM log_backup WITH NORECOVERY;

    このログの復元手順を、追加のログ バックアップごとに繰り返します。

  4. RESTORE DATABASE database WITH RECOVERY;

次の例では、AdventureWorks2008R2 サンプル データベースは、バックアップ前に完全復旧モデルを使用するように設定されていました。この例では、AdventureWorks2008R2 データベースのログ末尾のバックアップを作成します。次に、データベースの以前の完全バックアップとログ バックアップを復元してから、ログ末尾のバックアップを復元します。最後に、別の手順でデータベースを復旧します。

注意

この例では、「データベースの完全バックアップ」の「完全復旧モデルでのデータベース バックアップの使用」で作成される、データベース バックアップおよびログ バックアップを使用します。

この例の先頭では、ALTER DATABASE ステートメントを使用して復旧モデルを FULL に設定しています。

USE master;
--Create tail-log backup.
BACKUP LOG AdventureWorks2008R2 
TO DISK = 'Z:\SQLServerBackups\AdventureWorks2008R2FullRM.bak'  
   WITH NORECOVERY; 
GO
--Restore the full database backup (from backup set 1).
RESTORE DATABASE AdventureWorks2008R2 
  FROM DISK = 'Z:\SQLServerBackups\AdventureWorks2008R2FullRM.bak' 
  WITH FILE=1, 
    NORECOVERY;

--Restore the regular log backup (from backup set 2).
RESTORE LOG AdventureWorks2008R2 
  FROM DISK = 'Z:\SQLServerBackups\AdventureWorks2008R2FullRM.bak' 
  WITH FILE=2, 
    NORECOVERY;

--Restore the tail-log backup (from backup set 3).
RESTORE LOG AdventureWorks2008R2 
  FROM DISK = 'Z:\SQLServerBackups\AdventureWorks2008R2FullRM.bak'
  WITH FILE=3, 
    NORECOVERY;
GO
--recover the database:
RESTORE DATABASE AdventureWorks2008R2 WITH RECOVERY;
GO

USE master;
--Create tail-log backup.
BACKUP LOG AdventureWorks2008R2 
TO DISK = 'Z:\SQLServerBackups\AdventureWorks2008R2FullRM.bak'  
   WITH NORECOVERY; 
GO
--Restore the full database backup (from backup set 1).
RESTORE DATABASE AdventureWorks2008R2 
  FROM DISK = 'Z:\SQLServerBackups\AdventureWorks2008R2FullRM.bak' 
  WITH FILE=1, 
    NORECOVERY;

--Restore the regular log backup (from backup set 2).
RESTORE LOG AdventureWorks2008R2 
  FROM DISK = 'Z:\SQLServerBackups\AdventureWorks2008R2FullRM.bak' 
  WITH FILE=2, 
    NORECOVERY;

--Restore the tail-log backup (from backup set 3).
RESTORE LOG AdventureWorks2008R2 
  FROM DISK = 'Z:\SQLServerBackups\AdventureWorks2008R2FullRM.bak'
  WITH FILE=3, 
    NORECOVERY;
GO
--recover the database:
RESTORE DATABASE AdventureWorks2008R2 WITH RECOVERY;
GO

障害発生時点への復旧

データベースの完全バックアップを復元するには

重要な注意事項重要

データベースのバックアップを別のサーバー インスタンスに復元する場合は、「バックアップと復元によるデータベースのコピー」および「データベースを別のサーバー インスタンスで使用できるようにするときのメタデータの管理」を参照してください。

データベースの差分バックアップを復元するには

トランザクション ログ バックアップを復元するには

1 つまたは複数のデータ バックアップを復元した後は、それ以降のトランザクション ログ バックアップをすべて復元してから、データベースを復旧する必要があります。

SQL Server 管理オブジェクト (SMO) を使用してバックアップを復元するには

特定の時点への復旧

完全復旧モデルでは、ログ バックアップ内にある特定の時点にデータベースを復元することができます。特定の時点とは、特定の日時、マークされたトランザクション、またはログ シーケンス番号 (LSN) を指します。詳細については、「バックアップ内の特定の時点へのデータベースの復元」を参照してください。

SQL Server の以前のバージョンのバックアップに対するサポート

SQL Server 2008 では、SQL Server 2000、SQL Server 2005、または SQL Server 2008 を使用して作成されたユーザー データベース バックアップを復元できます。ただし、SQL Server 2000 または SQL Server 2005 を使用して作成された mastermodel、および msdb のバックアップを SQL Server 2008 で復元することはできません。また、SQL Server 2008 のバックアップを以前のバージョンの SQL Server で復元することもできません。

SQL Server 2008 では、以前のバージョンとは異なる既定のパスを使用します。そのため、SQL Server 2000 または SQL Server 2005 の既定の場所で作成されたデータベースをバックアップから復元するには、MOVE オプションを使用する必要があります。新しい既定パスの詳細については、「SQL Server の既定のインスタンスおよび名前付きインスタンスのファイルの場所」を参照してください。

注意

SQL Server Version 7.0 以前のバージョンを使用して作成されたデータベースを SQL Server 2005 にアップグレードする方法については、「SQL Server 7.0 以前のバージョンからのデータベースのコピー」を参照してください。