Maison  >  Article  >  base de données  >  Quelles sont les différences entre redo log et binlog dans MySQL

Quelles sont les différences entre redo log et binlog dans MySQL

WBOY
WBOYavant
2023-06-03 16:04:171039parcourir

Je souhaite vous parler de deux petits points de connaissances en mysql : redo log et binlog. redo log 和 binlog

redo log :InnoDB 存储引擎层方面的日志,所以如果你使用的存储引擎不是 InnoDB 的话,那就根本谈不上 redo log。

binlog : MySQL Server 层记录的日志,所以不管是用的什么存储引擎,只要是 MySQL 都是会有 binlog 的存在,在做 MySQL 主从复制的时候,利用的就是 binlog。

接下来,我们就详细来看看它们都分别做了啥?

redo log

Quelles sont les différences entre redo log et binlog dans MySQL

为什么要有这个 redo log 日志文件呢?

这里,我们可以举个例子,现在我们想对数据库的数据进行修改操作,现在一条 update 语句过来,一般 update 操作都伴随着查询的操作,得先找到这条数据,然后再进行更新操作对吧。

如果数据量比较小还好,很快就能找到并且更新完毕,但是如果数据量比较大,里面有一亿条数据,怎么办?而且更新操作肯定是要写到磁盘上去的,那这中间的 IO 成本呢?

如果我有好几十条 update 语句先后更新呢?这样想的话,你就能想到,就这些操作,成本就高的不行,那能不能降低一下这些成本呢?

这时候,redo log 就起到作用了。 当有一条记录更新的时候, InnoDB 引擎就会先把记录写到 redo log 里面去,同时更新内存,这样就算是更新这条数据成功了。

但是此时,它并没有更新到磁盘上去对吧?别担心, InnoDB 会在恰当的时候,把这条及记录更新到磁盘上去。

这样的思想或者技术,有个专有名词: WAL 技术,也就是 WriteAheadLogging ,核心就是先写日志,再写磁盘。

redo log 不能一直写吧?

redo log 的大小是固定的,前面的内容会被覆盖,一旦写满,就会触发 redo log 到磁盘的同步,以便腾出空间记录后面的修改。

数据库发生宕机或者重启,数据也将不会丢失。

因为有了 redo log ,之前提交的记录都还在,只需要根据 redo log 里面的记录进行相应恢复就可以了。

binlog

binlog 是 MySQL Server 层的记录日志。

redo log 和 binlog 的区别:

  • redo log 是 InnoDB 引擎特有的; binlog 是 MySQL 的 Server 层实现的,所有的引擎都是可以的。

  • redo log 是物理日志,记录的是”在 XXX 页上做了 XXX 修改”;binlog 是逻辑日志,比如” 给 id = 2 这一行的 c 字段加 1”。

  • redo log 是有固定大小的,所以它的空间会用完,如果用完的话,一定要进行一些写入磁盘的操作才可以继续;binlog 是可以追加写入的,也就是 binlog 没有空间的概念,一直写就行了。

binlog 以事件的形式记录了所有的 DDL 和 DML 语句(因为它记录的是操作而不是数据值,属于逻辑日志),可以用来做主从复制和数据恢复

在开启了 binlog 功能的情况下,我们可以把 binlog 导出成 SQL 语句,把所有的操作重放一遍,来实现数据的恢复。

有了这两个日志之后,我们来看一下一条更新语句是怎么执行的(redo 不能一次写入了):

Quelles sont les différences entre redo log et binlog dans MySQL

例如一条语句:update user set name='小马' where id=1;

  • 先查询到这条数据,如果有缓存,也会用到缓存。

  • 把 name 改成小马,然后调用引擎的 API 接口,写入这一行数据到内存,同时记录 redo log。这时 redo log 进入 prepare 状态,然后告诉执行器,执行完成了,可以随时提交。

  • 执行器收到通知后记录 binlog,然后调用存储引擎接口,设置 redo log为 commit 状态。

  • 更新完成。

你能发现 redo log 竟然是先 prepare 状态,等 binlog 写完之后,才是 commit 状态,这种方式就叫”两阶段提交”。为什么会有这种方式呢?

redo log 和 binlog 都可以用于表示事务的提交状态,而两阶段提交

redo log : journal de la couche du moteur de stockage InnoDB, donc si le moteur de stockage que vous utilisez n'est pas InnoDB, il n'y a pas de journal de rétablissement du tout. 🎜🎜binlog : le journal enregistré par la couche du serveur MySQL, donc quel que soit le moteur de stockage utilisé, tant qu'il s'agit de MySQL, il y aura un binlog lors de la réplication maître-esclave MySQL. il est utilisé binlog. 🎜🎜Ensuite, regardons ce qu'ils font en détail ? 🎜

redo log

🎜redo log et binlog dans MySQL Quoi sont les différences ?🎜
🎜Pourquoi avons-nous besoin de ce fichier de journalisation ? 🎜
🎜Ici, nous pouvons donner un exemple. Maintenant, nous voulons modifier les données dans la base de données. Maintenant, une instruction de mise à jour arrive. Généralement, l'opération de mise à jour est accompagnée d'une opération de requête. et puis faisons la mise à jour, n'est-ce pas ? 🎜🎜Si la quantité de données est relativement petite, ce n'est pas grave, elles peuvent être trouvées et mises à jour rapidement, mais que se passe-t-il si la quantité de données est relativement importante, avec 100 millions d'éléments de données ? De plus, l'opération de mise à jour doit être écrite sur le disque, alors quel est le coût des E/S au milieu ? 🎜🎜Et si j'ai des dizaines d'instructions de mise à jour à mettre à jour les unes après les autres ? Si vous y réfléchissez de cette façon, vous pouvez imaginer que le coût de ces opérations est extrêmement élevé, alors ces coûts peuvent-ils être réduits ? 🎜🎜À ce moment-là, le refaire le journal entre en jeu. Lorsqu'un enregistrement est mis à jour, le moteur InnoDB écrira d'abord l'enregistrement dans le journal redo et mettra à jour la mémoire en même temps, afin que les données soient mises à jour avec succès. 🎜🎜Mais pour le moment, il n'a pas été mis à jour sur le disque, n'est-ce pas ? Ne vous inquiétez pas, InnoDB mettra à jour cet enregistrement sur le disque au moment opportun. 🎜🎜Ce type d'idée ou de technologie a un nom propre : la technologie WAL, qui est WriteAheadLogging. L'essentiel est d'écrire d'abord le journal, puis d'écrire sur le disque. 🎜
🎜redo log Vous ne parvenez pas à continuer à écrire ? 🎜
🎜La taille du redo log est fixe, et le contenu précédent sera écrasé une fois plein, la synchronisation du redo log sur le disque sera déclenchée pour laisser la place à l'enregistrement des modifications ultérieures. 🎜
🎜Même si la base de données est en panne ou redémarrée, les données ne seront pas perdues. 🎜
🎜En raison du journal de rétablissement, les enregistrements précédemment soumis sont toujours là. Il vous suffit de les restaurer en conséquence en fonction des enregistrements du journal de rétablissement. 🎜

binlog

🎜binlog est le journal d'enregistrement de la couche MySQL Server. 🎜🎜La différence entre redo log et binlog : 🎜
  • 🎜redo log est unique au moteur InnoDB est implémenté par la couche serveur de MySQL et est disponible pour tous ; moteurs. 🎜
  • 🎜redo log est un journal physique, qui enregistre "XXX modifications ont été apportées sur la page XXX" ; binlog est un journal logique, tel que "ajouter 1 au champ c de la ligne avec l'identifiant = 2 ". 🎜
  • 🎜redo log a une taille fixe, donc son espace sera épuisé, vous devez effectuer certaines opérations d'écriture sur le disque avant de pouvoir continuer à écrire binlog, c'est-à-dire ; , binlog n'a aucune notion d'espace, continuez simplement à écrire. 🎜
🎜binlog enregistre toutes les instructions DDL et DML sous forme d'événements (car il enregistre les opérations plutôt que les valeurs de données, il s'agit d'un journal logique) et peut être utilisé pour la réplication maître-esclave et récupération de données. 🎜🎜Avec la fonction binlog activée, nous pouvons exporter le binlog dans des instructions SQL et rejouer toutes les opérations pour réaliser la récupération des données. 🎜
🎜Après avoir ces deux logs, regardons comment une instruction update est exécutée (redo ne peut pas être écrite en même temps) : 🎜
🎜Quelles sont les différences entre redo log et binlog dans MySQL🎜🎜Par exemple, une instruction : update user set name=' small Ma'where id=1;🎜
  • 🎜Interrogez d'abord ces données, et s'il y a un cache, le cache sera également utilisé. 🎜
  • 🎜Changez le nom en 小马, puis appelez l'interface API du moteur, écrivez cette ligne de données dans la mémoire et enregistrez le journal de rétablissement en même temps. À ce stade, le journal redo entre dans l'état de préparation, puis indique à l'exécuteur que l'exécution est terminée et peut être soumise à tout moment. 🎜
  • 🎜Après avoir reçu la notification, l'exécuteur enregistre le binlog, puis appelle l'interface du moteur de stockage et définit le journal redo à l'état de validation. 🎜
  • 🎜Mise à jour terminée. 🎜
🎜Vous pouvez constater que le journal redo est d'abord dans l'état de préparation, et une fois le journal binaire terminé, il est dans l'état de validation. Cette méthode est appelée « validation en deux étapes ». ". Pourquoi est-ce ainsi ? 🎜
🎜 Le redo log et le binlog peuvent être utilisés pour représenter l'état de validation d'une transaction, et la validation en deux phases consiste à garder ces deux états logiquement cohérents. 🎜

Vous pouvez supposer que si vous n'utilisez pas cette méthode, mais écrivez d'abord le redo log, puis le binlog, que se passera-t-il ? Si une exception se produit lors de l'écriture du binlog et que l'opération de mise à jour a été effectuée dans le journal redo, mais que le binlog n'est pas mis à jour à ce moment-là, y a-t-il une incohérence des données ?

Il en va de même pour écrire d'abord binlog, puis refaire le journal. Par conséquent, lors de l'écriture, mettez d'abord le journal redo dans l'état de préparation, et une fois l'écriture du binlog terminée, mettez le journal redo dans l'état de validation, conservant ainsi la cohérence logique.

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