Maison  >  Article  >  base de données  >  Qu’est-ce qu’une page sale MySQL ?

Qu’est-ce qu’une page sale MySQL ?

青灯夜游
青灯夜游original
2023-04-14 10:41:301521parcourir

Dans MySQL, lorsque le contenu de la page de données mémoire et de la page de données disque est incohérent, la page mémoire est appelée une page sale. Scénarios pour vider les pages sales : 1. Lorsque le journal redo est plein, mysql suspendra toutes les opérations de mise à jour et synchronisera les pages sales correspondant à cette partie du journal sur le disque ; à éliminer. Si elles sont éliminées. 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 lorsqu'il y en aura. une opportunité. Il n’y a pas de problème de performances dans ce cas.

Qu’est-ce qu’une page sale MySQL ?

L'environnement d'exploitation de ce tutoriel : système windows7, version mysql8, ordinateur Dell G3.

Pages sales (pages mémoire)

  • Pages propres : les données en mémoire et sur le disque sont cohérentes
  • Pages sales : les données en mémoire et sur le disque sont incohérentes

Pourquoi les pages sales apparaissent

Habituellement très rapidement Toutes les opérations de mise à jour sont écrites 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 log来实现异常重启的数据恢复。

简单来说,就是在更新缓冲区之前,先写入redo log,保证异常重启之后可以正常恢复缓冲区中的数据。

为什么脏页一定要刷新

  • 上面说了 数据只放在缓冲区,会出现数据库宕机,内存数据丢失。所以需要刷新到磁盘。
  • redo log如果无限大或者有许多个文件的话,系统中有大量的修改操作,一旦宕机,恢复的时间也会非常长。

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

  • 缓冲区不需要无限大了,因为可以持久化到磁盘
  • redo log也不需要无限大了,因为一旦持久化到磁盘,redo log中对应的那部分数据就可以释放。

刷脏页有下面4种场景

  • redo log 写满,mysql就会暂停所有更新操作,将同步这部分日志对应的脏页同步到磁盘

  • 系统内存不足时,需要淘汰一部分数据页,如果淘汰的是脏页,就要先将脏页同步到磁盘

  • MySQL 认为系统空闲的时候,有机会就同步内存数据到磁盘,这种没有性能问题。

  • MySQL 正常关闭,MySQL 会把内存的脏页都同步到磁盘上,这样下次 MySQL 启动的时候,就可以直接从磁盘上读数据,启动速度会很快。这种没有性能问题。

会造成的影响

如果是 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 libre sera obtenue à partir de la FreeList. Après avoir lu les données, elle sera placée dans la LRUlist. 🎜🎜S'il n'y a pas de page libre dans la FreeList, alors la dernière page. dans la liste LRU sera éliminée selon l'algorithme LRU. La page 🎜🎜Lorsque la page dans la liste LRU est modifiée, la page devient une page sale, et cette page sera également ajoutée à la FlushList🎜🎜🎜🎜Remarque : à cette fois, la page est à la fois dans la LRUlist et dans la 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-ce que ça va si la modification et la lecture des données dépendent uniquement du tampon ?🎜

🎜Si la modification et la lecture des données dépendent uniquement de la mémoire buffer, Ensuite, une fois la base de données en panne, les données en mémoire seront perdues. Par conséquent, MySQL utilise le journal redo mentionné précédemment pour récupérer les données après un redémarrage anormal. 🎜🎜Pour faire simple, avant de mettre à jour le tampon, écrivez d'abord le redo log pour vous assurer que les données du tampon peuvent être restaurées normalement après un redémarrage anormal. 🎜

🎜Pourquoi les pages sales doivent être actualisées🎜🎜🎜🎜Il est mentionné ci-dessus que les données sont uniquement placées dans le tampon, et temps d'arrêt de la base de données et perte de données en mémoire se produira. 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. Une fois le système tombé 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. 🎜🎜Le journal redo n'a pas besoin d'être infini, car une fois conservé sur le disque, la partie correspondante des données dans le journal redo. peut être libéré. 🎜🎜

🎜Il existe quatre scénarios ci-dessous pour brosser les pages sales🎜🎜
    🎜🎜Lorsque le redo log est plein , mysql va mettre en pause toutes les opérations de mise à jour, et synchroniser les pages sales correspondant à cette partie du journal sur le disque. 🎜🎜🎜🎜Lorsque le système dispose de mémoire insuffisante, il est nécessaire de éliminer certaines pages de données. Si les pages sales doivent être éliminées, supprimez-les d'abord. Les pages sales sont synchronisées sur le disque. 🎜🎜🎜🎜MySQL pense que lorsque le système est inactif, il synchronisera les données de la mémoire sur le disque lorsqu'il en aura l'occasion. Il n'y a pas de problème de performances dans ce cas. . 🎜🎜🎜🎜MySQL s'arrête normalement, MySQL synchronisera toutes les pages sales de la mémoire sur le disque, afin qu'au prochain démarrage de MySQL, elles puissent être lues directement depuis les données du disque, la vitesse de démarrage sera très rapide. Il n’y a aucun problème de performances avec cela. 🎜🎜🎜

    🎜L'impact que cela entraînera🎜

    🎜🎜Si le journal de rétablissement est plein🎜🎜🎜Essayez d'éviter que le journal de rétablissement soit 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 entraînera le problème. l'exécution des instructions SQL est très lente. 🎜🎜【Recommandation associée : 🎜tutoriel vidéo mysql🎜】🎜

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:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn