前言

MySql更新流程如下,下面会一次介绍redo log、undo log以及binlog

Redo log(重做日志)

前面文章提到过缓存池以及刷页的操作,如果由于某种原因导致Mysql宕机还是还未来得及刷页的话则会导致数据丢失,未解决此问题,于是引入了redo log

它记录的是数据库中每个页的修改,而不是某一行或某几行修改成怎么样,可以用来恢复提交后的数据页,并且只能恢复至最后一次提交的位置。

在客户端尝试修改数据时,Innodb会把记录下写在redo log中,再修改缓存池中数据,当事务提交时,调用fsync把redo log刷入磁盘。至于缓存池的数据何时刷入磁盘由后台线程异步处理。

注意:此时redo log的事务状态是prepare,也就是未真正提交,要等bin log日志写入磁盘完成才变成commit,事务才算真正完成。所以当Mysql宕机后,只要重试解析redo log的更改记录进行重放、刷盘即可。

redo log重放(刷盘)过程

redo log采用固定大小,循环写入的方式。当redo log写满后从头开始写,形成一个环状。
因为redo log记录的是数据页上的修改,如果缓存池的数据页已经刷盘了,那redo log中记录的信息就失去了价值,那么新日志就可将这些失效记录进行擦除、覆盖。

上图中的write pos表示redo log当前记录的日志序列号(LSN),写入还未刷盘的记录,循环往后递增;check point表示redo log中的修改记录已经刷新到磁盘后的LSN,这个LSN之前的数据已经全部落盘;

write pos和check point之间的绿色部分表示空余部分,用来记录写的日志;check point到write pos之间是还未来得及刷盘的部分。当write pos追上check point时,就需要推动check point前移,即进行刷盘空出位置进行记录新的日志。

当redo log写满时,在擦除之前,需要确认这些要被擦除的数据对应内存中的数据页都已经全部落盘。并且擦除就记录腾出新空间这段期间是不能接受任何更新请求的,必然会导致Mysql性能下降。所以在高并发场景下,合理的调整redo log大小非常重要。

当Mysql启动时,无论上次是正常关闭还是异常退出,都会进行恢复操作,先检查数据页中的LSN,如果这个LSN小于redo log中的LSN(write pos位置),则说明redo log上存在未完成刷盘的记录,此时会从最近的check point出发开始同步数据。


如此数据页中LSN为300;redo log中LSN为500,则需要对redo log 中从LSN 300 -500的记录进行重放刷盘。

redo log写入机制

redo buffer以何种策略持久化到redo log可以通过innodb_flush_log_at_trx_commit进行设置
0:每秒提交 redo buffer -> os cache ->disk 可能丢失一秒内的事务数据
1(默认值):每次事务提交执行 redo buffer ->os cache ->disk 性能较差
2:每次事务提交 redo buffer->os cache ,然后由后台Master线程每隔1s进行刷盘

一般选择2这种模式,因为这种情况mysql挂了数据不会丢失,只有服务器挂了1秒才会丢失数据。

undo log(回滚日志)

undo log 也是 Mysql存储引擎InnoDB的事物日志,作用是起到回滚,保证了事务的原子性。记录的是数据修改前的状态,即在数据修改的流程中,记录一条与当前操作相反的回滚日志。

需要注意的是,假如一个事务中一条记录被多次修改,但是undo log只会记录原始版本的一条数据,每当对数据进行修改时,都会写入redo log。

作用

1.实现事务原子性,利用Undo log进行回滚
2.实现mvcc机制:undo log中保存了未提交之前版本数据,所以可以作为旧版本数据的快照以便其他事务进行读取

undo log负责完成回滚,redo log负责完成前滚

回滚

未提交的事务,即事务未执行commit。但是该事务内修改的脏页中,可能有一部分脏块已经刷盘。如果此时数据库宕机,则需要用回滚来将已经刷盘的脏块从磁盘上撤销

前滚

未完全提交的事务,即事务已经执行commit,但是缓存吃中的脏页还未来的急刷盘,此时数据库宕机就需要使用redo log进行前滚刷盘恢复数据

数据库重启时,先做前滚,后做回滚。可再看一下本文第一张图,可以看到redo log、undo log、bin log都是在刷脏页之前就已经刷到了磁盘上,这俄中互相协作才能保证用户提交的数据不会丢失。

bin log (归档日志)

bin log是数据库server层日志,和存储引擎无关,以二进制形式存储在磁盘中的逻辑日志,记录了所有DDL和DML操作(不包括select和show)。默认情况下是关闭的。bin log不会向redo log那样会擦出无用日志,而是永久存储(也可以设置过期时间,默认是永久保存),默认文件1G,超过此阈值会新建一个文件进行记录。主要作用于主从同步以及基于时间点的数据还原

主从同步


1.主库执行DDL和DML操作,按照修改顺序以此写入bin log.
2.从库的IO线程连接上主库并请求读取指定位置position的日志内容
3.主库收到请求后,将制定位置position之后的内容日志、主库bin log文件名称以及在日志中的位置推送给从库。
4.从库IO线程收到数据后,将日志内容以此写入relay log文件最末端,并将bin log文件名和位置position记录到master-info文件中,以遍下次使用。
5.从库的sql线程检测到relay log中内容更新后,读取日志并解析成可执行的sql语句进行主从同步。

其他功能

1.基于时间点恢复数据
2.通过订阅bin log可以做很多事情,比如同步上游数据、和redis配合实现延时双删等。

bin log文件记录模式

ROW STATEMENT MIXED
记录每一行数据被修改的情况 ,然后Slave端对相同的数据进行修改。优点:能清除记录每一行数据修改细节,能完全实现主从数据同步和数据恢复;缺点:批量操作会产生大量日志,尤其是alter table会让日志暴涨 每一条被修改的数据的sql会记录到master的bin log中,slave在复制的时候sql进程会解析成和原来master执行过的相同的sql再次执行,简称sql语句复制。优点:日志量小,减少磁盘IO,提升存储和恢复速度;缺点:在某些情况下会导致主从数据不一致,例如now()函数 以上两种模式混合使用,对于STATEMENT模式无法复制的使用ROW模式保存bin log,mysql会根据执行的sql自行选择写入模式

bin log 和 redo log区别

1.层次不同:redo log是基于innodb存储引擎的,而bin log 是基于数据库服务层实现的,所以mysql数据库中任何存储引擎对数据库进行修改都会产生bin log
2.作用不同:redo log 用于碰撞恢复(crash recovery),保证mysql宕机不会影响持久性;而bin log 用于时间点恢复数据(point-in-time-recovery),保证服务器可以基于时间点恢复数据以及主从复制
3.内容不同:redo log是物理日志,内容基于此盘的页;bin log内容是二进制的
4.写入方式不同:redo log采用循环写入的方式,bin log采用追加的方式
5.刷盘时机不同:redo log在事务开始时即开始写入,而bin log在事务提交才写入

bin log和redo log 相辅相成,共同保证事务持久性

relay log(中继日志)

relay log和bin log具有相同的格式,上面主从复制流程页提到了relay log,其主要作用起到一个中转作用。

slow query log

慢查询日志用于记录在mysql执行过程超过指定时间的查询语句,处于性能考虑,一般只有在排查慢查询、调试参数时候才会开启,默认情况下时关闭的,默认时间时10s

general query log

一般查询日志用来记录用户的所有操作,包括客户端何时连接的服务器、客户端发送的所有sql以及其他等事情。处于性能考虑,该日志功能默认也是关闭的。

error log

错误日志记录mysql服务每次启动和停止的时间以及诊断和出错信息,默认开启,可通过 show variables like ‘log_error’ 查找存放路径。

不要把错误日志狭隘的认为只有错误日志,其中还包括如何启动INNODB的表空间文件、如何初始化自己的存储引擎、初始化缓存池等信息。

内容学习自微信公众号Hollis,如有侵权请及时联系删除谢谢。

Mysql中7种日志相关推荐

  1. MySQL 中的重做日志,回滚日志以及二进制日志的简单总结

    转载自 MySQL 中的重做日志,回滚日志以及二进制日志的简单总结 MySQL中有六种日志文件,分别是:重做日志(redo log).回滚日志(undo log).二进制日志(binlog).错误日志 ...

  2. MySQL中常见的日志文件

    日志文件记录了影响MySQL数据库的各种类型活动.MySQL中常见的日志文件有: 错误日志(error log) 二进制日志(binlog) 慢查询日志(slow query log) 查询日志(lo ...

  3. MySQL中的通用查询日志(General Query Log)

    MySQL中的通用查询日志(General Query Log) 1. 以什么形式来记录? log_output系统变量来决定的,可选值 TABLE, FILE, 或者 NONE,默认值是FILE,可 ...

  4. mysql more_mysql中哪种日志不能直接cat或more

    展开全部 前言 MySQL中有以下日志文件,分别是: 1:重做日志(redo log)62616964757a686964616fe59b9ee7ad9431333433653335 2:回滚日志(u ...

  5. MySQL中的重做日志(redo log),回滚日志(undo log),以及二进制日志(binlog)的简单总结...

    MySQL中有六种日志文件, 分别是:重做日志(redo log).回滚日志(undo log).二进制日志(binlog).错误日志(errorlog).慢查询日志(slow query log). ...

  6. mysql 表空间收缩_【135期】谈谈MySQL中的重做日志,回滚日志,以及二进制日志的区别及各自作用...

    点击上方"Java面试题精选",关注公众号 面试刷图,查缺补漏 >>号外:往期面试题,10篇为一个单位归置到本公众号菜单栏->面试题,有需要的欢迎翻阅 阶段汇总集 ...

  7. MySQL中的重做日志(redo log),回滚日志(undo log),以及二进制日志(binlog)的简单总结

    前言 1. ''最近公司大佬让我优化sql的时候,说可以通过控制where条件,尽可能的少的较少数据库的开支,少生成一些无用的binlog.由此引出binlog这个概念,大家一起学习一下 关于Binl ...

  8. mysql重做日志与binlog日志区别_【135期】谈谈MySQL中的重做日志,回滚日志,以及二进制日志的区别及各自作用...

    MySQL中有六种日志文件,分别是:重做日志(redo log).回滚日志(undo log).二进制日志(binlog).错误日志(errorlog).慢查询日志(slow query log).一 ...

  9. MySQL中的binlog日志

    binlog是mysql的日志工具,binlog日志可以记录insert.update.delete的sql和操作时间.因为log数据是二进制格式的,所以称为binary log,即binlog. 文 ...

最新文章

  1. Python3中装饰器@typing.overload的使用
  2. git之工作区、版本区、远程仓库之间相互操作
  3. 一图读懂Java架构
  4. 计算机应用技术重点学科,福州大学省级重点学科介绍:计算机应用技术(081203)...
  5. π-Algorithmist分类题目(3)
  6. python学习视频-2018年最新Python学习路线图(内含大纲+视频+工具)
  7. layout_gravity与gravity的区别
  8. js html 导出excel文件,js 导出excel ,elsx格式
  9. 腾讯云人员缩减,急盈利,3000~4000 人面临被裁
  10. 2016年如何用正确的姿势抢“头条”?
  11. Rocketmq简介及部署、原理和使用介绍
  12. 有趣的MATLAB小程序
  13. .net对Excel表数据读写操作
  14. ps调整图片大小,像素大小
  15. Jetpack Compose中的手势操作
  16. 你真的会用ls命令吗?--文件管理命令(ls命令详解)
  17. bootstrap之data-toggle,data-dismiss,data-target用法
  18. 静态成员函数存在的意义
  19. google 广告条代码
  20. 常用的一些javascript小技巧(收藏http://www.car371.com/article.asp?id=13)

热门文章

  1. Win10 vmware虚拟机安装ubuntu蓝屏解决方法
  2. Android设计模式之建造者模式builder
  3. iOS-Core Animation 核心动画
  4. 什么是面向对象程序设计?
  5. Seata Configuration解析
  6. 深度学习系统学习(一)
  7. JAVA定义printX方法,打印X图形
  8. 计算机应用基础创新杯课件,全国创新杯说课大赛计算机应用基础类一等奖作品:在图像创意合成中的应用说课课件...
  9. 苹果微信更新不了最新版本_微信最新版来了,安卓苹果都更新,3大功能非常亮眼...
  10. rtx3080相当于gtx什么显卡 rtx3080显卡什么水平 rtx3080显卡怎么样