Comment le moteur InnoDB de MySQL met-il à jour ses principaux fichiers de stockage de données?

0

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.

mike rodent
la source
Ce problème ne concerne pas autant MySQL que les méthodes utilisées par le moteur de stockage InnoDB. À ma connaissance, vous n’avez même pas besoin de copier le ibdata1, ib_logfile0 et ib_logfile1 des dossiers. Il suffit de fermer MySQL, de supprimer ces fichiers et MySQL les reconstruira au redémarrage.
JakeGould
Merci ... c'est un indice utile. Spécifique à InnoDB, OK. Arrêtez et supprimez, OK. Mais pour un processus continu d’instantané lorsqu’on travaille sur une base de données, il faut évidemment conserver des instantanés des différentes versions. ib_logfile0/1 ... Vous semblez impliquer que MySQL met effectivement à jour ibdata1 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 ...
mike rodent
Correction: ibdata1 est nécessaire. ib_logfile0 et ib_logfile1 ne sont pas.
JakeGould
Mike - Je vais vous dire quelle configuration je préfère avec MySQL InnoDB Engine est le Espaces de tables de fichiers par table .... beaucoup plus de flexibilité une fois que vous commencez à utiliser cela. C'est littéralement un fichier par configuration de table .... Fou !!!
Pimp Juice IT

Réponses:

0

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.

danblack
la source
Merci ... comme je commence à comprendre: toute une boîte de Pandore. Que se passe-t-il lorsqu'une machine avec des bases de données MySQL reçoit un arrêt brutal, par exemple, par exemple? rien à voir avec l'action volontaire de l'utilisateur? Je suis sûr qu'il y a des réponses et je dois essayer (encore) de chercher. Je vais certainement essayer de chercher sur ces "outils de capture instantanée cohérents" Vous n'avez pas de liens utiles, je suppose? Ou des indications sur le type de protocoles que vous utilisez personnellement?
mike rodent
MySQL, comme d’autres bases de données, adopte les principes ACID, le plus important étant la durabilité. Le pouvoir brutal est une forme d’instantané à un moment donné. Un état suffisant a été pris pour que chaque transaction renvoyée à l'utilisateur avec succès existe dans les fichiers journaux innodb à relire / appliquer au redémarrage du service. Le journal d'annulation des transactions en cours est annulé. lvm snapshot pourrait être utilisé (pas llvm comme je l'ai écrit), mysqldump a une transaction --single-transaction, la taille de la base de données, la bande passante io, le temps de récupération acceptable jouent tous un rôle dans lequel les mécanismes sont utilisés. Je suggère une nouvelle question :-)
danblack