必须了解的MySQL三种日志

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
日志服务 SLS,月写入数据量 50GB 1个月
云数据库 RDS PostgreSQL,高可用系列 2核4GB
简介: 分别讲解binlog、redo log、undo log三种日志的作用
文章已收录Github精选,欢迎Starhttps://github.com/yehongzhi/learningSummary

前言

大家有没有想过为什么MySQL数据库可以实现主从复制,实现持久化,实现回滚的呢?其实关键在于MySQL里的三种log,分别是:

  • binlog
  • redo log
  • undo log

这三种log也是面试经常会问的问题,下面我们一起来探讨一下吧。

一、binlog

binlog应该是日常中听的最多的关于mysql中的log。

那么什么是binlog呢?

binlog是用于记录数据库表结构和表数据变更的二进制日志,比如insert、update、delete、create、truncate等等操作,不会记录select、show操作,因为没有对数据本身发生变更。

binlog文件长什么样子呢?

使用mysqlbinlog命令可以查看。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-63Sik8eg-1616308429680)(https://static.lovebilibili.com/mysql_log_1.png)]

会记录下每条变更的sql语句,还有执行开始时间,结束时间,事务id等等信息。

如何查看binlog是否打开,如果没打开怎么设置?

使用命令show variables like '%log_bin%';查看binlog是否打开。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-LtfAe1n5-1616308429685)(https://static.lovebilibili.com/mysql_log_2.png)]

如果像上图一样,没有开启binlog,那怎么开启呢?

找到my.cnf配置文件,增加下面配置(mysql版本5.7.31):

# 打开binlog
log-bin=mysql-bin
# 选择ROW(行)模式
binlog-format=ROW

修改后,重启mysql,配置生效。

执行SHOW MASTER STATUS;可以查看当前写入的binlog文件名。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-PQsJEypo-1616308429689)(https://static.lovebilibili.com/mysql_log_3.png)]

binlog用来干嘛的呢?

第一,用于主从复制。一般在公司中做一主二从的结构时,就需要master节点打开binlog日志,从机订阅binlog日志的信息,因为binlog日志记录了数据库数据的变更,所以当master发生数据变更时,从机也能随着master节点的数据变更而变更,做到主从复制的效果。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-yQTCrUrO-1616308429694)(https://static.lovebilibili.com/mysql_log_5.jpg)]

第二,用于数据恢复。因为binlog记录了数据库的变更,所以可以用于数据恢复。我们看到上面图中有个字段叫Position,这个参数是用于记录binlog日志的指针。当我们需要恢复数据时,只要指定--start-position和--stop-position,或者指定--start-datetime和--stop-datetime,那么就可以恢复指定区间的数据。

二、redo log

假设有一条update语句:

UPDATE `user` SET `name`='刘德华' WHERE `id`='1';

我们想象一下mysql修改数据的步骤,肯定是先把id='1'的数据查出来,然后修改名称为'刘德华'。再深层一点,mysql是使用页作为存储结构,所以MySQL会先把这条记录所在的页加载到内存中,然后对记录进行修改。但是我们都知道mysql支持持久化,最终数据都是存在于磁盘中。

假设需要修改的数据加载到内存中,并且修改成功了,但是还没来得及刷到磁盘中,这时数据库宕机了,那么这次修改成功后的数据就丢失了。

为了避免出现这种问题,MySQL引入了redo log。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-EuKjmzVF-1616308429698)(https://static.lovebilibili.com/mysql_log_4.png)]

如图所示,当执行数据变更操作时,首先把数据也加载到内存中,然后在内存中进行更新,更新完成后写入到redo log buffer中,然后由redo log buffer在写入到redo log file中。

redo log file记录着xxx页做了xxx修改,所以即使mysql发生宕机,也可以通过redo log进行数据恢复,也就是说在内存中更新成功后,即使没有刷新到磁盘中,但也不会因为宕机而导致数据丢失。

redo log与事务机制是如何配合工作的?

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-4lb936kS-1616308429699)(https://static.lovebilibili.com/mysql_log_7.png)]

如图所示:

第1-3步骤就是把数据变更,然后写入到内存中。

第4步记录到redo log中,然后把记录置为prepare(准备)状态。

第5,6步提交事务,提交事务之后,第7步把记录状态改成commit(提交)状态。

保证了事务与redo log的一致性。

binlog和redo log都可以数据恢复,有什么区别?

redo log是恢复在内存更新后,还没来得及刷到磁盘的数据。

binlog是存储所有数据变更的情况,理论上只要记录在binlog上的数据,都可以恢复。

举个例子,假如不小心整个数据库的数据被删除了,能使用redo log文件恢复数据吗

不可以使用redo log文件恢复,只能使用binlog文件恢复。因为redo log文件不会存储历史所有的数据的变更,当内存数据刷新到磁盘中,redo log的数据就失效了,也就是redo log文件内容是会被覆盖的。

binlog又是在什么时候记录的呢?

答,在提交事务的时候。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-rTdT2Tkn-1616308429700)(https://static.lovebilibili.com/mysql_log_8.png)]

三、undo log

undo log的作用主要用于回滚,mysql数据库的事务的原子性就是通过undo log实现的。我们都知道原子性是指对数据库的一系列操作,要么全部成功,要么全部失败。

undo log主要存储的是数据的逻辑变化日志,比如说我们要insert一条数据,那么undo log就会生成一条对应的delete日志。简单点说,undo log记录的是数据修改之前的数据,因为需要支持回滚。

那么当需要回滚时,只需要利用undo log的日志就可以恢复到修改前的数据。

undo log另一个作用是实现多版本控制(MVCC),undo记录中包含了记录更改前的镜像,如果更改数据的事务未提交,对于隔离级别大于等于read commit的事务而言,不应该返回更改后数据,而应该返回老版本的数据

总结

学完之后,我们知道这三种日志在mysql中都有着重要的作用,再回顾一下:

  • binlog主要用于复制和数据恢复。
  • redo log用于恢复在内存更新后,还没来得及刷到磁盘的数据。
  • undo log用于实现回滚和多版本控制。

这篇文章就讲到这里了,感谢大家的阅读,希望看完大家能有所收获!
在这里插入图片描述

觉得有用就点个赞吧,你的点赞是我创作的最大动力~

我是一个努力让大家记住的程序员。我们下期再见!!!

能力有限,如果有什么错误或者不当之处,请大家批评指正,一起学习交流!
相关实践学习
每个IT人都想学的“Web应用上云经典架构”实战
本实验从Web应用上云这个最基本的、最普遍的需求出发,帮助IT从业者们通过“阿里云Web应用上云解决方案”,了解一个企业级Web应用上云的常见架构,了解如何构建一个高可用、可扩展的企业级应用架构。
MySQL数据库入门学习
本课程通过最流行的开源数据库MySQL带你了解数据库的世界。   相关的阿里云产品:云数据库RDS MySQL 版 阿里云关系型数据库RDS(Relational Database Service)是一种稳定可靠、可弹性伸缩的在线数据库服务,提供容灾、备份、恢复、迁移等方面的全套解决方案,彻底解决数据库运维的烦恼。 了解产品详情: https://www.aliyun.com/product/rds/mysql 
相关文章
|
12天前
|
SQL 运维 关系型数据库
深入探讨MySQL的二进制日志(binlog)选项
总结而言,对MySQL binlogs深度理解并妥善配置对数据库运维管理至关重要;它不仅关系到系统性能优化也是实现高可靠性架构设计必须考虑因素之一。通过精心规划与周密部署可以使得该机能充分发挥作用而避免潜在风险带来影响。
46 6
|
6月前
|
数据可视化 关系型数据库 MySQL
ELK实现nginx、mysql、http的日志可视化实验
通过本文的步骤,你可以成功配置ELK(Elasticsearch, Logstash, Kibana)来实现nginx、mysql和http日志的可视化。通过Kibana,你可以直观地查看和分析日志数据,从而更好地监控和管理系统。希望这些步骤能帮助你在实际项目中有效地利用ELK来处理日志数据。
509 90
|
4月前
|
SQL 监控 关系型数据库
MySQL日志分析:binlog、redolog、undolog三大日志的深度探讨。
数据库管理其实和写小说一样,需要规划,需要修订,也需要有能力回滚。理解这些日志的作用与优化,就像把握写作工具的使用与运用,为我们的数据库保驾护航。
212 23
|
5月前
|
SQL 运维 关系型数据库
MySQL Binlog 日志查看方法及查看内容解析
本文介绍了 MySQL 的 Binlog(二进制日志)功能及其使用方法。Binlog 记录了数据库的所有数据变更操作,如 INSERT、UPDATE 和 DELETE,对数据恢复、主从复制和审计至关重要。文章详细说明了如何开启 Binlog 功能、查看当前日志文件及内容,并解析了常见的事件类型,包括 Format_desc、Query、Table_map、Write_rows、Update_rows 和 Delete_rows 等,帮助用户掌握数据库变化历史,提升维护和排障能力。
|
6月前
|
存储 SQL 关系型数据库
mysql的undo log、redo log、bin log、buffer pool
MySQL的undo log、redo log、bin log和buffer pool是确保数据库高效、安全和可靠运行的关键组件。理解这些组件的工作原理和作用,对于优化数据库性能和保障数据安全具有重要意义。通过适当的配置和优化,可以显著提升MySQL的运行效率和数据可靠性。
142 16
|
6月前
|
存储 SQL 关系型数据库
mysql的undo log、redo log、bin log、buffer pool
MySQL的undo log、redo log、bin log和buffer pool是确保数据库高效、安全和可靠运行的关键组件。理解这些组件的工作原理和作用,对于优化数据库性能和保障数据安全具有重要意义。通过适当的配置和优化,可以显著提升MySQL的运行效率和数据可靠性。
110 4
|
7月前
|
关系型数据库 MySQL 数据库
MySQL日志
本文介绍了MySQL中三个重要的日志:binlog、redolog和undolog。binlog记录数据库更改操作,支持数据恢复、复制和审计;redolog保证事务的原子性和持久性,实现crash-safe;undolog用于事务回滚及MVCC的实现。每个日志都有其独特的作用和应用场景,确保数据库的稳定性和数据一致性。
129 1
|
6月前
|
SQL 存储 关系型数据库
简单聊聊MySQL的三大日志(Redo Log、Binlog和Undo Log)各有什么区别
在MySQL数据库管理中,理解Redo Log(重做日志)、Binlog(二进制日志)和Undo Log(回滚日志)至关重要。Redo Log确保数据持久性和崩溃恢复;Binlog用于主从复制和数据恢复,记录逻辑操作;Undo Log支持事务的原子性和隔离性,实现回滚与MVCC。三者协同工作,保障事务ACID特性。文章还详细解析了日志写入流程及可能的异常情况,帮助深入理解数据库日志机制。
841 0
|
4月前
|
监控 容灾 算法
阿里云 SLS 多云日志接入最佳实践:链路、成本与高可用性优化
本文探讨了如何高效、经济且可靠地将海外应用与基础设施日志统一采集至阿里云日志服务(SLS),解决全球化业务扩展中的关键挑战。重点介绍了高性能日志采集Agent(iLogtail/LoongCollector)在海外场景的应用,推荐使用LoongCollector以获得更优的稳定性和网络容错能力。同时分析了多种网络接入方案,包括公网直连、全球加速优化、阿里云内网及专线/CEN/VPN接入等,并提供了成本优化策略和多目标发送配置指导,帮助企业构建稳定、低成本、高可用的全球日志系统。
618 55

推荐镜像

更多