web-dev-qa-db-ja.com

ファイルグループバックアップからファイルグループを復元する方法

ファイルグループバックアップから特定のファイルグループを復元したい。フルバックアップから復元する方法の例を見つけましたが、ファイルグループバックアップから復元したいと考えています。試行するたびに、ファイルグループ内のすべてのファイルが「復元中」の状態のままになり、アクセスできなくなりました。私がしようとしている方法は:

バックアップの作成:

BACKUP DATABASE myDataBase FILEGROUP = 'secondaryFilegroup' TO DISK = N'D:\DBBackups\secondaryFilegroupBackup.bak' WITH INIT
BACKUP LOG myDataBase TO DISK = N'D:\DBBackups\tlog.trn';

復元:

RESTORE DATABASE myDataBase FILEGROUP = 'secondaryFilegroup' FROM DISK = N'D:\DBBackups\secondaryFilegroupBackup.bak'
RESTORE LOG myDataBase FROM DISK = N'D:\DBBackups\tlog.trn';

エラー:このバックアップセットのログはLSN 4323000025691200001で終了します。これは、データベースに適用するには早すぎます。 LSN 4323000025741600001を含む最新のログバックアップを復元できます。

誰かが私に正しい手順を教えてくれますか?

更新 あなたは私を誤解しているようです。私の悪い説明と私の遅い返答でごめんなさい。私の仕事は、3つのファイルを持つファイルグループを含むデータベースを作成することです。次に、このファイルグループにテーブルを作成する必要があります。ファイルグループのバックアップを作成し、一部の行を削除してから、ファイルグループを復元する必要があります。テーブルは最初から作成する必要があります。そこで、「secondaryFilegroup」という名前のファイルグループと、その中に1000行の「testTable」という名前のテーブルを作成します。次に100行を削除し(テーブルは900のまま)、ファイルグループを復元しました(そのため、再び1000行になると予想しています)。しかし、あなたが私に与えたこの解決策で私はまだ900行を持っています。私の解決策は、@ Scott Hodginからの回答に基づいています。 PS:これが可能かどうかわからない。

バックアップデータベースmyDatabase FILEGROUP = 'secondaryFilegroup' TO DISK = N'E:\ DBBackups\secondaryFilegroupBackup.bak 'WITH INIT 
 BACKUP LOG myDatabase TO DISK = N'E:\ DBBackups\tlog.trn' WITH INIT; 
 
 DELETE TOP(100)FROM testTable; 
 
 use master; 
 
 RESTORE DATABASE myDatabase FILEGROUP = 'secondaryFilegroup' FROM DISK = N'E:\ DBBackups\secondaryFilegroupBackup.bak 'WITH norecovery 
 
 RESTORE LOG myDatabase 
 FROM DISK = N'E:\ DBBackups\tlog.trn' 
 WITHリカバリ; 
 
バックアップログmyDatabase TO DISK = N'E:\ DBBackups\ttomov_test\SZH\tlog2.trn 'WITH INIT; 
 
ログを復元myDatabase 
 FROM DISK = N'E:\ DBBackups\ttomov_test\SZH\tlog2.trn '
 WITHリカバリ;
2
Swetoslav

I think復元シーケンスの最後にトランザクションログ(taillog)を再度バックアップし、その後、そのtaillogバックアップを復元する必要がある場合があります。

次のデモは私のために働きました:

USE [master]
GO

ALTER database [FGRestoreTEST] set offline with ROLLBACK IMMEDIATE;
DROP DATABASE [FGRestoreTEST]
GO


--Create sample database
CREATE DATABASE [FGRestoreTEST] ON PRIMARY (
    NAME = N'FGRestoreTEST'
    ,FILENAME = N'C:\SQLServer\FGRestoreTEST.mdf'
    ,SIZE = 5120 KB
    ,MAXSIZE = UNLIMITED
    ,FILEGROWTH = 1024 KB
    )
    ,FILEGROUP [secondaryFilegroup] (
    NAME = N'secondaryFilegroup'
    ,FILENAME = N'C:\SQLServer\secondaryFilegroup.ndf'
    ,SIZE = 5120 KB
    ,MAXSIZE = UNLIMITED
    ,FILEGROWTH = 1024 KB
    ) LOG ON (
    NAME = N'FGRestoreTEST_log'
    ,FILENAME = N'C:\SQLServer\FGRestoreTEST_log.ldf'
    ,SIZE = 2048 KB
    ,MAXSIZE = 2048 GB
    ,FILEGROWTH = 10 %
    )
GO


--Insert some test data
use [FGRestoreTEST]
go
create table TestTable (id int) on secondaryFilegroup 
insert into TestTable values(1),(2)

--Backup the secondary filegroup and then backup the transactionlog
USE [master]
GO

BACKUP DATABASE FGRestoreTEST FILEGROUP = 'secondaryFilegroup' TO DISK = N'C:\SQLServer\secondaryFilegroupBackup.bak'
WITH INIT

BACKUP LOG FGRestoreTEST TO DISK = N'C:\SQLServer\tlog.trn'
WITH INIT;

--Restore the secondary filegroup and then restore the transactionlog
--taken in the previous step
use [master]
go
RESTORE DATABASE FGRestoreTEST FILEGROUP = 'secondaryFilegroup'
FROM DISK = N'C:\SQLServer\secondaryFilegroupBackup.bak'
WITH norecovery

RESTORE LOG FGRestoreTEST
FROM DISK = N'C:\SQLServer\tlog.trn'
WITH recovery;

--At this point, you should have seen the messages about 
--Additional roll forward past LSN ... is required to complete the restore sequence
--Take an additional log backup and then restore with recovery
BACKUP LOG FGRestoreTEST TO DISK = N'C:\SQLServer\Taillog.trn'
WITH INIT;

RESTORE LOG FGRestoreTEST
FROM DISK = N'C:\SQLServer\Taillog.trn'
WITH recovery;

--Verify you can select from TestTable
use [FGRestoreTEST]
go

SELECT *
FROM TestTable

更新:追加のコメントを追加しました

私はあなたの解決策を試しましたが、データベースの復元の前に、テーブルから100列を削除しました(1000行のテーブルがあり、削除クエリの後、それらは900のままです)。他はすべて同じでした。したがって、最後にはすべてのファイルにアクセスできますが、テーブルは復元されず、行は900のままです。


SQL Serverのトリック:テーブルのサブセットを以前の時点に復元する方法はありますか? -特にセクションファイルグループレベルの復元ができない理由tこの問題を解決します

各ファイルグループリストアシーケンスは、1つ以上のファイルグループをデータベースと一致するポイントにリストアおよびリカバリします。

なぜそれがこのようでなければならないのですか?これは、SQL Serverがファイルグループごとにトランザクションステータスを追跡しないためであり、その使命は、データベース内でトランザクションの一貫性を確保することです。 個々のファイルグループを異なる時点に復元してすべてをオンラインにできるとしたら、一貫性を確保する方法がありません。

3
Scott Hodgin

私はScott Hodginの回答に賛成しましたが、ここで何が起こるかを明確にし、代替の解決策を提供したいと思います。

ここでの問題は、ファイルグループがreadonlyではないため、最後のlog backupの時刻とrestoreの先頭の間で変更できることです。

また、log backupsは無制限に作成できますが、復元を開始する瞬間まで、すべての変更が含まれることを保証するものはありません。

そのため、この最後のlog backupは、問題のファイルグループのどのファイルにも変更がないことをサーバーが認識できるようにしておく必要があります。したがって、最初の明白な解決策は、ファイルグループのファイルにアクセスできなくなったときに、これをlog backupにして、復元の最中であることです。

そして、これがScott Hodginの解決策の動作方法です。彼は、ファイルグループファイルがrestoring状態のときに最後のlog backupを取得します。

ただし、別の方法で行うこともできます。最後のlog backupを取得する直前にファイルグループのファイルをofflineに設定できるため、開始後にlog backupを取得する必要はありません。 restoreに。

Scott Hodginのコードを使用した完全なソリューションは次のとおりです。

USE [master]
GO

--Create sample database
CREATE DATABASE [FGRestoreTEST] ON PRIMARY (
    NAME = N'FGRestoreTEST'
    ,FILENAME = N'C:\SQLServer\FGRestoreTEST.mdf'
    ,SIZE = 5120 KB
    ,MAXSIZE = UNLIMITED
    ,FILEGROWTH = 1024 KB
    )
    ,FILEGROUP [secondaryFilegroup] (
    NAME = N'secondaryFilegroup'
    ,FILENAME = N'C:\SQLServer\secondaryFilegroup.ndf'
    ,SIZE = 5120 KB
    ,MAXSIZE = UNLIMITED
    ,FILEGROWTH = 1024 KB
    ) LOG ON (
    NAME = N'FGRestoreTEST_log'
    ,FILENAME = N'C:\SQLServer\FGRestoreTEST_log.ldf'
    ,SIZE = 2048 KB
    ,MAXSIZE = 2048 GB
    ,FILEGROWTH = 10 %
    )
GO

alter database [FGRestoreTEST] set recovery full
go

--Insert some test data
use [FGRestoreTEST]
go

create table TestTable (id int) on secondaryFilegroup 
insert into TestTable values(1),(2)

--Backup the secondary filegroup and then backup the transactionlog
USE [master]
GO

BACKUP DATABASE FGRestoreTEST FILEGROUP = 'secondaryFilegroup' TO DISK = N'C:\SQLServer\secondaryFilegroupBackup.bak'
WITH INIT

/***************************** SET FILES OF YOUR FILEGROUP OFFLINE *****************************/
alter database [FGRestoreTEST]
modify file (name = N'secondaryFilegroup', offline);

/***************************** NOW TAKE A LOG BACKUP *****************************/

BACKUP LOG FGRestoreTEST TO DISK = N'C:\SQLServer\tlog.trn'
WITH INIT;

--Restore the secondary filegroup and then restore the transactionlog
--taken in the previous step
use [master]
go
RESTORE DATABASE FGRestoreTEST FILEGROUP = 'secondaryFilegroup'
FROM DISK = N'C:\SQLServer\secondaryFilegroupBackup.bak'
WITH norecovery

RESTORE LOG FGRestoreTEST
FROM DISK = N'C:\SQLServer\tlog.trn'
WITH recovery;

use [FGRestoreTEST]
select name, state_desc
from sys.database_files;

--name  state_desc
--FGRestoreTEST ONLINE
--FGRestoreTEST_log ONLINE
--secondaryFilegroup    ONLINE
1
sepupic