Problème de sauvegarde différentielle - Pourquoi? Est-ce possible?

13

J'utilise SQL Server 2014 et voici la situation:

  • J'ai le serveur A et le serveur B.
  • ETL de nuit est traité sur le serveur A.
  • Une fois le processus de chargement terminé, la base de données X est sauvegardée (avec CHECKSUMet RESTORE VERIFYONLYpour garantir la fiabilité), puis envoyée au serveur B.
  • Le serveur B reçoit le bakfichier, puis y restaure la base de données.

Je souhaite utiliser une stratégie de sauvegarde différentielle afin que:

  1. La sauvegarde complète n'est effectuée que le samedi,
    c'est -à- dire la sauvegarde complète sur le serveur A le samedi -> expédier au serveur B -> Restaurer la sauvegarde complète sur le serveur B

  2. Le reste des jours sera une sauvegarde différentielle,
    c'est-à-dire une sauvegarde différentielle sur le serveur A -> expédier au serveur B -> Restaurer la sauvegarde différentielle sur le serveur B

J'ai essayé mais j'ai eu une erreur en disant:

le journal ou la sauvegarde différentielle ne peut pas être restauré car aucun fichier n'est prêt à être restauré.

Pas certain de pourquoi. J'ai vérifié sys.database_filessur le serveur A et le serveur B, et je peux voir que le differential_Base_LSNet differential_base_GUIDsont les mêmes. Où / autre chose à vérifier?

Au fait, à l'étape 2 ci-dessus, lorsque je restaure la sauvegarde diff sur le serveur B, ai-je toujours besoin de restaurer à la fois la sauvegarde complète + la sauvegarde différentielle?

J'ai uniquement restauré la sauvegarde différentielle WITH RECOVERY(et j'ai reçu ce message d'erreur) car la sauvegarde complète a déjà été restaurée la veille.

Pour clarifier: Oui, je veux que la base de données sur le serveur B soit lisible entre les différentiels. Comment contourner cela? Ma seule option est-elle de RESTORE FULL (WITH NORECOVERY)+ RESTORE DIFF (WITH RECOVERY)combiner la séquence chaque nuit?

Tout conseil sera très apprécié.

je ne sais rien
la source

Réponses:

15

Vous n'avez pas besoin de jouer avec RECOVERYet NORECOVERYici, tout ce dont vous avez besoin est l' STANDBYoption. Voici une démonstration rapide sur la façon de l'utiliser.

Créez une base de données, définissez-la sur une récupération simple et créez une table.

Insérez des données, prenez quelques différences.

Amusant, non?

USE master;

/*Create a dummy database*/
CREATE DATABASE DiffRestoreTest

/*We simple now*/
ALTER DATABASE DiffRestoreTest SET RECOVERY SIMPLE

/*Context is everything*/
USE DiffRestoreTest

/*If nothing changes, do we even need a diff backup?*/
CREATE TABLE dbo.t1 (Id INT)

/*Take a full backup, dummy*/
BACKUP DATABASE DiffRestoreTest 
TO DISK = 'F:\Backup\DRT_FULL.bak' 
WITH INIT, FORMAT, COMPRESSION

/*Make a change*/
INSERT dbo.t1 (Id )
VALUES ( 1 )

/*Take a differential backup*/
BACKUP DATABASE DiffRestoreTest 
TO DISK = 'F:\Backup\DRT_DIFF_1.bak' 
WITH INIT, FORMAT, COMPRESSION, DIFFERENTIAL

/*Make another change*/
INSERT dbo.t1 (Id )
VALUES ( 2 )

/*Take another diff backup*/
BACKUP DATABASE DiffRestoreTest  
TO DISK = 'F:\Backup\DRT_DIFF_2.bak' 
WITH INIT, FORMAT, COMPRESSION, DIFFERENTIAL

/*Make another change*/
INSERT dbo.t1 (Id )
VALUES ( 3 )

/*Take another diff backup*/
BACKUP DATABASE DiffRestoreTest 
TO DISK = 'F:\Backup\DRT_DIFF_3.bak' 
WITH INIT, FORMAT, COMPRESSION, DIFFERENTIAL

Ouais, j'ai menti. C'est la partie ennuyeuse.

Vous pouvez restaurer votre sauvegarde complète dans STANDBY:

/*Exit stage left*/
USE master

/*Restore the full backup*/
RESTORE DATABASE DiffRestoreTest
FROM DISK = 'F:\Backup\DRT_FULL.bak' 
WITH REPLACE, STANDBY = 'F:\Backup\DRT_STANDBY.tuf'

Vous pouvez restaurer les différences dans l'ordre avec STANDBY:

/*Square one*/
RESTORE DATABASE DiffRestoreTest
FROM DISK = 'F:\Backup\DRT_DIFF_1.bak' 
WITH STANDBY = 'F:\Backup\DRT_STANDBY.tuf'

/*Square 2*/
RESTORE DATABASE DiffRestoreTest
FROM DISK = 'F:\Backup\DRT_DIFF_2.bak' 
WITH STANDBY = 'F:\Backup\DRT_STANDBY.tuf'

/*Square 3*/
RESTORE DATABASE DiffRestoreTest
FROM DISK = 'F:\Backup\DRT_DIFF_3.bak' 
WITH STANDBY = 'F:\Backup\DRT_STANDBY.tuf'

Et contrairement à ces fichiers journaux embêtants, vous pouvez également avancer lors de la restauration des différences:

/*Restore the full backup*/
RESTORE DATABASE DiffRestoreTest
FROM DISK = 'F:\Backup\DRT_FULL.bak' 
WITH REPLACE, STANDBY = 'F:\Backup\DRT_STANDBY.tuf'

/*What happens if I try to jump the restores?*/
RESTORE DATABASE DiffRestoreTest
FROM DISK = 'F:\Backup\DRT_DIFF_3.bak' 
WITH STANDBY = 'F:\Backup\DRT_STANDBY.tuf'

Si vous souhaitez tester la lisibilité, exécutez-le simplement entre les commandes de restauration. Vous devriez voir les ID s'incrémenter avec chacun. Si vous ne le faites pas, vous avez fait quelque chose d'horriblement mal.

Gardez à l'esprit que lorsque vous restaurez des fichiers, cela expulse tous les utilisateurs finaux de la base de données et n'attendra pas la fin de leurs requêtes.

Cela laisse également la base de données en lecture seule, aucune modification ne peut être effectuée ici.

SELECT * 
FROM DiffRestoreTest.dbo.t1 AS t

Et enfin, nettoyez-vous après vous-même.

/*Bring'er online, lad*/
RESTORE DATABASE DiffRestoreTest WITH RECOVERY

DROP DATABASE DiffRestoreTest

J'espère que cela t'aides!!

Erik Darling
la source