Maison >base de données >tutoriel mysql >À quoi fait référence la page sale de MySQL ?

À quoi fait référence la page sale de MySQL ?

王林
王林avant
2023-05-30 12:01:451253parcourir

Si le contenu de la page de données mémoire et de la page de données disque est différent dans MySQL, alors cette page mémoire sera appelée une page sale. Scénarios pour vider les pages sales : 1. Lorsque le journal redo est plein, MySQL suspend toutes les opérations de mise à jour et synchronise les pages sales correspondant à cette partie du journal sur le disque. 2. Lorsque la mémoire système est insuffisante, certaines pages de données sont nécessaires ; à éliminer. Si éliminé Si les pages sales sont des pages sales, vous devez d'abord synchroniser les pages sales sur le disque ; 3. MySQL pense que lorsque le système est inactif, il synchronisera les données de la mémoire sur le disque lorsque l'occasion se présente. . Il n'y a aucun problème de performances dans ce cas.

Page sale (page mémoire)

  • Page propre : les données en mémoire et sur le disque sont cohérentes

  • Page sale : les données en mémoire et sur le disque sont incohérentes

Pourquoi faire des pages sales apparaissent

Habituellement, les opérations de mise à jour très rapides consistent toutes à écrire dans la mémoire et dans les journaux. Il ne se synchronise pas immédiatement avec la page de données du disque. À ce stade, le contenu de la page de données de la mémoire et de la page de données du disque est incohérent, ce que nous appelons page sale. 不会马上同步到磁盘数据页,这时内存数据页跟磁盘数据页内容不一致,我们称之为脏页

这里面就涉及 mysql 的内存管理机制

内存管理机制简述

缓冲区中包含这三大类列表。分别为:LRUListFreeListFlushList

在数据库刚启动时,LRUlist中没有数据页。FreeList存放空闲页。

  • 当需要读取某个页时,会从FreeList中获取一个空闲页,读入数据后,放入LRUlist中

  • 如果FreeList中没有空闲页了,那么根据LRU算法淘汰Lru列表中末位的页

  • 当LRUlist中的页被修改后,页就变成了脏页,这个页也会被加入FlushList中

注意:这时这个页既在LRUlist中,又在FlushList中。

总结:LRUList(管理已经被读取的页)和FreeList(管理空闲的页)用来管理页的可用性;FlushList(管理脏页)用来管理脏页的刷新

在脏页数据同步到磁盘过程中,如果对该磁盘数据页执行 SQL 语句。执行速度就会变慢

数据修改和读取只依赖缓冲区行不行

假如只有缓存区用来进行数据修改和读取,一旦数据库宕机,缓存区中的数据将会丢失。因此,MySQL利用之前介绍过的redo日志来实现在异常重启时的数据恢复。

以简单的方式解释,就是在更新缓冲区之前,将操作记录在redo log中,以确保在出现异常重启的情况下,仍然可以恢复缓冲区中的数据。

为什么脏页一定要刷新

  • 上面说了 数据只放在缓冲区,会出现数据库宕机,内存数据丢失。所以需要刷新到磁盘。

  • redo log如果无限大或者有许多个文件的话,系统中有大量的修改操作,一旦宕机,恢复的时间也会非常长。

所以自然而然,我们就一定需要把内存中的脏页按照某种规则刷新到磁盘中,有了刷新这个操作,缓冲区的大小问题和redo log的大小问题都可以解决。

  • 缓冲区不需要无限大了,因为可以持久化到磁盘

  • 因为一旦redo log中的数据被持久化到磁盘上,对应的部分数据就可以被释放,所以无需设置redo log过大。

刷脏页有下面4种场景

undefined会造成的影响

如果是 redo log 写满了

要尽量避免redo log 写满。否则整个系统的更新都会停止。此时写的性能变为 0,必须等待该日志对应脏页同步完成

Cela implique le mécanisme de gestion de la mémoire de mysql🎜

🎜Brève description du mécanisme de gestion de la mémoire🎜

🎜Le tampon contient ces trois catégories de listes. Ce sont : LRUList, FreeList, FlushList. 🎜🎜Lorsque la base de données est démarrée pour la première fois, il n'y a aucune page de données dans la liste LRU. FreeList stocke les pages gratuites. 🎜🎜🎜🎜Lorsqu'une page doit être lue, une page gratuite sera obtenue à partir de FreeList. Après avoir lu les données, elle sera placée dans LRUlist🎜🎜🎜🎜S'il n'y a pas de pages libres dans FreeList, alors la liste LRU le sera. être éliminé selon l'algorithme LRU La page du milieu et de la dernière page🎜🎜🎜🎜Lorsque la page de la LRUlist est modifiée, la page devient une page sale, et cette page sera également ajoutée à la FlushList🎜🎜🎜🎜🎜Remarque : à cette fois, cette page est déjà dans la LRUlist. Encore une fois dans FlushList. 🎜🎜🎜Résumé : LRUList (gérer les pages qui ont été lues) et FreeList (gérer les pages gratuites) sont utilisés pour gérer la disponibilité des pages ; FlushList (gérer les pages sales) est utilisé pour gérer le rafraîchissement des pages sales🎜🎜Synchronisation des données sur les pages sales Pendant le processus d'accès au disque, si l'instruction SQL est exécutée sur la page de données du disque. La vitesse d'exécution deviendra plus lente🎜

🎜Est-il possible de compter uniquement sur le tampon pour la modification et la lecture des données🎜

🎜Si seule la zone tampon est utilisée pour la modification des données et lecture, une fois la base de données en panne, les données de la zone de cache seront perdues. Par conséquent, MySQL utilise le journal redo introduit précédemment pour récupérer les données en cas de redémarrage anormal. 🎜🎜Explique de manière simple, avant de mettre à jour le buffer, l'opération est enregistrée dans le redo log pour garantir qu'en cas de redémarrage anormal, les données dans le buffer peuvent toujours être récupérées. 🎜

🎜Pourquoi les pages sales doivent être actualisées🎜🎜🎜🎜🎜Il est dit ci-dessus que les données sont uniquement placées dans le tampon, et il y aura temps d'arrêt de la base de données et de la mémoire perte de données. Il doit donc être vidé sur le disque. 🎜🎜🎜🎜Si le journal redo est infiniment volumineux ou contient de nombreux fichiers, il y aura un grand nombre d'opérations de modification dans le système, et une fois qu'il tombera en panne, le temps de récupération sera très long. 🎜🎜🎜🎜Alors naturellement, nous devons 🎜vider les pages sales de la mémoire sur le disque 🎜 selon certaines règles. Avec l'opération de rafraîchissement, le problème de taille du tampon et le problème de taille du journal de rétablissement peuvent être résolus. 🎜🎜🎜🎜Le tampon n'a pas besoin d'être infini car il peut être conservé sur le disque🎜🎜🎜🎜Parce qu'une fois que les données du journal redo sont conservées sur le disque, la partie correspondante des données peut être libérée, donc là il n'est pas nécessaire de configurer le journal redo. Trop gros. 🎜🎜🎜

🎜Il existe les 4 scénarios suivants pour brosser les pages sales🎜🎜🎜non défini🎜L'impact que cela provoquera🎜🎜🎜🎜Si le journal de rétablissement est plein🎜🎜🎜S'il vous plaît essayez de l'éviter le journal de rétablissement est plein. Sinon, la mise à jour de l'ensemble du système s'arrêtera. A ce moment, les performances d'écriture deviennent 0, et vous devez attendre que le journal correspondant à la synchronisation des pages sales soit terminé avant de pouvoir être mis à jour. Cela provoquera l'exécution. des instructions SQL sont très lentes. 🎜

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!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer