web-dev-qa-db-fra.com

Comment restaurer un groupe de fichiers à partir de la sauvegarde du groupe de fichiers?

Je veux restaurer un groupe de fichiers spécifique à partir de la sauvegarde du groupe de fichiers. J'ai trouvé des exemples comment le restaurer à partir de la sauvegarde complète, mais je veux le faire à partir de la sauvegarde du groupe de fichiers. À chaque fois que j'essaie, tous les fichiers du groupe de fichiers bloqué dans l'état "restauration" et ne peuvent plus être consultés. La façon dont j'essaie est:

Création de sauvegardes:

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

Restauration:

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

Erreur: Le journal de ce jeu de sauvegarde se termine au LSN 4323000025691200001, qui est trop tôt pour appliquer à la base de données. Une sauvegarde de journal plus récente comprenant LSN 4323000025741600001 peut être restaurée.

Quelqu'un peut-il m'expliquer quelles sont les étapes correctes?

METTRE À JOUR On dirait que tu m'as mal compris moi. Désolé pour ma mauvaise explication et ma réponse tardive. Ma tâche consiste à créer une base de données avec un groupe de fichiers avec 3 fichiers. Ensuite, je dois créer une table dans ce groupe de fichiers. Je dois faire une sauvegarde du groupe de fichiers, puis supprimer des lignes, puis doit restaurer le groupe de fichiers et la table doit être le début. Je crée donc un groupe de fichiers nommé "secondaireFileGroup" et une table en elle nommée "TestTable" avec 1000 rangées. Ensuite, j'ai supprimé 100 rangées (donc à la table restez 900) et restauré le groupe de fichiers (donc je m'attends à avoir encore 1000 rangées). Mais avec cette solution que vous m'avez donné, j'ai encore 900 rangées. Ma solution est basée sur la réponse de @scott Hodgin. PS: Je ne suis pas sûr que cela est encore possible.

Base de sauvegarde MyDatabase FileGroupGroup = 'SecondyFileGroup' sur Disk = N'E:\dbbackups\secondairefileGroupbackup.bak 'avec init 
 Sauvegarde journal MyDatabase to Disk = N'e:\dbbackups\tlog.trn' avec init; 
 
 Supprimer le sommet (100) de Testtable; [.____] 
 
 Utilisez MASTER; [.____] [.____] [ = N'E:\dbbackups\lightfilegroupbackup.bak 'avec Norecovery [.____] [.____] [ ] Avec la récupération; 
 
 Backup journal myDatabase to Disk = N'e:\dbbackups\ttomov_test\szh\tlog2.trn 'avec init; 
 Restaurer le journal mydatabase [.____] du disque = N'e:\dbbackups\ttomov_test\szh\tlog2.trn '[.____] avec récupération;
2
Swetoslav

I Pensez Vous devrez peut-être sauvegarder le journal de transaction (Taillog) à la fin de votre séquence de restauration, puis restaurer cette sauvegarde Taillog.

La démo suivante a fonctionné pour moi:

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

Mise à jour: vous avez ajouté des commentaires supplémentaires

J'ai essayé votre solution, mais avant la restauration de la base de données, j'ai supprimé 100 colonnes de la table (j'ai eu une table avec 1000 lignes, après la requête de suppression, elle reste 900). Tout le reste était pareil. Ainsi, à la fin, tous les fichiers sont accessibles, mais la table n'est pas restaurée et les lignes restent 900.


Jetez un coup d'œil à astuces SQL Server: Comment puis-je restaurer un sous-ensemble de mes tables à un moment précédent? - Spécifiquement la section Pourquoi le niveau de groupe de filets restaure Don ' t résoudre ce problème .

Chaque séquence de filetgroup-restaurer restaure et récupère une ou plusieurs groupes de fichiers à un point cohérent avec la base de données .

Pourquoi doit-il être de cette façon? C'est parce que SQL Server ne suit pas l'état de la transaction par les groupes de fichiers et sa mission est de garantir la cohérence transactionnelle dans une base de données. Si nous pouvions restaurer des groupes de fichiers individuels à différents moments et apporter tout en ligne, nous n'aurions pas le moyen d'assurer la cohérence.

3
Scott Hodgin

J'ai suscité Scott hodgin La réponse de celle-ci, mais je veux clarifier ce qui se passe ici et donner une solution alternative.

Le problème ici est que votre groupe de fichiers n'est pas readonly afin qu'il puisse être modifié entre l'heure de votre dernier log backup et le début de la restore.

Et vous pouvez faire un nombre infini de log backups, mais il n'y aura pas un qui garantit qu'il compromettait tous les changements jusqu'au moment où vous commencez à restaurer.

C'est pourquoi vous devriez prendre ce dernier log backup de telle manière que le serveur sait qu'après celui-ci, il n'y a aucun changement à un fichier du groupe de fichiers en question. La première solution évidente est donc de prendre ceci log backup Lorsque les fichiers de FileGroup ne sont plus accessibles, ils sont au milieu de la restauration.

Et voici comment Scott Hodgin Solution Fonctionne: il prend le dernier log backup Lorsque les fichiers FileGroup sont dans restoring état.

Mais vous pouvez le faire d'une autre manière: vous pouvez définir les fichiers de votre fichier de groupe offline juste avant de prendre le dernier log backup, ce faisant, vous n'avez plus besoin de prendre un log backup Une fois que vous avez commencé à restore.

Voici la solution complète utilisant Scott Hodgin code de :=:

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