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.
la source
COPY_ONLY
- Si l'OP devait effectuer une sauvegarde complète régulière le jour 1 et uneCOPY_ONLY
sauvegarde 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?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.
exdupe
par 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.
la source
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.
la source
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.
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
master
base de données -sys.database_file
ou (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 .
differential_base_lsn
la base des sauvegardes différentielles. Les étendues de données modifiées aprèsdifferential_base_lsn
seront incluses dans la sauvegarde différentielle.differential_base_guid
est l'identifiant unique de la sauvegarde de base sur lequel une sauvegarde différentielle est basée.differential_base_time
le 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 :
la source