mysql日志系统redo log和bin log介绍

 更新时间:2022年08月25日 09:14:56   作者:会玩code  
这篇文章主要介绍了mysql日志系统redo log和bin log介绍,文章围绕主题展开详细的内容介绍,具有一定的参考价值,需要的小伙伴可以参考一下

首先,我们先来看看一次查询/更新语句流程图

本文会将重点放在执行器<->存储引擎之间的交互。

mysql不是每次数据更改都立刻写到磁盘,而是会先将修改后的结果暂存在内存中,当一段时间后,再一次性将多个修改写到磁盘上,减少磁盘io成本,同时提高操作速度。

mysql通过WAL(write-ahead logging)技术保证事务:

在同一个事务中,每当数据库进行修改数据操作时,将修改结果更新到内存后,会在redo log添加一行记录记录“需要在哪个数据页上做什么修改”,并将该记录状态置为prepare,等到commit提交事务后,会将此次事务中在redo log添加的记录的状态都置为commit状态,之后将修改落盘时,会将redo log中状态为commit的记录的修改都写入磁盘。

过程如下图:

redo log记录方式:

redolog的大小是固定的,在mysql中可以通过修改配置参数innodb_log_files_in_group和innodb_log_file_size配置日志文件数量和每个日志文件大小,redolog采用循环写的方式记录,当写到结尾时,会回到开头循环写日志。

如下redolog记录方式图:

write pos表示日志当前记录的位置,当ib_logfile_4写满后,会从ib_logfile_1从头开始记录;check point表示将日志记录的修改写进磁盘,完成数据落盘,数据落盘后checkpoint会将日志上的相关记录擦除掉,即write pos->checkpoint之间的部分是redo log空着的部分,用于记录新的记录,checkpoint->write pos之间是redo log待落盘的数据修改记录。当writepos追上checkpoint时,得先停下记录,先推动checkpoint向前移动,空出位置记录新的日志。
有了redo log,当数据库发生宕机重启后,可通过redo log将未落盘的数据恢复,即保证已经提交的事务记录不会丢失。有了redo log,为啥还需要binlog呢?

  • 1、redo log的大小是固定的,日志上的记录修改落盘后,日志会被覆盖掉,无法用于数据回滚/数据恢复等操作。
  • 2、redo log是innodb引擎层实现的,并不是所有引擎都有。

基于以上,binlog必不可少

  • 1、binlog是server层实现的,意味着所有引擎都可以使用binlog日志
  • 2、binlog通过追加的方式写入的,可通过配置参数max_binlog_size设置每个binlog文件的大小,当文件大小大于给定值后,日志会发生滚动,之后的日志记录到新的文件上。
  • 3、binlog有两种记录模式,statement格式的话是记sql语句, row格式会记录行的内容,记两条,更新前和更新后都有。

binlog和redo log必须保持一致,不允许出现binlog有记录但redolog没有的情况,反之亦然。之前说过在一个事务中,redolog有prepare和commit两种状态,所以,在redolog状态为prepare时记录binlog可保证两日志的记录一致,下图列出各种情况来说明。

现在我们再来看看整个完整的流程图:

相关参数设置建议:

  • 1、innodb_flush_log_at_trx_commit:设置为1,表示每次事务的redolog都直接持久化到磁盘(注意是这里指的是redolog日志本身落盘),保证mysql重启后数据不丢失。
  • 2、sync_binlog: 设置为1,表示每次事务的binlog都直接持久化到磁盘(注意是这里指的是binlog日志本身落盘),保证mysql重启后binlog记录是完整的。

到此这篇关于mysql日志系统redo log和bin log介绍的文章就介绍到这了,更多相关mysql日志系统 内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • MySQL查看表和清空表的常用命令总结

    MySQL查看表和清空表的常用命令总结

    这篇文章主要介绍了MySQL查看表和清空表的常用命令总结,是MySQL入门学习中的基础知识,需要的朋友可以参考下
    2015-11-11
  • MySQL Binlog 日志处理工具对比分析

    MySQL Binlog 日志处理工具对比分析

    这篇文章主要介绍了MySQL Binlog 日志处理工具对比分析的相关资料,帮助大家更好的理解和学习使用MySQL数据库,感兴趣的朋友可以了解下
    2021-03-03
  • 在一台服务器上安装两个或多个mysql的实现步骤

    在一台服务器上安装两个或多个mysql的实现步骤

    这篇文章给大家介绍如何在一台服务器上安装两个或多个mysql的实现步骤,有需要的朋友们可以参考学习,下面跟着小编一起来看看吧。
    2016-09-09
  • 详解MySQL中的存取权限

    详解MySQL中的存取权限

    这篇文章主要介绍了详解MySQL中的存取权限,针对用户使用数据库权限分配的问题做出说明,需要的朋友可以参考下
    2015-07-07
  • MySQL外键约束的禁用与启用命令

    MySQL外键约束的禁用与启用命令

    下面小编就为大家带来一篇MySQL外键约束的禁用与启用命令。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-03-03
  • Mysql数据库的导入导出方式(各种情况)

    Mysql数据库的导入导出方式(各种情况)

    这篇文章主要介绍了Mysql数据库的导入导出方式(各种情况),具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-03-03
  • MySQL中的嵌套查询

    MySQL中的嵌套查询

    这篇文章主要介绍了MySQL中的嵌套查询方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-04-04
  • MySQL 外键(FOREIGN KEY)用法案例详解

    MySQL 外键(FOREIGN KEY)用法案例详解

    这篇文章主要介绍了MySQL 外键(FOREIGN KEY)用法案例详解,本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下
    2021-08-08
  • 解决Mysql建表时报错invalid ON UPDATE clause for 'create_date' column

    解决Mysql建表时报错invalid ON UPDATE clause for 'create_d

    这篇文章主要介绍了解决Mysql建表时报错invalid ON UPDATE clause for 'create_date' column问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-12-12
  • mysql like 特殊字符搜索的实现

    mysql like 特殊字符搜索的实现

    在MySQL中,LIKE操作符用于在查询数据时进行模糊匹配,本文主要介绍了mysql like 特殊字符搜索的实现,具有一定的参考价值,感兴趣的可以了解一下
    2023-09-09

最新评论