MySQL中有两类非常重要的日志,一类是redo log(重做日志),一类是bin log(归档日志)

redo log

重做日志利用的,是MySQL中,常见的WAL技术,WAL技术的全程是:Write-Ahead-Logging,它的关键点就是先写日志,再写磁盘。
在我们的MySQL中,当有一条记录需要更新的时候,InnoDB引擎就会将记录先写到redo log里,并且更新内存,这个时候这次更新操作就已经结束了,InnoDB引擎会在适当的时候,将这个操作记录到磁盘里,这个更新通常情况是在系统比较空闲的时候做的。
InnoDB的redo log是大小固定的,比如可以一次配置一组4个文件每个文件的大小是1GB,那么整个redo log的大小就是4GB。redo log的写入过程是循环写入,从头开始写,写到末尾后,就会又从头开始写(可以想象成一个环状)
有了redo log,InnoDB就可以保证数据库发生异常重启后,之前提交的记录不会丢失。这个能力称为crash-safe。
这里有两个问题。
1. 写日志和直接写数据库有什么差别吗?
写日志的时候,可以看做是一个追加操作,即顺序写。而写数据库则是随机写。在机械硬盘中,顺序写的速度要远大于随机写。(kafka对硬盘的操作也是顺序的,所以即使是机械硬盘,速度也不会太慢)
2. 使用redo log,刷入数据的操作,会不会影响SQL执行效率?
将redo log中的数据刷入磁盘的操作,是一个阻塞的操作。在之行SQL语句的时候,如果伴随着数据脏页的刷入,会就导致MySQL会突然抖一下,执行时间变长。

bin log

bin log被称为归档日志,它是Service层的日志。bin log属于逻辑日志,记录的是语句的原始逻辑,比如将ID等于2一行数据删除。bin log是一种非常重要的日志,他可以用于数据库的读写分离,主从复制等功能(从机读取主机的bin log,通过SQL-Thread执行SQL语句,实现同步),具体如何实现同步,会在日后的博客中讲解。

两段式提交

MySQL在执行一条修改语句时的逻辑如下:

update t set c = c + 1 where id = 5
  1. 执行器先从存储引擎中,找到id=5的这条数据,由于id是主键,所以引擎会执行使用索引树搜索,找到 id=5这一行数据,如果这一条数据已经存在于内存的数据页中,则执行返回给执行器。否则将会从磁盘中将数据页读到内存,再返回。
  2. 执行器拿到id=5的这一行数据,找到c 这一列,c+1得到新数据,再调用引擎层的接口,将新值写入。
  3. 引擎层将这一条新的数据更新到内存中,同时将这个更新操作,记录到redo log里,此时redo log处于prepare状态,通知执行器,语句已经执行成功,随时可以提交事务。
  4. 执行器生成此次操作的bin log,将bin log写入磁盘
  5. 执行器调用提交事务接口,将处于redo log的prepare状态修改成commit状态。

两段式提交的意义,是保证bin log 和redo log的数据一致性。

你了解MySQL中的日志吗?的更多相关文章

  1. mysql中的日志

    关键词:mysql日志,mysql四种日志 一.mysql日志的种类 (1)一般来说,日志有四种,分别为: 1.错误日志:log-err (记录启动,运行,停止mysql时出现的信息) 2.二进制日志 ...

  2. MySQL中redo日志

    重做日志用来实现事务的持久性,即ACID中的D,由两部分组成: 一是内存中的重做日志缓冲(redo log buffer)  易丢失 二是重做日志文件(redo log file) 持久的 InnoD ...

  3. Mysql中错误日志、binlog日志、查询日志、慢查询日志简单介绍

    前言 数据库的日志是帮助数据库管理员,追踪分析数据库以前发生的各种事件的有力根据.mysql中提供了错误日志.binlog日志(二进制日志).查处日志.慢查询日志.在此,我力求解决下面问题:各个日志的 ...

  4. Linux学习-通过loganalyzer展示MySQL中rsyslog日志

    一.实验环境 系统:CentOS7.6 软件包:apache,php,mariadb-server (都是基于光盘yum源) 源码包:loganalyzer-4.1.7.tar.gz (http:// ...

  5. MySQL系列详解三:MySQL中各类日志详解-技术流ken

    前言 日志文件记录了MySQL数据库的各种类型的活动,MySQL数据库中常见的日志文件有 查询日志,慢查询日志,错误日志,二进制日志,中继日志 .下面分别对他们进行介绍. 查询日志 1.查看查询日志变 ...

  6. mysql中的慢查询日志

    首先我们看一下关于mysql中的日志,主要包含:错误日志.查询日志.慢查询日志.事务日志.二进制日志: 日志是mysql数据库的重要组成部分.日志文件中记录着mysql数据库运行期间发生的变化:也就是 ...

  7. MySQL中的 redo 日志文件

    MySQL中的 redo 日志文件 MySQL中有三种日志文件,redo log.bin log.undo log.redo log 是 存储引擎层(innodb)生成的日志,主要为了保证数据的可靠性 ...

  8. 关于《rsyslog+mysql+loganalyzer搭建日志服务器<个人笔记>》的反思

    关于<rsyslog+mysql+loganalyzer搭建日志服务器<个人笔记>>的反思--链接--http://www.cnblogs.com/drgcaosheng/p/ ...

  9. 说说MySQL中的Redo log Undo log都在干啥

        在数据库系统中,既有存放数据的文件,也有存放日志的文件.日志在内存中也是有缓存Log buffer,也有磁盘文件log file,本文主要描述存放日志的文件.     MySQL中的日志文件, ...

随机推荐

  1. html、css以及javascript的注释方式

    HTML:<!--注释内容  -->; CSS:/* 注释内容*/ JS: //注 释内容; 或者块/*   注释内容 */, sublime中注释方法:选中注释内容+ctrl+/  , ...

  2. 一份超级完整的PyCharm图解教程

    微信搜索公众号:Python极客社区. 每天分享不一样的Python干货 PyCharm 是一种 Python IDE,可以帮助程序员节约时间,提高生产效率.那么具体如何使用呢?本文从 PyCharm ...

  3. Windows 10 更新后VMware Workstation pro无法运行 (无需卸载原版本VM)

    问题 描述:当前Windows版本是win10-1903,VMware版本比较老旧是VMware Workstation Pro 15.0.4:国庆节后微软推送了一个新的更新补丁,10月10日更新之后 ...

  4. zoj 3886 Nico Number

    中文题面: 问题描述] 我们定义一个非负整数是“好数”,当且仅当它符合以下条件之一: 1. 这个数是0或1 2. 所有小于这个数且与它互质的正整数可以排成一个等差数列 例如,8就是一个好数,因为1,3 ...

  5. numpy.rollaxis函数

    numpy.rollaxis numpy.rollaxis 函数向后滚动特定的轴到一个特定位置,格式如下: numpy.rollaxis(arr, axis, start) 参数说明: arr:数组 ...

  6. bcache 状态/配置 文件详细介绍(翻译自官网)

    声明: 文中 斜体带下划线  的段落为翻译不够准确的段落 原文:https://www.kernel.org/doc/Documentation/bcache.txt 官网:https://bcach ...

  7. python模块-time、datetime

    简单示例: 常用函数封装: # -*- coding: utf-8 -*- # @Time : 2019/8/6 14:37 # @Author : wangmengmeng import datet ...

  8. 在react项目中使用redux or mobx?

    主要比较参数: 库体积,打包项目体积 开发体验 性能对比 在对比参数前首先分析一下redux和mobx的设计模式,redux和mobx都没有使用传统的mvc/mvvm形式,而且他们使用flux结构也略 ...

  9. 代码传奇 | 身价10亿的程序员 雷军当年也为他打工——WPS之父 求伯君

    他的前半生,值得我们每一个人深思. 在普通人眼里,他寂寂无名,只有年岁稍长的文化人,才听说过他传奇般的存在. 在IT人眼里,他是块活化石,中国第一的大旗除了他,没人敢抗! 他是求伯君,从一个浙江穷山村 ...

  10. Python 中的for....else....

    在一个for循环中,当循环遇到break语句之后程序就会跳出循环,执行for循环之后的语句:但是,当整个循环都没有遇上break语句,而且你想在这种情况下做一些事情的话,你就可以通过结合else来完成 ...