Maison >base de données >tutoriel mysql >Comment configurer les fichiers journaux MySQL, annuler le journal et refaire le journal
Le journal d'annulation est utilisé pour stocker la valeur avant que les données ne soient modifiées. Supposons que les données de ligne avec id=2 dans la table tba soient modifiées et que Name='B' soit remplacé par Name = 'B2', alors le journal d'annulation sera être utilisé pour stocker l'enregistrement Name='B', s'il y a une exception dans cette modification, vous pouvez utiliser le journal d'annulation pour implémenter l'opération de restauration et assurer la cohérence de la transaction.
L'opération de modification des données provient principalement de INSERT UPDATE DELETE, et UNDO LOG est divisé en deux types, l'un est INSERT_UNDO (opération INSERT), qui enregistre la valeur de clé unique insérée ; Y compris les opérations UPDATE et DELETE), enregistrez les valeurs de clé uniques modifiées et les anciens enregistrements de colonnes.
Id | Name | ||||||||||
1#🎜🎜 # | A|||||||||||
B | |||||||||||
C | |||||||||||
D | #🎜🎜 # | #.#1.2 Paramètre UNDO#🎜🎜 ## 🎜🎜#Les paramètres liés à MySQL liés à UNDO sont définis :
Id | Nom |
1 | A |
2 | B |
3 | C |
4 | D |
Notez ici la différence entre le journal redo et le journal binaire. Le journal redo est généré par la couche du moteur de stockage, tandis que le journal binaire est généré par la couche de base de données. Supposons qu'une transaction volumineuse insère 100 000 lignes d'enregistrements dans tba. Au cours de ce processus, les enregistrements sont continuellement enregistrés de manière séquentielle dans le journal redo, mais le journal binaire ne sera pas enregistré. Ce n'est que lorsque la transaction sera validée qu'elle sera écrite dans le fichier journal binaire. une fois. Il existe trois formats d'enregistrement différents disponibles pour les journaux binaires, à savoir les lignes, les instructions et les mixtes, et les formes d'enregistrement parmi eux sont différentes.
innodb_log_files_in_group
innodb_log_group_home_dir
Redo Log zone de cache, par défaut 8M, peut être définie sur 1-8M . Retardez l'écriture du journal des transactions sur le disque, placez le journal de rétablissement dans le tampon, puis videz le journal du tampon vers le disque en fonction du paramètre innodb_flush_log_at_trx_commit.
#🎜 🎜#
innodb_flush_log_at_trx_commit=0, pendant la transaction, le journal est toujours actif dans le tampon de journalisation, tout comme les autres paramètres, mais lorsque la transaction est validée, pas de réécriture L'opération se produit. Au lieu de cela, MySQL fonctionne en interne une fois par seconde pour écrire les données du tampon de journalisation dans le système. En cas de crash, les opérations de modification de transaction dans un délai d'une seconde seront perdues.
Remarque : En raison de problèmes de politique de planification des processus, il n'est pas garanti que cette opération "effectuer un vidage (vidage sur le disque) toutes les secondes" être 100 % de "par seconde".
2.3
Le fichier Redo log porte le nom de
Le Redo log écrit les fichiers de manière séquentielle. Lorsqu'il est plein, il reviendra au premier fichier et. écrasez-le. (Mais lors de la restauration du point de contrôle, la marque du point de contrôle d'en-tête du premier fichier journal sera également mise à jour, donc à proprement parler, elle n'est pas comptée comme une écriture séquentielle).Do checkpointib_logfile[number]
Supposons qu'il y ait deux données A et B avec les valeurs 1 et 2 respectivement. Démarrez une transaction. Le contenu de l'opération est : modifier 1 à 3 et. 2 à 4. Ensuite, l'enregistrement réel est le suivant (simplifié) :
B. Enregistrez A=1 pour annuler le journal.
D. Enregistrez A=3 pour refaire le journal.
3.2 Impact des IO
L'objectif principal de la conception d'Undo + Redo est d'améliorer Performances d'entrée et de sortie, augmentent la puissance de traitement de la base de données. On peut voir que B D E G H sont toutes de nouvelles opérations, mais B D E G est mis en mémoire tampon dans la zone tampon. Seul G ajoute des opérations d'E/S. Afin de garantir que Redo Log puisse avoir de meilleures performances d'E/S, la conception du Redo Log d'InnoDB a les fonctionnalités suivantes : B. Essayez de vous assurer que Redo Log est stocké dans un espace continu. Par conséquent, l’espace du fichier journal sera entièrement alloué lors du premier démarrage du système. Afin d'améliorer les performances, Redo Log sera enregistré de manière séquentielle et complété étape par étape.B. Écrivez les journaux par lots. Le journal n'est pas écrit directement dans le fichier, mais d'abord écrit dans le tampon de journalisation. Lorsque le journal doit être vidé sur le disque (comme la soumission d'une transaction), plusieurs journaux sont écrits ensemble sur le disque. 🎜🎜# C. Concurrence Les transactions partagent l'espace de stockage du Redo Log, et leurs Redo Logs sont enregistrés ensemble alternativement selon l'ordre d'exécution des instructions pour réduire l'espace occupé par le log. Par exemple, le contenu de l'enregistrement dans Redo Log peut ressembler à ceci :
Enregistrement 1 :Enregistrement 2 :Enregistrement 3 :
D. Grâce au C, lorsqu'une transaction écrit le Redo Log sur le disque, les journaux des autres transactions non validées seront également écrits sur le disque.
Enregistrement 4 :
Enregistrement 5 :
E. Seules les opérations d'ajout séquentielles sont effectuées sur le journal de rétablissement. Lorsqu'une transaction doit être annulée, ses enregistrements de journal de rétablissement ne seront pas supprimés du journal de rétablissement.
3.3 RécupérationA. Lors de la récupération, refaites uniquement les transactions validées.
Lors de la récupération, toutes les transactions doivent être réexécutées, y compris les transactions non validées et annulées. Annulez ensuite ces
transactions non validées via Annuler le journal.
Le moteur de stockage de la base de données MySQL InnoDB utilise la stratégie B,
Le mécanisme de récupération du moteur de stockage InnoDB a plusieurs caractéristiques : A. Lors de la restauration Log, ne vous
vous souciez pas du caractère transactionnel. Pendant la récupération, il n'y a pas de comportement BEGIN, COMMIT ou ROLLBACK. Peu importe à quelle transaction appartient chaque journal. Bien que le contenu lié à la transaction, tel que l'ID de transaction, soit enregistré dans le Redo Log, ce contenu n'est considéré que comme une partie des données à exploiter. B. Lors de l'utilisation de la stratégie B, le journal d'annulation doit être conservé et le journal d'annulation correspondant doit être écrit sur le disque avant d'écrire le journal de rétablissement. Cette relation entre Undo et Redo Log rend la persistance compliquée. Afin de réduire la complexité, InnoDB traite Undo Log comme des données, de sorte que l'opération d'enregistrement d'Undo Log sera également enregistrée dans le redo log. En mettant en cache les journaux d'annulation dans la mémoire, la nécessité d'écrire les journaux de rétablissement sur le disque avant de les écrire est évitée.
Le journal de rétablissement contenant l'opération d'annulation du journal ressemble à ceci :Enregistrement 1 :Annuler l'insertion du journal
> Enregistrement 2 :Enregistrement 3 : Annuler l'insertion du journal
Enregistrement 4 : Enregistrement 5 :
Annuler l'insertion du journal > Enregistrement 6 :
C. À ce stade, il y a toujours un problème qui n'a pas été résolu. clarifié. Puisque Redo n'est pas transactionnel, ne serait-il pas possible de réexécuter la transaction annulée ?
C'est vrai. Dans le même temps, Innodb enregistrera également les opérations lors de l'annulation des transactions dans le journal redo. Lorsqu'une opération de restauration est effectuée, les modifications apportées aux données sont enregistrées dans le journal de rétablissement, car l'opération de restauration modifie également les données.
Le journal de rétablissement d'une transaction annulée ressemble à ceci :
Enregistrement 1 :Enregistrement 2 :insert A
…> Enregistrement 3 :# 🎜🎜# Enregistrement 4 : …>update B
…>
Enregistrement 5 :># 🎜🎜# Enregistrement 6 : delete C
Enregistrement 7 :insert C> enregistrement 8 : < ;trx1,
mettre à jour B vers l'ancienne valeur>
Enregistrement 9 :supprimer A># 🎜🎜# L'opération de récupération d'une transaction annulée consiste à refaire d'abord puis à annuler, afin que la cohérence des données ne soit pas détruite.
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!