Que se passe-t-il lors d'une sauvegarde SQL Server en direct?

18

Certains de mes collègues ont été surpris lorsque je leur ai dit que je pouvais sauvegarder une base de données SQL Server alors qu'elle était toujours en cours d'exécution et se sont demandé comment c'était possible. Je sais que SQL Server est capable de sauvegarder une base de données alors qu'elle est encore en ligne mais je ne sais pas comment expliquer pourquoi c'est possible. Ma question est quel effet cela a-t-il sur la base de données?

Si les données sont modifiées (par insertion, mise à jour ou suppression) pendant l'exécution de la sauvegarde, la sauvegarde contiendra-t-elle ces modifications ou sera-t-elle ajoutée à la base de données par la suite?

Je suppose que le fichier journal joue un rôle important ici, mais je ne sais pas trop comment.

edit: Tout comme une note, mon cas implique la sauvegarde des bases de données à l'aide de l'Agent SQL Server et les effets des modifications de base de données au cours de ce processus.

Sean Howat
la source

Réponses:

24

La sauvegarde complète contient à la fois les données et le journal. Pour les données, il copie simplement chaque page de la base de données dans la sauvegarde, comme c'est le cas au moment où il lit la page. Il ajoute ensuite dans le support de sauvegarde tout le journal «pertinent». Cela inclut, à tout le moins, tout le journal entre le LSN au début de l'opération de sauvegarde et le LSN à la fin de l'opération de sauvegarde. En réalité, il y a généralement plus de journal, car il doit inclure toutes les transactions actives au début de la sauvegarde et le journal nécessaire à la réplication. Voir Démystifier quelques mythes autour des sauvegardes complètes de bases de données .

Lorsque la base de données est restaurée, toutes les pages de données sont copiées dans les fichiers de base de données, puis toutes les pages de journal sont copiées dans le ou les fichiers journaux. La base de données est incohérente pour le moment, car elle contient des images de page de données qui peuvent ne pas être synchronisées entre elles. Mais maintenant, une reprise normale est exécutée. Étant donné que le journal contient tout le journal pendant la sauvegarde, à la fin de la récupération, la base de données est cohérente.

Remus Rusanu
la source
1
Un excellent article et le lien ont fourni un bon exemple. Merci.
Sean Howat
Très concis. Bon travail!
allen1
2

Pendant la sauvegarde, un instantané sera créé pour la base de données et les données seront lues pour la sauvegarde à partir de cet instantané. Les opérations DB réelles en direct n'affecteront pas l'opération de sauvegarde.

Aravind
la source
1

Vous ne pouvez pas simplement le copier car il peut y avoir des modifications à la mi-copie de la base de données comme vous l'avez mentionné dans la question.

Cela doit être fait avec des agents qui connaissent la fonctionnalité de la base de données, puis prennent un "instantané" via les fonctions du système d'exploitation ou peuvent utiliser un utilitaire pour vider la base de données dans un état sûr (comme mysqldump, si vous utilisez mysql).

Sinon, vous obtenez une sauvegarde qui peut être corrompue et vous ne la saurez pas avant de la restaurer. Je pense que Joel et Jeff en ont récemment parlé un peu lors d'un récent podcast StackOverflow.

Et vous avez raison, le fichier journal est important. Si le fichier journal / journal n'est pas synchronisé avec les données réelles, la restauration des fichiers entraînera une corruption.

Il se résume à une sauvegarde effectuée à l'aide d'un état sûr de la base de données, soit via un agent sensible à la base de données, soit une application de capture instantanée ou une application qui sait comment correctement connecter la base de données à la suppression de données sans interférer avec les mises à jour pendant le vidage des données, puis la sauvegarde le fichier résultant.

Bart Silverstrim
la source
Il s'agit d'une réponse plus généralisée, mais j'ai oublié d'inclure que je travaillais via SQL Server Agent au début. Il a quand même fourni de bons détails sur ce qui pourrait se passer pendant ce processus malgré la méthode, donc ça a quand même aidé! Merci.
Sean Howat
0

Il y a tellement de façons de le faire (en général, aucune idée de la façon dont MSSQL le fait normalement) comme simplement vider la base de données dans un fichier tout en ajoutant des modifications à un fichier journal qui est validé une fois le vidage terminé - utiliser un instantané spécifique au système de fichiers des fonctionnalités comme VSS sur Windows.

Oskar Duveborn
la source
Les bases de données basées sur MVCC à partir de zéro (comme PostGres) peuvent également utiliser cet ensemble de comportements pour conserver un instantané à partir duquel la sauvegarde copie tout en autorisant les mises à jour des fichiers de données par les transactions qui démarrent pendant l'exécution de la sauvegarde. Comme vous le dites, il existe plusieurs méthodes, celle utilisée dépend de la conception de base du moteur de stockage des données et des fonctionnalités de traitement des transactions.
David Spillett
-1

Vous pouvez prendre ce qui est connu comme une sauvegarde en copie seule. N'affectera pas la base de données lorsqu'elle est en ligne

darotweiler
la source
Qu'est-ce qu'une sauvegarde en copie seule? Comment est-elle réalisée? Y a-t-il des mises en garde à considérer? Des liens vers des exemples d'une telle bête en cours d'exécution? Si vous voulez soumettre une réponse, imaginez ce qui pourrait être utile de trouver si quelqu'un avait cette question dans 2-3 ans.
rnxrx