深入理解MySQL日志

1.Error Log

  • 记录MySQL运行过程中的Error、Warning、Note等信息,系统出错或者某条记录出问题可以查看Error日志。
MySQL的错误日志默认以hostname.err存放在MySQL的日志目录,可以通过以下语句查看
图片.png
  • 默认安装时,错误日志通常在配置文件(my.cnf)中 mysqld 部分的 log-error 配置项进行设置;利用 MySQL 系统变量 log_error 可以查看错误日志的文件名
  • 修改错误日志的地址可以在 my.cnf 中添加--log-error = [filename]来开启mysql错误日志。配置如下:

    log_error = /data/mysql_data/error.log
    

2.Slow Log

  • MySQL 慢查询日志(slow query log)记录了执行时间超过指定阈值的 SQL 语句,可以用于监控需要执行优化的查询语句。
  • 如果启用了慢查询日志,任何执行时间超过 long_query_time 并且执行次数达到 min_examined_row_limit 次的查询语句都会被记录到慢查询日志中。
查看日志功能是否开启:show variables like "%slow%";
引用
图片.png
slow_query_log 配置为ON , 说明开启慢日志
  • 查看下默认设置的慢查询的时间:show variables like "%long_query%";

图片.png

  • 查看一下日志文件的输出:

图片.png

对于慢查询日志的分析,推荐使用 mysqldumpslow 或者 pt-query-digest 工具

3.Relay Log

  • MySQL 中继日志(relay log)只存在于主从复制结构中的从节点上,用于保存主节点传输过来的数据变更事件,然后将这些事件应用于从节点。
  • 中继日志与二进制日志类似,也是由一组带编号的文件组成;同时还包含了一个索引文件,记录了所有已经使用过的中继日志文件。中继日志文件默认存放在数据目录中。
    图片.png

图片.png

其中 relay_log 和 relay_log_index 分别对应为中继日志的文件名和索引文件名。 中继日志文件的格式和二进制日志文件的格式相同,因此也可以使用 mysqlbinlog 工具进行读取

4.Binlog

  • 什么是binlog

    binlog记录了数据库表结构和表数据变更,比如update/delete/insert/truncate/create,它不会记录select
    
    
  • binlog长什么样

    binlog我们可以简单理解为:存储着每条变更的SQL语句
    默认情况下binlog日志是二进制格式,无法直接查看,可以使用mysqlbinlog来查看,mysqlbinlog是mysql官方提供的一个binlog查看工具。
    
    
  • binlog一般用来做什么

    主要有两个作用:复制和恢复数据
    1.MySQL在公司使用的时候往往都是一主多从结构的,从服务器需要与主服务器的数据保持一致,这就是通过binlog来实现的
    2.数据库的数据被干掉了,我们可以通过binlog来对数据进行恢复。因为binlog记录了数据库表的变更,所以我们可以用binlog进行复制(主从复制)和恢复数据。
    

5.Redo Log

  • 什么是redo log
update table set name='ws' where id = 3
引用
MySQL执行这条SQL语句,肯定是先把id=3的这条记录查出来,然后将name字段给改掉。这没问题吧?
引用
实际上Mysql的基本存储结构是页(记录都存在页里边),所以MySQL是先把这条记录所在的页找到,然后把该页加载到内存中,将对应记录进行修改。
问题1:如果在内存中把数据改了,还没来得及落磁盘,而此时的数据库挂了怎么办?显然这次更改就丢了。

  • redo log 的作用
其实写redo log的时候,也会有buffer,是先写buffer,再真正落到磁盘中的。至于从buffer什么时候落磁盘,会有配置供我们配置。
引用
redo log的作用是当我们修改的时候,写完内存了,但数据还没真正写到磁盘的时候。此时我们的数据库挂了,我们可以根据redo log来对数据进行恢复。
引用
因为redo log是顺序IO,所以写入的速度很快,并且redo log记载的是物理变化(xxxx页做了xxx修改),文件的体积很小,恢复速度很快。
引用
  • 什么时候释放

    当对应事务的脏页写入到磁盘之后,redo log的使命也就完成了,重做日志占用的空间就可以重用(被覆盖)。
    

Redo Log & Binlog

  1. 存储的内容

       redo log 记录的是数据的物理变化,binlog 记录的是数据的逻辑变化
    
  2. 功能

       redo log的作用是为持久化而生的。写完内存,如果数据库挂了,那我们可以通过    redo log来恢复内存还没来得及刷到磁盘的数据,
       binlog的作用是复制和恢复而生的。主从服务器需要保持数据的一致性,通过binlog来同步数据。
    
  3. binlog和redo log 写入的细节

       redo log是MySQL的Innodb引擎所产生的。
       binlog无论MySQL用什么引擎,都会有的。
    
  4. 写入时间

      redo log事务开始的时候,就开始记录每次的变更信息
      而binlog是在事务提交的时候才记录。
    
问题2:如果每个请求都需要将数据立马落磁盘之后,那速度会很慢,MySQL可能也顶不住。所以MySQL是怎么做的呢?

MySQL引入了redo log,内存写完了,然后会写一份redo log,这份redo log记载着这次在某个页上做了什么修改。

6.Undo log

1. undo log主要有两个作用:回滚和多版本控制(MVCC)
在数据修改的时候,不仅记录了redo log,还记录undo log,如果因为某些原因导致事务失败或回滚了,可以用undo log进行回滚
undo log主要存储的也是逻辑日志,比如我们要insert一条数据了,那undo log会记录的一条对应的delete日志。
我们要update一条记录时,它会记录一条对应相反的update记录。因为undo log存储着修改之前的数据,相当于一个前版本,MVCC实现的是读写不阻塞,读的时候只要返回前一个版本的数据就行了。
  1. 什么时候产生

     事务开始之前,将当前的版本生成undo log,undo 也会产生 redo 来保证undo log的可靠性
    
  2. 什么时候释放

     当事务提交之后,undo log并不能立马被删除,而是放入待清理的链表,由purge线程判断是否由其他事务在使用undo段中表的上一个事务之前的版本信息,决定是否可以清理undo log的日志空间。
    

应用

1.MySQL 怎么保证一致性的

*从数据库层面,数据库通过原子性、隔离性、持久性来保证一致性。在ACID四大特性之中,C(一致性)是目的,A(原子性)、I(隔离性)、D(持久性)是手段,是为了保证一致性,数据库提供的手段。

*MySQL通过两阶段提交来保证redo log和binlog的数据是一致的。

*阶段1:InnoDB redo log 写盘,InnoDB 事务进入 prepare 状态

*阶段2:binlog 写盘,InnoDB 事务进入 commit 状态

*每个事务binlog的末尾,会记录一个 XID event,标志着事务是否提交成功,也就是说,恢复过程中,binlog 最后一个 XID event 之后的内容都应该被 清除

2.MySQL怎么保证原子性的

利用Innodb的undo log。

undo log回滚日志,是实现原子性的关键

当事务回滚时能够撤销所有已经成功执行的sql语句,它需要记录你要回滚的相应日志信息。

3.MySQL怎么保证持久性的

利用Innodb的redo log
InnoDB是有事务的:持久性就是靠redo log来实现的(如果写入内存成功,但数据还没真正刷到磁盘,如果此时的数据库挂了,我们可以靠redo log来恢复内存的数据,这就实现了持久性)
采用redo log的好处是将redo log进行刷盘比对数据页刷盘效率高,具体表现如下:
      1.redo log体积小,毕竟只记录了哪一页修改了啥,因此体积小,刷盘快。
      2.redo log是一直往末尾进行追加,属于顺序IO。效率显然比随机IO来的快。
391 声望
2 粉丝
0 条评论
推荐阅读
一文搞懂秒杀系统,欢迎参与开源,提交PR,提高竞争力。早日上岸,升职加薪。
前言秒杀和高并发是面试的高频考点,也是我们做电商项目必知必会的场景。欢迎大家参与我们的开源项目,提交PR,提高竞争力。早日上岸,升职加薪。知识点详解秒杀系统架构图秒杀流程图秒杀系统设计这篇文章一万多...

王中阳Go34阅读 2.6k评论 1

封面图
万字长文~vue+express+mysql带你彻底搞懂项目中的权限控制(附所有源码)
所谓的权限,其实指的就是:用户是否能看到,以及是否允许其对数据进行增删改查的操作,因为现在开发项目的主流方式是前后端分离,所以整个项目的权限是后端权限控制搭配前端权限控制共同实现的

水冗水孚11阅读 1.5k

花了几个月时间把 MySQL 重新巩固了一遍,梳理了一篇几万字 “超硬核” 的保姆式学习教程!(持续更新中~)
MySQL 是最流行的关系型数据库管理系统,在 WEB 应用方面 MySQL 是最好的 RDBMS(Relational Database Management System:关系数据库管理系统)应用软件之一。

民工哥11阅读 1.1k

封面图
一次偶然机会发现的MySQL“负优化”
今天要讲的这件事和上述的两个sql有关,是数年前遇到的一个关于MySQL查询性能的问题。主要是最近刷到了一些关于MySQL查询性能的文章,大部分文章中讲到的都只是一些常见的索引失效场合,于是我回想起了当初被那个...

骑牛上青山8阅读 2.3k评论 2

初学后端,如何做好表结构设计?
这篇文章介绍了设计数据库表结构应该考虑的4个方面,还有优雅设计的6个原则,举了一个例子分享了我的设计思路,为了提高性能我们也要从多方面考虑缓存问题。

王中阳Go3阅读 837评论 2

封面图
2023最新MySQL高频面试题汇总
本文已经收录到Github仓库,该仓库包含计算机基础、Java基础、多线程、JVM、数据库、Redis、Spring、Mybatis、SpringMVC、SpringBoot、分布式、微服务、设计模式、架构、校招社招分享等核心知识点,欢迎star~

程序员大彬3阅读 1k

Mysql索引覆盖
通常情况下,我们创建索引的时候只关注where条件,不过这只是索引优化的一个方向。优秀的索引设计应该纵观整个查询,而不仅仅是where条件部分,还应该关注查询所包含的列。索引确实是一种高效的查找数据方式,但...

京东云开发者2阅读 973

封面图
391 声望
2 粉丝
宣传栏