Lors du test de l'utilitaire de sauvegarde Back In Time de Linux, j'ai constaté que je ne comprenais pas comment MariaDB sauvegardait les données.
Après avoir ajouté un enregistrement fictif à une table et l'avoir laissée jusqu'au prochain instantané, j'ai été surpris de constater que la restauration de l'ancien instantané (prise avant l'ajout de l'enregistrement fictif) n'entraînait pas la suppression de cet enregistrement.
J'ai essayé deux fois de plus: un nouvel enregistrement factice ajouté, un instantané se produit (automatiquement, car c'est ce que j'ai dit à Back In Time) ... et la restauration ne fait pas ce que j'avais prévu.
En regardant les fichiers «Modifiés par», dans le répertoire principal (où toutes les bases de données sont des sous-répertoires), je constate que seuls deux fichiers semblent avoir changé: ib_logfile0
et ib_logfile1
. Lors de la configuration de mon travail Back In Time, j’ai délibérément omis de les exclure de la configuration car j’imaginais que c’était «juste des journaux». Clairement PAS.
Pour résoudre mon problème immédiat, il me semble que tout ce que j'ai à faire est d'inclure ces deux fichiers dans mes instantanés. Mais comment ou par quel processus ibdata1
être mis à jour avec les nouvelles informations? Est-ce peut-être lorsque le service MySQL est arrêté? Ou commencé?
Ce qui est étrange, c’est que je ne semble pas trouver beaucoup d’informations à ce sujet.
ibdata1
,ib_logfile0
etib_logfile1
des dossiers. Il suffit de fermer MySQL, de supprimer ces fichiers et MySQL les reconstruira au redémarrage.ib_logfile0/1
... Vous semblez impliquer que MySQL met effectivement à jouribdata1
quand il ferme ... mais que se passe-t-il en cas de coupure brutale d'une machine? Évidemment, je peux faire des expériences moi-même pour essayer de trouver des réponses ...ibdata1
est nécessaire.ib_logfile0
etib_logfile1
ne sont pas.Réponses:
Vous ne pouvez pas utiliser un utilitaire de sauvegarde générique tel que Back in Time pour sauvegarder des bases de données.
Comme vous l'avez découvert, vous avez besoin d'un instantané cohérent des fichiers de base de données pour pouvoir effectuer une sauvegarde. Sans cela, vous vous retrouverez avec quelque chose qui n'est pas correct ou qui ne démarre pas. Le problème est que
ib_logfile*
sont temporairement stockés puis migrés vers les tablespaces. Vous ne pouvez les supprimer que si vous arrêtez proprement (ce qui est plus qu'un systemctl stop mysqld), ce qui ne s'est évidemment pas produit lorsque vous avez effectué la sauvegarde.En bref pour MySQL, utilisez un programme de sauvegarde compatible avec MySQL (mysqldump, mydumper, xtrabackup), ou un outil de capture instantanée cohérent (captures instantanées llvm ou une fonctionnalité de capture instantanée cohérente basée sur un système de fichiers), ou une réplique asservie d’une des méthodes précédentes.
Jouer avec les fichiers de données MySQL en dehors de MySQL n'entraînera que des pertes de données. Ne le fais pas.
la source