MySQL日志
MySQL日志
关键在于掌握undo-log、redo-log和bin-log的概念、作用、结构。
自己写的博客本质还是给自己看的(更是是自己输出的过程),所以从别人博客那里复制粘贴没必要。所以日志相关的内容,我这里写的更多的是理解性的,也比较浅。更深的、系统性的见下面两篇博客:
Undo-log
Undo-log,回滚日志,是用于保证事务ACID性质中原子性的日志;另外还有个作用,MVCC(多版本控制)通过Read View + Undo log日志来实现(因为回滚日志能形成记录的版本链)。
为什么说undo log保证了原子性呢?而且一条普通的更新语句也不是事务呀?其实autocommit参数默认开启,所以执行一条update语句也是开启事务的。其次就是如何保证原子性的——假设一个事务执行失败,由于undo log日志有旧版本的数据信息,所以事务回滚后能将数据恢复到事务执行前的样子,这就保证了事物的原子性(同时失败)。
具体来说,undo log里记录数据时会有两个隐藏列——trx_id,用于表示该版本数据是哪个事务修改后的,roll_ptr,用于指向上一个版本的数据(便于回滚或查看旧版本数据(变相支持了隔离性))。
Redo-log
Redo-log,重做日志,是用于保证事务ACID性质中持久性的日志。
为什么说redo log保证了持久性呢?因为InnoDB在插入一条数据时,会先将这条新数据写入到redo log中,之后后台进程再去把redo log中的脏页数据刷入硬盘。
那为什么不直接把数据写入硬盘中而是要使用redo log呢?主要是出于性能方面考虑,以及在MySQL服务宕机后有更好的恢复效果。如果是直接写入数据,那么要找到数据在硬盘中的物理地址后再写入,属于随机存储,而写入redo log就是直接在指定位置后面顺序写入,效率更高,所以写入redo log直接返回客户端“数据已成功写入”,这样的响应时间更短。(后续把真实数据写入硬盘有专门的异步线程来做)。那么在没有把redo log中的数据写入硬盘呢,MySQL服务就宕机了,也没关系,redo log已经写入了数据缓存页,那等MySQL服务恢复后就能把数据写入。(如果是redo中都没写入就宕机……那么sql就没执行成功,也返回给服务端成功的提示,所以问题不大)
实际上InnoDB在Buffer Pool(缓冲池)中,不仅缓存了数据页、索引页,还有插入缓存页、undo页等信息。也就是有redo log的缓存(所以redo log可以选择不是每次事务提交都刷盘)——这个可以通过redo log相关参数来配置刷盘策略。
why?每次刷盘和先放在缓存再一次刷入,前者保证数据的持久性,后者提高性能(减少IO次数),各有利弊,看实际而权衡。(默认策略是事务提交就刷盘)
关于redo log的结构,默认有两个日志文件,然后进行循环写。
红色部分为空闲空间,蓝色部分为脏页数据,如果write pos指针和check point指针相遇则说明空间已满,需要刷盘。
Bin-log
Bin-log,二进制日志,和redo log类似,也是记录数据库表结构变化或数据变化的日志,但是Bin-log是Server层的,undo-log和redo-log是InnoDB执行引擎特有的。
bin log的作用更多是备份恢复、主从复制。而redo log是掉电等故障恢复。
主从复制,是MySQL高可用里面的内容(现在就理解为是一种能使MySQL具有更高可用性的架构模式)。一主一从、一主多从。(读写分离……balabala)
bin log与redo log不同的是,它是追加写,一个文件写满了就新来一个文件再写。(所以想要恢复数据库的数据还是要看bin log,而不是redo log)
redo log更像是一种“短期内”、“小型”故障的自动恢复;但是一不小心删了整个数据库,那么redo log就无力回天了,要从本地的bin log进行数据恢复。(避免删库跑路)
bin log日志有三种格式:Statement、Row 及 Mixed。
Statement格式:基于SQL语句的复制。
Row格式:基于行信息的复制。
Mixed格式:混合模式复制
Error-log
error-log,错误日志,用于线上问题排查的日志。
Slow-log
slow-log,慢查询日志,但是默认是不开启的,而且需要自己设定一个合理的阈值(什么样才算慢查询)。
General-log
查询日志,通常在开启慢查询前前先用general log,看看压测情况下所有业务的sql执行时间怎么样,最后再对slow log设置一个稍大于平均sql执行的时间,开启慢查询日志。(线上一定要关闭general log,否则每次sql都要写入general log)
Relay-log
relay-log,中继日志,仅存在于主从架构的从机上。relay-log和bin-log一模一样,就是从主机复制过来的。
各日志参数
见此文https://juejin.cn/post/7157956679932313608#heading-10,可以看到各种日志相关的参数设置解释。







