Maison > Article > base de données > Analyse d'un exemple de processus de persistance des données MySQL
Comprendre le processus de persistance des données MySQL peut nous aider à approfondir notre compréhension de MySQL sous-jacent. Dans cet article, nous allons trier ce processus de manière populaire pour aider tout le monde à établir une compréhension préliminaire, si vous êtes intéressé, vous pouvez étudier et rechercher ce processus en profondeur.
Le stockage des données MySQL peut généralement être divisé en deux parties, les procédures stockées en mémoire et le stockage persistant sur le disque dur. Ici, il s'agit de buffer poll
et de redo log en mémoire. code> et <code>Journal des transactions
et Structure de la table
sur le disque. Dans cet article, nous n'expliquerons pas la conception spécifique de chaque partie en détail, mais nous vous donnerons simplement une compréhension conceptuelle : buffer poll
和redo log
以及磁盘上的事务日志
和表结构
,在本文中,我们不具体解释每一部分的具体设计,只是给大家一个概念型的认识:
buffer poll
是InnoDB引擎缓存池的一部分,我们这里可以简单理解为数据库从磁盘读进内存的内存块的缓存;
redo log
是内存中的逻辑日志,记录了事务的变更操作
事务日志
是磁盘上的食物逻辑日志
表结构
是真正存储数据的结构
buffer poll
中有对于读入内存的数据的缓存,在查询命令执行时,会优先在缓存中查看是否命中,未命中就会从磁盘中将需要的数据读进来,缓存的管理使用的是改良的LRU算法,这里不做深入地介绍了。
当一条修改指令运行的时候,首先进行的是对于buffer poll
中缓存的修改,被修改后的数据会被标记为脏页
,同时,修改的操作也会记录在redo log
中,我们常说的MVCC中的版本链就是借助redo log
实现的。
需要注意的是,脏页不是立刻落到磁盘的,而是有可以设置的刷盘控制机制,例如,一个事务执行结算后立刻落盘,按照一定时间定期落盘等等。
在内存中的操作都是非持久化的,如果这时发生了意料之外的问题导致系统宕机,数据是还没有持久化的,所以理论上也不会对数据库造成破坏性的影响。
InnoDB在磁盘的持久化分为两步,第一步是逻辑日志的存储,之后再将日志中的数据刷进磁盘空间。
在讨论为什么要使用逻辑日志之前,我们需要简单理解随机IO
与顺序IO
的区别:
寻址过程是磁盘IO中的一个重要瓶颈,因为它需要将探针移动到需要读取的位置来读取磁盘数据。
顺序IO
是指寻址的空间是连续的,移动距离很短,随机IO
是指我们需要寻找的地址分布在各处,需要移动很长的距离。
所以,我们能很明晰的得出结论:将随机IO
替换为顺序IO
buffer poll
fait partie du pool de cache du moteur InnoDB On peut simplement le comprendre ici comme le cache des blocs de mémoire que la base de données. lit du disque vers la mémoire. ;
redo log
est un journal logique en mémoire, enregistrant les opérations de modification des transactions
Journal des transactions.
C'est le journal logique des aliments sur le disque
La structure de la table
est la structure qui stocke réellement les données
buffer poll
Les données modifiées seront marquées comme dirty page
. À ce moment-là, les opérations de modification seront également enregistrées dans le redo log
. La chaîne de versions dans MVCC dont nous disons souvent qu'elle est implémentée à l'aide du redo log
. 🎜🎜Il convient de noter que les pages sales ne sont pas immédiatement déposées sur le disque, mais il existe un mécanisme de contrôle de vidage qui peut être défini. Par exemple, une transaction est déposée sur le disque immédiatement après le règlement, périodiquement déposée sur le disque en fonction. une certaine heure, etc. 🎜🎜Toutes les opérations en mémoire sont non persistantes. Si un problème inattendu survient et que le système plante, les données n'ont pas été conservées, donc théoriquement elles n'auront pas d'impact destructeur sur la base de données. 🎜🎜3. Persistance du disque🎜🎜3.1 Le rôle du journal des transactions🎜🎜La persistance d'InnoDB sur le disque est divisée en deux étapes. La première étape consiste à stocker le journal logique, puis à vider les données du journal dans l'espace disque. 🎜🎜Avant d'expliquer pourquoi nous devrions utiliser des journaux logiques, nous devons comprendre brièvement la différence entre les E/S aléatoires
et les E/S séquentielles
:🎜🎜L'adressage Le processus constitue un goulot d'étranglement important dans les E/S du disque car il nécessite de déplacer la sonde là où elle doit être lue pour lire les données du disque. 🎜🎜E/S séquentielles
signifie que l'espace adressé est continu et la distance de déplacement est très courte. E/S aléatoires
signifie que l'adresse que nous devons trouver est distribuée partout et doit l'être. déplacé très rapidement sur de longues distances. 🎜🎜Nous pouvons donc clairement tirer la conclusion : remplacer Random IO
par Sequential IO
peut améliorer efficacement l'efficacité des entrées/sorties du disque. C'est exactement le rôle des journaux logiques, puisque. les fichiers journaux sont continus sur le disque, l'efficacité des E/S peut être beaucoup plus élevée par rapport aux informations des tables de données distribuées partout. 🎜🎜Tant que nous mettons complètement à jour l'opération dans le journal des transactions, la transaction a été conservée avec succès et un thread dédié stockera les informations du journal dans la structure de la table. 🎜🎜3.2 Stockage en deux étapes de la structure de la table🎜🎜Le processus de stockage des informations du journal dans la structure de la table est divisé en deux étapes. Premièrement, les données seront mises à jour dans la zone de cache de l'en-tête de la table. terminée, les données seront mises à jour dans la structure Actualiser la table correspondante. 🎜🎜Le but du stockage en deux étapes est d'assurer une forte cohérence du stockage des données et d'éviter que les données ne soient incomplètes en raison d'un temps d'arrêt de la base de données pendant le processus de flashage sur le disque. 🎜🎜La zone de cache de l'en-tête du tableau et le bloc de stockage de la structure du tableau ont des codes de contrôle pour vérifier l'intégrité des données. Si le premier est complet et le second est incomplet, il suffit de reflasher les anciennes données dans le. ce dernier pour résoudre le problème. Si le premier est incomplet, cela signifie que le processus de vidage du journal a échoué, il suffit de le vider à nouveau. 🎜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!