web-dev-qa-db-ja.com

SQL Server 2008で単一のFILEGROUPをバックアップおよび復元する方法

以前は、ServerFaultで 私は質問しました Sql Server 2008ファイルグループのバックアップと復元について。

今日、これらのRESTOREバックアップの1つをFILEGROUPしようとすると、次のエラーが発生しました:-

Processed 1895080 pages for database 'XWing', file 'XWing' on file 1.
Processed 4 pages for database 'XWing', file 'XWing_log' on file 1.
The database cannot be recovered because the log was not restored.
The database cannot be recovered because the log was not restored.
The roll forward start point is now at log sequence number (LSN) 221218000000010400001. Additional roll forward past LSN 221218000000010400001 is required to complete the restore sequence.
This RESTORE statement successfully performed some actions, but the database could not be brought online because one or more RESTORE steps are needed. Previous messages indicate reasons why recovery cannot occur at this point.
RESTORE DATABASE ... FILE=<name> successfully processed 1895084 pages in 69.504 seconds (213.014 MB/sec).

次のSQLコードを使用しました...

alter Database [XWing] SET SINGLE_USER With ROLLBACK IMMEDIATE

restore database [XWing] filegroup = 'PRIMARY'
FROM  DISK = N'C:\Temp\XWing Manual Full Primary Filegroup.bak'
with
    MOVE N'XWing' TO N'D:\XWing.mdf',
    MOVE N'XWing_log' TO N'L:\XWing_Log.ldf',
    replace, recovery

それで、DBが正しくバックアップされていないと思いますか?

これは、PRIMARY FILEGROUPをバックアップするために私が作成したスクリプトです

BACKUP DATABASE [XWing] FILEGROUP = N'PRIMARY' 
TO  DISK = N'F:\Sql DB Backups\XWing Manual Full Primary Filegroup.bak' WITH NOFORMAT, INIT,
NAME = N'XWing-Full Filegroup Backup', SKIP, NOREWIND, NOUNLOAD, COMPRESSION,  STATS = 10
GO
declare @backupSetId as int
select @backupSetId = position from msdb..backupset where database_name=N'XWing' and backup_set_id=(select max(backup_set_id) from msdb..backupset where database_name=N'XWing' )
if @backupSetId is null begin raiserror(N'Verify failed. Backup information for database ''XWing'' not found.', 16, 1) end
RESTORE VERIFYONLY FROM  DISK = N'F:\Sql DB Backups\XWing Manual Full Primary Filegroup.bak' WITH  FILE = @backupSetId,  NOUNLOAD,  NOREWIND
GO

ご質問

  1. その復元構文は正しいですか?
  2. バックアップ構文はどうですか?

乾杯!

7
Pure.Krome

トランザクションログを復元して、データベースの整合性を保つ必要があります。現在、復元したファイルグループは、他のデータベースとは異なる時点にあります。ログがロールフォワードされ、すべてが整合したら、データベースをオンラインにすることができます。

Msdbデータベースのデータを見ると、データベースをオンラインにするために復元する必要があるトランザクションログファイルを確認できます。

バックアップとリカバリの構文に問題はありません。

3
mrdenny

メッセージに記載されているように、ファイルグループバックアップの時点までのログバックアップを復元する必要があります。データベースをオンラインにするには、データベースの整合性を保つために、ログを同じ時点まで再生する必要があります。ただし、プライマリファイルグループのみを復元するのは特別な状況です。プライマリファイルグループを復元するには、ファイルグループだけでなく、完全な復元を行う必要があります。 (私はそれについて肯定的ではありませんが、以下のテキストがその要件を示していると信じています。)

SQL Serverでのバックアップの復元と回復のしくみについて

一貫性をやり直す

REDOフェーズでは、データは常に、リカバリポイントでのデータベースの状態と一貫性のあるREDOになるポイントまでロールフォワードされます。すべてのデータは、元に戻すことができるポイントまでロールフォワードされました。

データベースの状態は、次のようにプライマリファイルによって定義されます。

プライマリファイルが復元されている場合、リカバリポイントはデータベース全体の状態を決定します。たとえば、テーブルが誤って削除される直前の時点にデータベースを回復している場合、データベース全体を同じ時点に復元する必要があります。

プライマリファイルが復元されていない場合、データベースの状態は既知であり、復元されたデータは、データベースとトランザクションの一貫性がある復旧ポイントにロールフォワードされます。 SQL Serverはこれを強制します。

ただし、データベースには、リカバリポイントでコミットされていないトランザクションによって行われた変更が含まれる場合があります。オンライン復元の場合、データはデータベースのオンライン部分の現在の状態と一致する時点まで回復されます。

2
user507