编程知识 cdmana.com

MySQL Learning - Logging System Redo log and Bin log

「C'est ma participation11Le défi du mois de juin25Oh, mon Dieu.,Voir les détails de l'événement:2021Un dernier défi

Auteur:Tang Yuan

Blogs personnels:javalover.cc

Préface

redo log Et bin log Ces deux systèmes de journalisation,Est utilisé pour stocker les opérations de mise à jour,Mais ils les stockent différemment;

redo log Quelles modifications ont été apportées au stockage primaire,Comme mettrename="javalover"Modifier comme suit: name="admin";

Etbin log Non seulement stocker les modifications apportées,La logique originale modifiée est également stockée,Par exemple,update t set name=admin where id=1,Cette déclaration etname="admin"Dernière valeur.

Voici le déroulement du travail et la différence entre les deux

Table des matières

  1. redo log
  2. bin log
  3. change buffer
  4. Processus d'exécution du Journal
  5. redo log Et bin log La différence entre

Texte

1. redo log

redo log Redo log, Il appartient au niveau du moteur de stockage ,- Oui.InnoDB Unique ,MyISAMLe moteur ne supporte pas;

Taille de l'espace:

redo log La taille de l'espace occupé est fixe ,Par exemple, nous donnonsredo logC'est attribué.4Fichiers,Chaque fichier occupe1G,Alorsredo log La taille fixe de 4G;

Quandredo log Quand il est plein, L'opération de fusion est effectuée ,Oui.redo log Les enregistrements sont fusionnés sur le disque de base de données ;

Il y a aussi un WALLe concept de;

WALMécanismes:

Nom complet write ahead logging, En gros, ça veut dire d'abord écrire un journal ,Réécrire le disque, Le but est d'améliorer les performances ;

Parce que si chaque opération de mise à jour doit être écrite sur le disque , Il faut d'abord extraire la page de données du disque ,Puis mise à jour, Enfin écrit sur le disque ;

C'est comme ça., Randomisation des disques IOÇa va coûter cher.;

Donc à traversWALMécanismes, Notez d'abord l'opération de mise à jour à redo logMoyenne, Et pendant que le système est inactif , Puis fusionner sur le disque , La fusion à ce stade est écrite séquentiellement ,DisqueIOTrès peu coûteux;

write_point Et check_point:

write_point Point d'écriture Et check_point Effacer les points , Peut être compris comme deux pointeurs ,write_point Responsable de l'emplacement de l'enregistrement à écrire ,Etcheck_point Responsable de pointer vers la position à effacer ;

Imaginez ces deux points comme un crayon et une gomme ;

Au début,, Les deux pointeurs font référence à redo logPoint de départ,Comme suit:

image-20211123164303658

C'est enregistré. 1Après les données,write_point Qui se déplace vers l'avant 1Une fois,Etcheck_pointNe bouge pas:

image-20211123164729273

Lorsque l'enregistrement est complet , Impossible de continuer à écrire ,check_point Qui se déplace vers l'avant , Fusionner les enregistrements dans la base de données , Et effacer cette partie de l'enregistrement ;

crash-safe:

C'estcrash-safe,C'est quandMySQL Redémarrage anormal du Service , Les documents soumis antérieurement ne seront pas non plus perdus ;

C'estcrash-safeEst basé surredo logRéalisé,Etredo logEncoreInnoDBSpécifique au moteur, C'est pourquoi nous recommandons souvent InnoDBMoteur,Parce que c'est plus sûr.;

2. bin log

bin log Archiver le journal,DeServiceQuelque chose de stratifié, Pas de moteur de stockage ;

C'est - à - dire:bin logNon seulement pour soutenirInnoDBMoteur,Il soutient égalementMyISAMMoteur;

Maintenant qu'il y aredo log Pourquoi? bin logEt alors??

En fait, c'était le premier. bin log, Plus tard. redo log;

Au début,,MySQL Le moteur de stockage pour MyISAMMoteur,EtMyISAM Le moteur ne supporte que bin log, C'est - à - dire le Journal d'archives , Il n'a pas crash-safeCapacité de;

Et puis il y aInnoDBMoteur,Il soutientredo log Redo log, C'est tout ce qu'il faut. crash-safeCapacité;

On dirait quebin log Ça ne sert à rien. ,Alors pourquoi?MySQL Ne pas annuler directement bin logEt alors??

Parce qu'il y aMySQLToujours avecMyISAMMoteur,Annulez.bin logEt si, Alors ils n'ont même pas le journal de base ;

3. change buffer

Nous avons une introduction à l'article précédent change buffer, Lors de l'opération de mise à jour , Les enregistrements de mise à jour sont stockés dans change buffer;

C'est...change bufferEtredo logQu'est - ce que ça peut faire??

Commençons par le même endroit : En fait, leur but est le même , Tout ça pour réduire les disques IOFonctionnement;

Ensuite, il y a différents endroits :

  1. Opération de mise à jour: L'opération de mise à jour écrit d'abord l'enregistrement de mise à jour à change_buffer, Puis synchronisez - vous avec redo log;
  2. Opération de lecture:Si danschange buffer Lire les données , Il faut d'abord changge buffer Les pages sales sont brossées sur le disque et lues ;Si danschange buffer Aucune donnée correspondante n'a été lue dans , Alors continue. redo logRecherche dans;
  3. DisqueIO:change buffer Mettre l'accent sur la réduction du nombre de lectures aléatoires sur disque ,Etredo log Concentrez - vous sur la réduction du nombre d'écritures aléatoires sur le disque ;Parce que si ce n'est pas le cas,change buffer, Donc chaque opération de mise à jour lit le disque et est aléatoire , Il en résulte une faible efficacité ;

En fait, en résumé , Lire ou écrire , Tout d'abord. change bufferOpération centrale, Et puis on verra si on y va redo logOpération centrale;

4. Processus d'exécution du Journal

Nous analysons ici les énoncés suivants à titre d'exemple : Supposons ici que le système utilise deux journaux redo logEtbin log

update t set age=10 where id=1;
Copier le Code
  1. L'actionneur est d'abord sorti du moteur de stockage id=1 Cette ligne de données : Si la page de données sur laquelle se trouve cette ligne de données est en mémoire ,Retour direct à; Si elle n'est pas en mémoire , La page de données correspondante doit d'abord être lue à partir du disque ,Et revenir à;
  2. Une fois que l'actionneur a reçu les données retournées par le moteur ,Va correspondre àageSet to10, Et mettre à jour les pages de données en mémoire , En même temps, conservez le dossier d'opération à redo logMoyenne,En ce momentredo logInprepareStatut;
  3. Ensuite, stockez l'enregistrement de l'opération dans bin logMoyenne;
  4. L'actionneur final engage la transaction ,En ce momentredo logDevientcommitStatut, Cette mise à jour est terminée ;

Il s'agit d'un concept de soumission en deux étapes ;

Soumission en deux étapes

C'est vrai.redo logDis, Ce n'est pas écrit en une seule fois , Mais deux fois. ;

Défini à prepareStatut, Et j'ai attendu bin logÉcrire le journal;

Attendez.bin logAprès une écriture réussie, Transaction à soumettre ,En ce momentredo log Réglé par le moteur à commitStatut;

L'objectif est d'assurer la cohérence des transactions ,C'est - à - dire:redo logEtbin log Ont un dossier de mise à jour cohérent ;

5. redo log Et bin logLa différence entre

Tout ce qui précède couvre , Voici un tableau pour illustrer ,Plus clair:

redo log bin log
Moteur de stockage InnoDB InnoDB, MyISAM
MySQLCouche de schéma Niveau moteur de stockage ServiceNiveau de service
Mode de stockage Journal physique, Quelles modifications ont été apportées au stockage Journal logique, .Stocke les énoncés logiques modifiés et les résultats
Occupation de l'espace Taille fixe, Vider une partie de l'enregistrement après l'avoir rempli Ajouter une écriture

Résumé

redo logDeInnoDBSpécifique au moteur,Soutiencrash-safe,C'est - à - direMySQL Après un redémarrage anormal du Service , Les enregistrements de données soumis précédemment peuvent également être trouvés ;

bin logDeServiceCouche, Tous les moteurs sont pris en charge ,Taille non fixée, Ajouter une écriture ;

change buffer Et redo logComplémentaire: Les données de mise à jour sont d'abord écrites à change buffer,Réécrireredo log; Demande d'abord les données. change bufferCherche., Je ne peux pas le trouver. redo logCherche.

版权声明
本文为[Tang yuanxue Java]所创,转载请带上原文链接,感谢
https://cdmana.com/2021/11/20211125174016402h.html

Scroll to Top