ファイルグループバックアップから特定のファイルグループを復元したい。フルバックアップから復元する方法の例を見つけましたが、ファイルグループバックアップから復元したいと考えています。試行するたびに、ファイルグループ内のすべてのファイルが「復元中」の状態のままになり、アクセスできなくなりました。私がしようとしている方法は:
バックアップの作成:
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リカバリ;
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がファイルグループごとにトランザクションステータスを追跡しないためであり、その使命は、データベース内でトランザクションの一貫性を確保することです。 個々のファイルグループを異なる時点に復元してすべてをオンラインにできるとしたら、一貫性を確保する方法がありません。
私は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