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日志系统 内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • MySQL日志系统详细资料分享

    做过大型系统的都知道,日志的作用不用小觑,往往到了项目中后期,对项目进行优化升级都是依据日志做出升级优化的决策的.那么学习MySQL,日志部分当然不能错过.我们面试中实际应用的所谈到的优化都是要从日志中得出来的.系统的学习mysql的日志,有助于我们准确的定位问题,提高自己的工作水平.此外,后面的一系列日志会重点从DBA的运维方面进行着手,系统的去理解MySQL各方面的配置,做到知己知彼,让MySQL成为自己得心应手的数据仓库. 一.MySQL的日志类型 默认情况下,所有的MySQL日志以文件的

  • Laravel框架使用monolog_mysql实现将系统日志信息保存到mysql数据库的方法

    本文实例讲述了Laravel框架使用monolog_mysql实现将系统日志信息保存到mysql数据库的方法.分享给大家供大家参考,具体如下: Laravel中使用monolog_mysql将系统日志信息保存到mysql数据库 源码参考: https://github.com/markhilton/monolog-mysql 一.安装Installation 在文件根目录: composer require markhilton/monolog-mysql 发现composer.json文件里的

  • mysql中redo log和 binlog的区别

    想跟大家聊聊关于 mysql 中的两个小的知识点:redo log 和 binlog . redo log :InnoDB 存储引擎层方面的日志,所以如果你使用的存储引擎不是 InnoDB 的话,那就根本谈不上 redo log. binlog : MySQL Server 层记录的日志,所以不管是用的什么存储引擎,只要是 MySQL 都是会有 binlog 的存在,在做 MySQL 主从复制的时候,利用的就是 binlog. 接下来,我们就详细来看看它们都分别做了啥? redo log 为什么

  • mysql日志系统的简单使用教程

    前言 MySQL是一个关系型数据库管理系统,由瑞典MySQL AB 公司开发,属于 Oracle 旗下产品.MySQL 是最流行的关系型数据库管理系统之一,在 WEB 应用方面,MySQL是最好的 RDBMS (Relational Database Management System,关系数据库管理系统) 应用软件之一. 在任何一种数据库中,都会有各种各样的日志,记录着数据库工作的方方面面,以帮助数据库管理员追踪数据库曾 经发生过的各种事件. 在 MySQL 中,有 4 种不同的日志,分别是

  • MySQL系列之redo log、undo log和binlog详解

    事务的实现 redo log保证事务的持久性,undo log用来帮助事务回滚及MVCC的功能. InnoDB存储引擎体系结构 redo log Write Ahead Log策略 事务提交时,先写重做日志再修改页:当由于发生宕机而导致数据丢失时,就可以通过重做日志来完成数据的恢复. InnoDB首先将重做日志信息先放到重做日志缓存 按一定频率刷新到重做日志文件 重做日志文件: 在默认情况,InnoDB存储引擎的数据目录下会有两个名为ib_logfile1和ib_logfile2的文件.每个In

  • Mysql中undo、redo与binlog的区别浅析

    目录 前言 [undo log] [redo log] [binlog] 总结 前言 MySQL中有六种日志文件,分别是:重做日志(redo log).回滚日志(undo log).二进制日志(binlog).错误日志(errorlog).慢查询日志(slow query log).一般查询日志(general log),中继日志(relay log). 其中重做日志和回滚日志与事务操作息息相关,二进制日志也与事务操作有一定的关系,这三种日志,对理解MySQL中的事务操作有着重要的意义.   与

  • Mysql数据库中的redo log 写入策略和binlog 写入策略

    目录 redo log的写入策略 binlog的写入策略 生产配置 性能瓶颈 redo log的写入策略 InnoDB提供了innodb_flush_log_at_trx_commit参数,它有三种可能取值: 设置为0的时候,表示每次事务提交时都只是把redo log留在redo log buffer中; 设置为1的时候,表示每次事务提交时都将redo log直接持久化到磁盘: 设置为2的时候,表示每次事务提交时都只是把redo log写到page cache. 查看mysql变量:show V

  • 一文弄懂MySQL中redo log与binlog的区别

    目录 前言 1. 什么是redo log? 1.1 redo日志文件名 1.2 影响redo log参数 1.3 redo log大小怎么设置? 2. 什么是binlog 2.1 binlog文件名 2.2 影响binlog的参数 2.3 查看binlog 3. redo log与binlog的区别 总结 前言 MySQL中有六种日志文件,分别是:重做日志(redo log).回滚日志(undo log).二进制日志(binlog).错误日志(errorlog).慢查询日志(slow query

  • MySQL5.7慢查询日志时间与系统时间差8小时原因详解

    在对慢查询进行查看的时候发现时间不对,正好与系统时间相差8个小时. 1.慢查询显示时间如下 # Time: 2020-01-10T06:42:24.940811Z 2.系统时间 $ date Fri Jan 10 14:42:31 CST 2020 3.查看数据库参数 mysql> show variables like 'log_timestamps'; +----------------+-------+ | Variable_name | Value | +----------------

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

    首先,我们先来看看一次查询/更新语句流程图 本文会将重点放在执行器<->存储引擎之间的交互. mysql不是每次数据更改都立刻写到磁盘,而是会先将修改后的结果暂存在内存中,当一段时间后,再一次性将多个修改写到磁盘上,减少磁盘io成本,同时提高操作速度. mysql通过WAL(write-ahead logging)技术保证事务: 在同一个事务中,每当数据库进行修改数据操作时,将修改结果更新到内存后,会在redo log添加一行记录记录“需要在哪个数据页上做什么修改”,并将该记录状态置为prep

  • MySQL中的redo log和undo log日志详解

    MySQL日志系统中最重要的日志为重做日志redo log和归档日志bin log,后者为MySQL Server层的日志,前者为InnoDB存储引擎层的日志. 1 重做日志redo log 1.1 什么是redo log redo log用于保证事务的持久性,即ACID中的D. 持久性:指一个事务一旦被提交,它对数据库中数据的改变就是永久性的,接下来即使数据库发生故障也不应该对其有任何影响. redo log有两种类型,分别为物理重做日志和逻辑重做日志.在InnoDB中redo log大多数情

  • MySQL日志专项之redo log和undo log介绍

    目录 Redo Log redo log刷盘策略 其他参数 Undo Log 回滚段与undo页 Undo类型 undo log的生命周期 详细生成过程 undo log是如何回滚的 扩展 bin log 写入时机 binlog与redo log对比 两阶段提交 Redo Log REDO LOG称为重做日志 ,当MySQL服务器意外崩溃或者宕机后,保证已经提交的事务持久化到磁盘中(持久性). InnoDB是以页为单位去操作记录的,增删改查都会加载整个页到buffer pool中(磁盘->内存)

  • springboot项目配置logback日志系统的实现

    记录springboot项目配置logback日志文件管理: logback依赖jar包 SpringBoot项目配置logback理论上需要添加logback-classic依赖jar包: <dependency> <groupId>ch.qos.logback</groupId> <artifactId>logback-classic</artifactId> <version>1.2.3</version> <

  • 详解MySQL 重做日志(redo log)与回滚日志(undo logo)

    前言: 前面文章讲述了 MySQL 系统中常见的几种日志,其实还有事务相关日志 redo log 和 undo log 没有介绍.相对于其他几种日志而言, redo log 和 undo log 是更加神秘,难以观测的.本篇文章将主要介绍这两类事务日志的作用及运维方法. 1.重做日志(redo log) 我们都知道,事务的四大特性里面有一个是 持久性 ,具体来说就是只要事务提交成功,那么对数据库做的修改就被永久保存下来了,不可能因为任何原因再回到原来的状态.那么 MySQL 是如何保证一致性的呢

  • mysql日志文件之undo log和redo log

    目录 前言 1 undo 1.1 undo是什么 1.2 undo参数 1.3 undo空间管理 2 redo 2.1 redo是什么 2.2 redo 参数 2.3 redo 空间管理 3 undo及redo如何记录事务 3.1 Undo + Redo事务的简化过程 3.2  IO影响 3.3 恢复 总结 前言 在数据库系统中,既有存放数据的文件,也有存放日志的文件.日志在内存中也是有缓存Log buffer,也有磁盘文件log file,本文主要描述存放日志的文件. MySQL中的日志文件,

  • MySQL事务日志(redo log和undo log)的详细分析

    目录 前言 1.redo log 1.1 redo log和二进制日志的区别 1.2 redo log的基本概念 1.3 日志块(log block) 1.4 log group和redo log file 1.5 redo log的格式 1.6 日志刷盘的规则 1.7 数据页刷盘的规则及checkpoint 1.8 LSN超详细分析 1.9 innodb的恢复行为 1.10 和redo log有关的几个变量 2.undo log 2.1 基本概念 2.2 undo log的存储方式 2.3 和

  • MySQL 8.0 redo log的深入解析

    前言 最开始了解mysql实现的时候,总听到redo log, WAL(write-ahead logging),undo log这些关键词,了解到redo log主要是用于实现事务的持久化的.为了进一步了解redo log,看了下相关代码(源码版本: mysql 8.0.12),这里简单总结下,主要介绍redo log是如何产生,如何落盘,以及最终通知用户的. redo log的产生 读写事务在执行的过程中,会不断的产生redo log.申请数据页.修改数据页.记录undo log等,都会产生

随机推荐