Maison > Article > base de données > Introduction aux problèmes de journalisation courants dans MySQL
Cet article vous présente une introduction aux problèmes de journalisation courants dans MySQL. Il a une certaine valeur de référence. Les amis dans le besoin peuvent s'y référer. J'espère qu'il vous sera utile.
Il existe deux journaux dans MySQL, à savoir : le journal redo et le journal d'archive (binlog). (Cours recommandés : Tutoriel MySQL)
Parmi eux, binlog peut être utilisé pour les bases de données de secours, ou il peut être enregistré pour restaurer les données historiques de la base de données. Il est implémenté au niveau du serveur et peut être partagé par tous les moteurs. Le journal redo est un journal unique à InnoDB et est utilisé pour prendre en charge les fonctionnalités de sécurité en cas de crash.
Vous devez avoir entendu parler de la validation en deux phases des transactions MySQL, ce qui signifie que lorsque la transaction est soumise, elle est divisée en deux étapes : préparer et valider.
La figure 1 montre le processus d'exécution d'une transaction. Vous pouvez voir dans les trois dernières étapes que la préparation du journal redo est terminée en premier, puis le binlog est écrit et enfin l'étape de validation du journal redo est entrée.
Figure 1 Schéma de soumission en deux étapes
Ici, je veux d'abord vous expliquer un malentendu : cette image n'est-elle pas l'exécution d'une mise à jour déclaration ? Processus ? Comment se fait-il que l'instruction de validation soit appelée ?
Habituellement, la raison pour laquelle vous vous posez cette question est que vous confondez les deux concepts de « commit » :
dans la question La « déclaration de commit » fait référence à la commande utilisée pour valider une transaction dans la syntaxe MySQL. Généralement utilisé conjointement avec start/start transaction. L'« étape de validation » utilisée dans notre image fait référence à une petite étape dans le processus de soumission de la transaction et constitue également la dernière étape. Une fois cette étape terminée, la transaction est soumise. Lorsque « l'instruction de validation » est exécutée, elle inclura « l'étape de validation ». Dans notre exemple, la transaction n'est pas explicitement démarrée, donc l'instruction de mise à jour elle-même est une transaction. Cette "étape de validation" sera utilisée lors de la validation de la transaction une fois l'exécution terminée. Ensuite, analysons ce qui se passe lorsque MySQL redémarre anormalement à différents moments au cours de la soumission en deux phases.
La soumission en deux étapes consiste à donner une chance à chacun. Quand tout le monde dit « je vais bien », soumettez ensemble.
Question 5 : Sans introduire deux logs, il n'est pas nécessaire de procéder à une soumission en deux phases. N'est-il pas suffisant d'utiliser uniquement binlog pour prendre en charge la récupération après incident et également prendre en charge l'archivage ?
Réponse : Si je traduis à nouveau cette question, cela signifie que seul le binlog est conservé, et ensuite le processus de soumission peut être modifié comme suit :... -> "Mettre à jour les données en mémoire" -> "Write binlog " -> "Commit transaction", offre-t-il également la possibilité de récupérer après un crash ?
La réponse est non.
S’il y a une raison historique, c’est qu’InnoDB n’est pas le moteur de stockage natif de MySQL. Le moteur natif de MySQL est MyISAM, qui n'a pas été conçu pour prendre en charge la récupération après incident.
Avant qu'InnoDB ne rejoigne la famille des moteurs MySQL en tant que plug-in MySQL, il s'agissait déjà d'un moteur qui assurait la récupération en cas de crash et la prise en charge des transactions.
Après la connexion d'InnoDB à MySQL, j'ai découvert que puisque le binlog n'avait pas la capacité de se remettre d'un crash, il était préférable d'utiliser le journal de rétablissement d'origine d'InnoDB.
Et si l'on parle de raisons de mise en œuvre, il y en a beaucoup. Comme mentionné dans la question, seul binlog est utilisé pour implémenter le processus de récupération après incident. J'ai dessiné un diagramme schématique et il n'y a pas de journal de rétablissement ici.
Figure 2 Seul binlog prend en charge la récupération après incident
Dans un tel processus, binlog ne peut toujours pas prendre en charge la récupération après incident. Permettez-moi de parler d'un point qui n'est pas supporté : binlog n'a pas la possibilité de restaurer des "pages de données".
Si vous êtes à la position marquée dans l'image, c'est-à-dire lorsque binlog2 a été écrit mais que la totalité de la transaction n'a pas encore été validée, MySQL plante.
Après le redémarrage, la transaction interne du moteur 2 sera annulée, puis binlog2 pourra être appliqué pour la rattraper ; mais pour la transaction 1, le système a déjà considéré la soumission terminée et n'appliquera plus binlog1 ;
Cependant, le moteur InnoDB utilise la technologie WAL Lors de l'exécution d'une transaction, la transaction est terminée après écriture dans la mémoire et dans le journal. S'il plante plus tard, comptez sur le journal pour récupérer les pages de données.
C'est-à-dire que si un crash se produit à cet endroit de la figure, la transaction 1 peut également être perdue et le niveau de la page de données sera perdu. Pour le moment, les détails de mise à jour de la page de données ne sont pas enregistrés dans le journal binaire et ne peuvent pas être restaurés.
Si vous voulez le dire, puis-je optimiser le contenu du binlog et le laisser enregistrer les modifications dans la page de données ? Oui, mais il s'agit en fait simplement de créer un autre journal de rétablissement.
Ainsi, au moins la capacité actuelle du binlog ne peut pas prendre en charge la récupération après incident.
Question 6 : Peut-il être inversé et utiliser uniquement le redo log au lieu du binlog ?
Réponse : Du point de vue de la récupération après crash, tout va bien. Vous pouvez désactiver binlog afin qu'il n'y ait pas de validation en deux phases, mais que le système soit toujours protégé contre les crashs.
Cependant, si vous examinez les scénarios d'utilisation de diverses entreprises du secteur, vous constaterez que binlog est toujours activé dans les bibliothèques de production officielles. Parce que binlog a des fonctions que le redo log ne peut pas remplacer.
L’une est l’archivage. Le journal redo est écrit en boucle. Lors de l'écriture jusqu'à la fin, vous devez revenir au début et continuer à écrire. De cette manière, le journal historique ne peut pas être conservé et le journal redo ne peut pas servir d'archive.
La première est que le système MySQL s'appuie sur binlog. Binlog est une fonction que MySQL possède depuis le début et est utilisée dans de nombreux endroits. Parmi eux, la base de la haute disponibilité du système MySQL est la réplication des journaux binaires.
Il existe également de nombreuses entreprises dotées de systèmes hétérogènes (comme certains systèmes d'analyse de données), et ces systèmes s'appuient sur la consommation du binlog MySQL pour mettre à jour leurs propres données. Si binlog est désactivé, ces systèmes en aval ne pourront pas entrer.
En bref, puisque de nombreux mécanismes système, y compris la haute disponibilité de MySQL, s'appuient désormais sur binlog, le redo log "la colombe occupant le nid de la pie" n'est pas encore possible. Vous voyez, combien il est important de développer une écologie.
Enfin, je vous recommande de faire attention à la colonne "MySQL Practical Lectures 45" de Ding Qi. Dans la colonne, Ding Qi vous aidera à trier les principales connaissances de l'apprentissage de MySQL, telles que les transactions, les index, les verrous, etc., et analysera et discutera également avec vous des problèmes spécifiques souvent rencontrés au cours du processus de développement, et vous aidera à comprendre l'essence des problèmes. Vous recevrez des explications détaillées sur la technologie et les principes de base de MySQL, ainsi qu'une analyse de 36 problèmes courants de MySQL. Le binlog au format
instruction aura COMMIT à la fin ; le binlog au format
row aura un événement XID à la fin.
De plus, après la version MySQL 5.6.2, le paramètre binlog-checksum a également été introduit pour vérifier l'exactitude du contenu du binlog. Pour les journaux binlog qui peuvent contenir des erreurs au milieu du journal en raison de problèmes de disque, MySQL peut le découvrir en vérifiant les résultats de la somme de contrôle. Par conséquent, MySQL dispose toujours d'un moyen de vérifier l'intégrité du journal binaire des transactions.
Réponse : Ils ont un champ de données commun appelé XID. Lors d'une récupération après incident, le journal de rétablissement sera analysé dans l'ordre :
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!