Pourquoi une sauvegarde différentielle ne peut-elle pas spécifier sa base?

18

Ceci est mon premier article DBA.SE, alors s'il vous plaît, informez-moi de toute erreur, merci!

Je suis un nouveau DBA (pas un pro de l'informatique, juste personne d'autre dans l'entreprise pour le faire), donc plus l'explication est basique, mieux c'est. J'ai lu sur les stratégies de sauvegarde de base de données (ou, comme j'ai appris à les appeler, "stratégies de restauration"). Je comprends les fonctions des sauvegardes complètes, différentielles et des journaux de transactions, mais je veux savoir pourquoi une sauvegarde différentielle ne peut être basée que sur la sauvegarde complète la plus récente.

Si une sauvegarde différentielle est tout ce qui a changé depuis la dernière sauvegarde complète, alors pourquoi la différence ne peut-elle pas être basée sur une sauvegarde de mon choix? Pour être plus clair, je demande de spécifier la base lors de la sauvegarde , pas lors de la restauration. Je suppose que lors de la restauration, vous choisirez la base correcte et le différentiel correspondant pour effectuer la restauration (sans utiliser un différentiel fabriqué à partir de la base B pour restaurer à partir de la base A).

Quelle est la raison qui empêche cette fonctionnalité d'être possible? Je pense qu'il doit y avoir une raison, je ne sais pas ce que c'est.

Remarque: je comprends que la base ne peut pas être spécifiée, mais ma question est pourquoi pas ? (Je ne suis pas non plus intéressé par une discussion sur "pourquoi voudriez-vous?")

Analogie

Voici une analogie avec la façon dont je comprends une sauvegarde différentielle:

J'ai un fichier Excel avec des données dans les cellules.

Le jour 1, je fais une copie de ce fichier et je le stocke ailleurs (la "sauvegarde complète").

Le jour 2, je regarde le fichier et le compare à la copie de sauvegarde que j'ai faite le jour 1, et je note toutes les cellules qui ont changé et quelles sont leurs nouvelles valeurs (une "sauvegarde différentielle"). Je ne note pas chaque modification apportée à une cellule, mais uniquement sa valeur finale. Si la cellule A1 commençait comme "Alfred", changeait en "Betty", "Charlie", puis "Dave", je noterais seulement que "A1 est maintenant Dave".

Le jour 3, je compare à nouveau le fichier courant avec le fichier de sauvegarde et note les changements (une autre "sauvegarde différentielle" avec la même base que le jour 2). Encore une fois, ne notant que les valeurs finales par cellule au moment observé, pas toutes les valeurs que la cellule a été tout au long de la journée.

Le jour 4, je compare à nouveau et note à nouveau les changements. Poursuivant avec la cellule A1, maintenant il est dit "Sarah", même si c'était 10 autres noms tout au long de la journée, et tout ce que je note est "Maintenant A1 est Sarah".

Le jour 5, mon dossier est foiré; donc, je regarde la copie de sauvegarde que j'ai faite le jour 1, puis les états finaux notés le jour 4, et j'applique les modifications notées à la copie de sauvegarde et maintenant j'ai le fichier "restauré" à comment c'était au jour 4 Donc, je regarde la sauvegarde effectuée le jour 1, je vois que le jour 4, la cellule A1 se termine par "Sarah", et je change la cellule de sauvegarde A1 en "Sarah".

Pourquoi cela importerait-il si j'avais fait une autre copie de sauvegarde ("complète") du fichier le jour 2? Pourquoi ne serait-il pas encore possible de comparer (lire, "effectuer une sauvegarde différentielle de") le fichier au jour 3 ou 4 avec la copie faite au jour 1? Si je comprends bien, SQL Server m'obligerait à comparer (lors d'une autre sauvegarde différentielle) à une sauvegarde complète effectuée le jour 2 (si une autre avait été effectuée) - aucune autre option.

elmer007
la source

Réponses:

14

Une sauvegarde différentielle utilise ce qu'on appelle la mappe de changement différentiel pour créer une liste de pages qui ont été modifiées depuis la dernière sauvegarde complète. Cette liste est une liste "différentielle", d'où le nom du type de sauvegarde, et la raison pour laquelle la sauvegarde ne peut être restaurée que par-dessus la sauvegarde complète associée.

L'exécution d'une sauvegarde complète réinitialise la carte de modification différentielle. À partir de ce moment, toute page modifiée est enregistrée dans la carte. Si vous prenez ensuite un différentiel, cette sauvegarde ne contient que des pages qui ont été modifiées depuis la dernière sauvegarde complète et enregistrées dans la carte.

Dans votre analogie, les deux sauvegardes complètes, qui servent de base à l'ensemble du processus de restauration, auraient probablement un contenu différent, et donc des cartes différentielles différentes. Si vous restaurez un diff basé sur la première sauvegarde sur la 2e sauvegarde, la base de données serait probablement corrompue. En fait, SQL Server empêche la restauration d'une sauvegarde diff sur tout sauf la sauvegarde complète d'origine sur laquelle elle est basée.

Lorsque vous demandez à SQL Server d'effectuer une sauvegarde différentielle, la seule "base" pour le différentiel est la mappe de modification différentielle unique présente dans la base de données au moment du démarrage de la sauvegarde différentielle. C'est pourquoi vous ne pouvez pas spécifier la base de la sauvegarde différentielle.


En réponse à un commentaire de @MartinSmith - vous pourrez peut-être utiliser des COPY_ONLYsauvegardes pour restaurer une sauvegarde différentielle sur un certain nombre de sauvegardes complètes. Considérez le scénario suivant:

  1. BACKUP DATABASE xyz TO DISK = 'path_to_backup.bak';
  2. BACKUP DATABASE xyz TO DISK = 'path_to_backup_2.bak' WITH COPY_ONLY;
  3. BACKUP DATABASE xyz TO DISK = 'path_to_backup_3.bak' WITH COPY_ONLY;
  4. BACKUP DATABASE xyz TO DISK = 'path_to_backup_4.bak' WITH COPY_ONLY;
  5. BACKUP DATABASE xyz TO DISK = 'path_to_backup_diff.bak' WITH DIFFERENTIAL;

La sauvegarde différentielle à l'étape 5 doit pouvoir être restaurée sur l'une des sauvegardes effectuées aux étapes 1 à 4, car la mappe de modification différentielle n'est effacée que lorsque la sauvegarde complète à l'étape 1 se produit. Les COPY_ONLYsauvegardes des étapes 2, 3 et 4 ne réinitialisent pas la carte de modification. Étant donné que la mappe de modifications différentielles accumule les modifications apportées depuis la sauvegarde complète, chacune des COPY_ONLYsauvegardes successives contient suffisamment d'informations pour que la sauvegarde différentielle fonctionne avec l' une des 4 sauvegardes précédentes.

Bien qu'il semble que cela devrait fonctionner, dans la pratique, la restauration d'un différentiel par-dessus une sauvegarde copy_only entraîne l'erreur suivante:

Msg 3136, niveau 16, état 1, ligne 1
Cette sauvegarde différentielle ne peut pas être restaurée car la base de données n'a pas été restaurée à l'état antérieur correct.
Msg 3013, niveau 16, état 1, ligne 1
RESTORE DATABASE se termine anormalement.

J'ai créé une repro de plate-forme SQL Server 2012 pour tester les restaurations différentielles et copy_only, et enregistré le fichier sur gist.github.com - AVERTISSEMENT le script supprimera toute base de données nommée RestoreTestcomme première étape.

Max Vernon
la source
L'exécution d'une sauvegarde complète ne réinitialise la mappe de changement différentiel que si elle ne l'est pas COPY_ONLY- Si l'OP devait effectuer une sauvegarde complète régulière le jour 1 et une COPY_ONLYsauvegarde complète le jour 2, quels problèmes seraient causés par l'application d'un différentiel ultérieur à partir de cette même base à la sauvegarde du jour 2?
Martin Smith
Je viens de le tester et dans la pratique, il ne permet pas de restaurer le différentiel ultérieur sur un copy_only bien que "Cette sauvegarde différentielle ne peut pas être restaurée car la base de données n'a pas été restaurée à l'état antérieur correct." - Je ne sais pas s'il y a une raison pour laquelle cela ne fonctionnerait pas ou si ce n'est pas implémenté.
Martin Smith
1
@MartinSmith - shooot. J'ai validé ça aussi maintenant.
Max Vernon
5

La fonctionnalité que vous souhaitez peut exister en principe. Il ne serait pas efficace avec les structures de base de données actuelles (voir la réponse de Max Vernon). SQL Server doit soit maintenir un ensemble de mappages de diff, soit comparer le contenu actuel de la base de données à la sauvegarde complète que vous spécifiez comme base.

Il existe des applications qui dédupliquent les fichiers volumineux. Vous pouvez effectuer deux sauvegardes complètes et seules les données modifiées seront réellement stockées. C'est comme un diff avec une base personnalisée. exdupepar exemple, peut le faire.

La bonne chose à ce sujet est qu'il fonctionne avec n'importe quel ensemble de fichiers de sauvegarde. En fait, à partir du 3ème fichier de sauvegarde complet, vous ne paierez que l'utilisation d'espace incrémentielle (non différentielle). L'utilisation de l'espace est la différence par rapport au fichier de sauvegarde précédent (pas au premier). Le stockage de déduplication a un comportement similaire.

Pourquoi la fonctionnalité que vous décrivez n'existe-t-elle pas? Chaque fonctionnalité consomme un budget entraînant la non-présence d'autres fonctionnalités. Celui-ci ne s'est apparemment pas rendu assez loin sur la liste des priorités. Je ne sais pas à quoi cela servirait. On dirait une exigence assez ésotérique d'utiliser des bases personnalisées.

usr
la source
3

Ne confondez pas les sauvegardes du journal des transactions avec les sauvegardes différentielles, elles ont des objectifs différents! Ce que vous appelez une "sauvegarde différentielle", par laquelle vous "notez toutes les modifications apportées aux cellules", est en fait un journal des transactions .

Le but d'une sauvegarde différentielle est de garder la taille du fichier de sauvegarde résultant petite en enregistrant uniquement les informations qui ont changé depuis la dernière sauvegarde complète, et de garder le temps de restauration dans votre objectif de temps de récupération (RTO).

Un but de sauvegarde du journal des transactions est de vous permettre de rejouer les transactions à un point arbitraire dans le temps - souvent, mais certainement pas nécessairement « le plus récent quoi que ce soit de se produire ».

Ce dont vous parlez est en fait possible, mais vous devez restaurer la sauvegarde complète, puis restaurer les journaux de transactions.

Si vous disposez de la sauvegarde complète du jour 1 et de toutes les sauvegardes du journal des transactions entre le jour 1 et le jour 5, rien ne vous empêche de restaurer la sauvegarde du jour 1 et de relire le journal des transactions jusqu'à ce que vous ayez les données telles qu'elles étaient au jour 4. Vous pourrait également commencer à partir de la sauvegarde du jour 2, ce qui serait légèrement plus rapide à restaurer, car vous rejoueriez moins de transactions. Vous pouvez également restaurer la sauvegarde complète du jour 1, la sauvegarde différentielle du jour 3, puis restaurer les journaux de transactions au jour 4.

Modifier: OK, votre analogie modifiée a un peu plus de sens. La réponse est alors "parce que vous pouvez déjà réaliser ce que vous voulez avec les sauvegardes du journal des transactions". Une sauvegarde différentielle est simplement un moyen bon marché et pratique d'enregistrer tout un tas d'activités du journal des transactions. Il n'offre aucune granularité de récupération de données qu'une sauvegarde du journal des transactions n'offre pas. Il n'y a que de nombreuses fonctionnalités qui offrent une «simple commodité» qui en font un produit.

dpw
la source
Je pense que j'ai mal formulé l'analogie, en attente d'un montage ... désolé
elmer007
Modifié pour votre nouvelle analogie.
dpw
1

Donner une analogie avec Excel, c'est comparer des pommes et des oranges. Pourquoi ? Excel n'est pas une base de données car il manque d'intégrité des données. Excel est une jolie feuille de calcul et pourrait être un complément à la base de données.

SQL Server est un système de base de données relationnelle qui vous permet de stocker toutes vos données et fournit un mécanisme pour les interroger. La partie importante est «relationnelle» car la relation de données est importante avec l'intégrité des données (propriétés ACID).

Bases:

Les données de la base de données sont organisées en composants logiques (tables, vues, procs, déclencheurs, etc.) visibles par l'utilisateur. Au minimum, une base de données est également physiquement implémentée en tant que deux fichiers (fichier de données et journal) ou plus (fichier de données secondaire) sur le disque.

  • Une base de données contient une page qui est l'unité fondamentale de stockage de données utilisée pour stocker des enregistrements .
  • Une page de base de données est un bloc de 8 192 octets (8 Ko) d'un fichier de données de base de données.
  • 8 pages physiquement contiguës (8 * 8 Ko = 64 Ko) dans un fichier de base de données forment une étendue .
  • Une page IAM (Index Allocation Map) suit environ 4 Go d'espace dans un seul fichier, aligné sur une limite de 4 Go. Ces blocs de 4 Go sont appelés intervalles GAM .

pourquoi une sauvegarde différentielle ne peut être basée que sur la sauvegarde complète la plus récente. - ou - Si une sauvegarde différentielle est tout ce qui a changé depuis la dernière sauvegarde complète, alors pourquoi le différentiel ne peut-il pas être basé sur une sauvegarde de mon choix?

Sur la base de votre analogie avec Excel, ce que vous faites est d'appliquer ce qui a changé à l'ancien. Ceci applique toutes les transactions validées depuis le journal des transactions with STOP AT(remarque: au jour 5, le fichier est foiré et vous vous arrêtez au jour 4)

Dans chaque section de 4 Go (appelée intervalle GAM) de chaque fichier de données, il y a une page de base de données spéciale appelée un bitmap différentiel qui suit les parties (appelées extensions) de cette section de 4 Go qui ont changé depuis la dernière sauvegarde complète, indiquant les données qui ont changé ou ajouté à la base de données.

Une sauvegarde différentielle analyse ces bitmaps et sauvegarde uniquement les extensions de fichier de données marquées comme modifiées. Les bitmaps sont réinitialisés par la prochaine sauvegarde complète (par conséquent, une sauvegarde différentielle ne peut être basée que sur la sauvegarde complète la plus récente) , de sorte que vous pouvez voir que de plus en plus de modifications de la base de données, une plus grande partie sera marquée dans les bitmaps différentiels et les sauvegardes différentielles successives seront de plus en plus importantes.

Vous pouvez même utiliser ce script pour savoir quelle proportion de la base de données a changé depuis la dernière sauvegarde complète? .

Les informations de base différentielles sont stockées dans la masterbase de données - sys.database_fileou ( sys.master_files- utile lorsque la base de données est en lecture seule ou hors ligne).

Il y a 3 colonnes importantes qui stockent des informations liées à la base différentielle .

  • C'est differential_base_lsnla base des sauvegardes différentielles. Les étendues de données modifiées après differential_base_lsnseront incluses dans la sauvegarde différentielle.
  • La differential_base_guidest l'identifiant unique de la sauvegarde de base sur lequel une sauvegarde différentielle est basée.
  • C'est differential_base_timele temps qui correspond àdifferential_base_lsn

Une sauvegarde différentielle est utile pour accélérer le RTO (objectif de temps de récupération = temps nécessaire pour récupérer votre base de données), par opposition à des sauvegardes complètes plus fréquentes qui seront un problème pour les grandes bases de données ou pour restaurer le volume des sauvegardes du journal des transactions car elles pourraient augmenter. au fil du temps.

Remarque: Une sauvegarde complète COPY_ONLY ne réinitialise pas la base différentielle, donc une sauvegarde COPY_ONLY ne peut pas servir de base différentielle.

Les références :

Kin Shah
la source
2
@PaulSRandal a écrit que des pages existent pour stocker les enregistrements. sur son blog et donc je l'ai référencé tel quel. Prendre en référence logique ce que vous dites (basé sur la référence) est également vrai!
Kin Shah