mysql 日志详解

前言

bin log 二进制日志(归档日志) 主要用于 备份和迁移 属于mysql级别的日志
redo log (重做日志)用来实现事务的持久性,当事务提交之后会把所有修改信息都会存到该日志中。
主要用于崩溃恢复,属于InnoDB存储引擎的日志
undo log(回滚日志)用于记录数据被修改前的信息。主要用于事务的回滚、MVCC。

binlog

作用

可以说MySQL数据库的数据备份、主备、主主、主从都离不开binlog,需要依靠binlog来同步数据,保证数据一致性。binlog会记录所有涉及更新数据的逻辑操作,并且是顺序写。

记录格式

binlog 日志有三种格式,可以通过binlog_format参数指定。

statement
row
mixed

MySQL会判断这条SQL语句是否可能引起数据不一致,如果是,就用row格式,否则就用statement格式。

redo log

redo log(重做日志)是InnoDB存储引擎独有的,它让MySQL拥有了崩溃恢复能力。
比如 MySQL 实例挂了或宕机了,重启时,InnoDB存储引擎会使用redo log恢复数据,保证数据的持久性与完整性。

redo log刷盘时机

InnoDB 存储引擎为 redo log 的刷盘策略提供了 innodb_flush_log_at_trx_commit 参数,它支持三种策略:

0:设置为 0 的时候,表示每次事务提交时不进行刷盘操作
1:设置为 1 的时候,表示每次事务提交时都将进行刷盘操作(默认值)
2:设置为 2 的时候,表示每次事务提交时都只把 redo log buffer 内容写入 page cache

innodb_flush_log_at_trx_commit 参数默认为 1 ,也就是说当事务提交时会调用 fsync 对 redo log 进行刷盘.

两阶段提交

为了解决两份日志之间的逻辑一致问题,InnoDB存储引擎使用两阶段提交方案。
原理很简单,将redo log的写入拆成了两个步骤prepare和commit,这就是两阶段提交。
使用两阶段提交后,写入bin log时发生异常也不会有影响,因为MySQL根据redo log日志恢复数据时,发现redo log还处于prepare阶段,并且没有对应binlog日志,就会回滚该事务。

undo log

在 MySQL 中,恢复机制是通过 回滚日志(undo log) 实现的。所有事务进行的修改都会先记录到这个回滚日志中,然后再执行相关的操作。如果执行过程中遇到异常的话,我们直接利用 回滚日志 中的信息将数据回滚到修改之前的样子即可!并且,回滚日志会先于数据持久化到磁盘上。这样就保证了即使遇到数据库突然宕机等情况,当用户再次启动数据库的时候,数据库还能够通过查询回滚日志来回滚将之前未完成的事务。
MVCC 的实现依赖于:隐藏字段、Read View、undo log。在内部实现中,InnoDB 通过数据行的 DB_TRX_ID 和 Read View 来判断数据的可见性,如不可见,则通过数据行的 DB_ROLL_PTR 找到 undo log 中的历史版本。每个事务读到的数据版本可能是不一样的,在同一个事务中,用户只能看到该事务创建 Read View 之前已经提交的修改和该事务本身做的修改。

总结

MySQL InnoDB 引擎使用 redo log(重做日志) 保证事务的持久性,使用 undo log(回滚日志) 来保证事务的原子性。
MySQL数据库的数据备份、主备、主主、主从都离不开binlog,需要依靠binlog来同步数据,保证数据一致性。

mysql三大日志详解

相关推荐

  1. mysql 日志详解

    2024-05-13 12:40:11       14 阅读
  2. springboot 日志详解

    2024-05-13 12:40:11       9 阅读
  3. MySQL日志——redo log和bin log的刷盘时机详解

    2024-05-13 12:40:11       18 阅读

最近更新

  1. TCP协议是安全的吗?

    2024-05-13 12:40:11       18 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-05-13 12:40:11       19 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-05-13 12:40:11       18 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-05-13 12:40:11       20 阅读

热门阅读

  1. mybatis快速入门

    2024-05-13 12:40:11       7 阅读
  2. python的错误处理和调试

    2024-05-13 12:40:11       11 阅读
  3. 【代码随想录】day52

    2024-05-13 12:40:11       10 阅读
  4. [力扣题解]45. 跳跃游戏 II

    2024-05-13 12:40:11       11 阅读
  5. Redis——Redis的数据库结构、删除策略及淘汰策略

    2024-05-13 12:40:11       12 阅读