MySQL 日志相关知识总结

 更新时间:2021年2月4日 10:00  点击:2182

数据库中用于存储数据的文件称为data file,日志文件称为log file。此外,如果每次读写都是直接访问磁盘,性能很差,所以数据库是有缓存的,数据缓存是data buffer,日志缓存log buffer。

sql执行顺序

当我们执行一条更新语句时,比如 update table set c=c+1 where id = 2,执行顺序如下:

  • 执行器通过存储引擎获取id=2的行记录。如果id=2的行记录所在的数据页已经在内存中,则直接返回;否则,需要从磁盘读取数据
  • 执行器拿到返回的行数据,把字段c的值+1,得到新的行数据,然后调用存储引擎接口写入行数据
  • 引擎把这行数据更新到内存,同时将这个更新操作记录到redo log里面,此时redo log处于prepare状态。然后告诉执行器执行完成,随时可以提交事务
  • 执行器生成这个操作的bin log,并把bin log写入磁盘
  • 执行器调用引擎的提交事务接口,引擎把刚刚写入的redo log改成commit状态,更新完成

补充:MySQL的基本存储结构是页(记录都存在页里边),所以MySQL是先把这条记录所在的页找到,然后把该页加载到内存中,再修改对应的记录。

bin log

是什么

bin log称为归档日志、二进制日志,属于MySQL Server层面的,用于记录数据库表结构和表数据的变更,可以简单理解为存储每条变更的sql语句,比如insert、delete、update(当然,不仅是sql,还有事务id,执行时间等等)。

什么时候产生

事务提交的时候,一次性将事务中的sql语句按照一定格式记录到bin log

有什么用

主要有两个作用:主从复制和恢复数据

  • 目前大部分数据库架构都是一主多从,从服务器通过访问主服务器的bin log,保证数据一致性
  • bin log记录数据库的变更,可以通过它恢复数据

什么时候落盘

区分innodb_flush_log_at_trx_commit和sync_binlog

​ 二进制日志取决于sync_binlog参数

  • 0:事务提交后,由操作系统决定什么时候把缓存刷新到磁盘(性能最好,安全性最差)
  • 1:每提交一次事务,调用一次fsync将缓存写入到磁盘(安全性最好,性能最差)
  • n:当提交n次事务后,调用一次fsync将缓存写入到磁盘

文件记录模式

bin log有三种文件记录模式,分别是row、statement、mixed

  • row(row-based replication,PBR):记录每一行数据的修改情况

优点:能够清楚记录每行数据修改细节,能够完全保证主从数据一致性
缺点:批量操作时会产生大量的日志,比如alter table

  • statement:记录每条修改数据的sql,可认为sql语句复制

优点:日志数据量小,减少磁盘IO,提高存储和恢复速度
缺点:在某些情况下会出现主从不一致,比如sql语句中包含**now()**等函数

  • mixed:上面两种模式的混合,MySQL会根据sql语句选择写入模式,一般使用statement模式保存bin log,对于statement模式无法复制的操作,使用row模式保存bin log。

redo log

是什么

redo log称为重做日志,属于InnoDB存储引擎层的日志,记录物理页的修改信息,而不是某一行或几行修改成什么样

什么时候产生

事务开始,就会写入redo log。redo log写入到磁盘并不是随着事务提交才写入,而是在事务执行过程中,就已经写入到磁盘

有什么用

可用于恢复数据。redo log是在事务开始后就写入到磁盘,且是顺序IO,写入速度较快。如果服务器突然掉电,InnoDB引擎会使用redo log把数据库恢复到掉电前的时刻,保证数据的完整性

什么时候落盘

InnoDB先把日志写到缓冲区(log buffer),然后再把日志从log buffer刷到os buffer,最后调用文件系统的fsync函数将日志刷新到磁盘。重做日志写入时机由参数innodb_flush_log_at_trx_commit决定

  • 0:每秒一次,把log buffer写入os buffer,并调用fsync刷到磁盘
  • 1:每次提交事务时,把log buffer写入os buffer,并调用fsync刷到磁盘
  • 2:每次提交事务时,只是写入到os buffer,然后每秒一次调用fsync将日志刷新到磁盘

一般取值为2,因为即使MySQL宕机,数据也没有丢失。只有整个服务器挂了,才损失1秒的数据

bin log VS redo log

看了以上的介绍,感觉bin log和redo log很像,都是记录数据变更,可用于恢复。其实,它们还是有明显区别的。

  • bin log属于MySQL Server层面的,redo log属于InnoDB存储引擎层面
  • bin log是逻辑日志,记录的是sql语句的原始逻辑;redo log是物理日志,记录的是物理页面更新的内容
  • bin log是追加写,文件达到限制后会更换下个文件,不会覆盖;redo log是循环写,文件大小固定,写满就重头开始写,覆盖原来的内容
  • bin log作用是主从复制和恢复数据,当数据库被删除、或者从库同步主库数据时,由于bin log记录变更数据的sql,所以可通过bin log恢复。而redo log作用是持久化,当发生服务器宕机或者掉电等情况,数据丢失,可以通过redo log恢复。
  • bin log是提交事务时才写入磁盘,而redo log在开启事务时,就开始写入到磁盘

如果整个数据库被删除,可以通过redo log恢复吗?

不行!因为redo log侧重点是保存某次事务的数据变更,当内存中的数据刷到磁盘后,redo log的数据其实已经没有参考价值。此外,redo log会覆盖历史数据,也不可能通过它来恢复所有数据。

undo log

详细分析MySQL事务日志

是什么

undo log称为回滚日志,属于InnoDB存储引擎层,是逻辑日志,记录每行数据。当我们变更数据时,就会产生undo log,可以认为insert一条数据,undo log会记录一条对应的delete日志,反之亦然。

什么时候产生

在事务开始前,将当前版本生成undo log

有什么用

主要作用:提供回滚和多版本并发控制(MVCC)

  • 回滚:当需要rollback时,从undo log的逻辑记录读取相应的内容进行回滚
  • MVCC:undo log记录中存储的是旧版本数据,当一个事务需要读取数据时,会顺着undo链找到满足其可见性的记录

以上就是MySQL 日志相关知识总结的详细内容,更多关于MySQL 日志的资料请关注猪先飞其它相关文章!

[!--infotagslink--]

相关文章

  • MySQL性能监控软件Nagios的安装及配置教程

    这篇文章主要介绍了MySQL性能监控软件Nagios的安装及配置教程,这里以CentOS操作系统为环境进行演示,需要的朋友可以参考下...2015-12-14
  • 详解Mysql中的JSON系列操作函数

    新版 Mysql 中加入了对 JSON Document 的支持,可以创建 JSON 类型的字段,并有一套函数支持对JSON的查询、修改等操作,下面就实际体验一下...2016-08-23
  • Laravel 调试工具 laravel-debugbar 打印日志消息

    laravel-debugbar 调试工具的教程小编整理了几篇不错的教程,今天我们来看一篇Laravel 调试工具 laravel-debugbar 打印日志消息例子,希望文章对各位有帮助。 其实不...2016-11-25
  • 深入研究mysql中的varchar和limit(容易被忽略的知识)

    为什么标题要起这个名字呢?commen sence指的是那些大家都应该知道的事情,但往往大家又会会略这些东西,或者对这些东西一知半解,今天我总结下自己在mysql中遇到的一些commen sense类型的问题。 ...2015-03-15
  • MySQL 字符串拆分操作(含分隔符的字符串截取)

    这篇文章主要介绍了MySQL 字符串拆分操作(含分隔符的字符串截取),具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2021-02-22
  • mysql的3种分表方案

    一、先说一下为什么要分表:当一张的数据达到几百万时,你查询一次所花的时间会变多,如果有联合查询的话,有可能会死在那儿了。分表的目的就在于此,减小数据库的负担,缩短查询时间。根据个人经验,mysql执行一个sql的过程如下:1...2014-05-31
  • Windows服务器MySQL中文乱码的解决方法

    我们自己鼓捣mysql时,总免不了会遇到这个问题:插入中文字符出现乱码,虽然这是运维先给配好的环境,但是在自己机子上玩的时候咧,总得知道个一二吧,不然以后如何优雅的吹牛B。...2015-03-15
  • 用VirtualBox构建MySQL测试环境

    宿主机使用网线的时候,客户机在Bridged Adapter模式下,使用Atheros AR8131 PCI-E Gigabit Ethernet Controller上网没问题。 宿主机使用无线的时候,客户机在Bridged Adapter模式下,使用可选项里唯一一个WIFI选项,Microsoft Virtual Wifi Miniport Adapter也无法上网,故弃之。...2013-09-19
  • Centos5.5中安装Mysql5.5过程分享

    这几天在centos下装mysql,这里记录一下安装的过程,方便以后查阅Mysql5.5.37安装需要cmake,5.6版本开始都需要cmake来编译,5.5以后的版本应该也要装这个。安装cmake复制代码 代码如下: [root@local ~]# wget http://www.cm...2015-03-15
  • Powershell 查询 Windows 日志的方法

    这篇文章主要介绍了Powershell 查询 Windows 日志的方法,需要的朋友可以参考下...2020-06-30
  • 对MySQL日志操作的一些基本命令总结

    MySQL日志主要包含:错误日志、查询日志、慢查询日志、事务日志、二进制日志;日志是mysql数据库的重要组成部分。日志文件中记录着mysql数据库运行期间发生的变化;也就是说用来记录mysql数据库的客户端连接状况、SQL语句...2015-11-24
  • node.js如何操作MySQL数据库

    这篇文章主要介绍了node.js如何操作MySQL数据库,帮助大家更好的进行web开发,感兴趣的朋友可以了解下...2020-10-29
  • 忘记MYSQL密码的6种常用解决方法总结

    首先要声明一点,大部分情况下,修改MySQL密码是需要有mysql里的root权限的...2013-09-11
  • MySQL数据库备份还原方法

    MySQL命令行导出数据库: 1,进入MySQL目录下的bin文件夹:cd MySQL中到bin文件夹的目录 如我输入的命令行:cd C:/Program Files/MySQL/MySQL Server 4.1/bin (或者直接将windows的环境变量path中添加该目录) ...2013-09-26
  • Mysql命令大全(详细篇)

    一、连接Mysql格式: mysql -h主机地址 -u用户名 -p用户密码1、连接到本机上的MYSQL。首先打开DOS窗口,然后进入目录mysql/bin,再键入命令mysql -u root -p,回车后提示你输密码.注意用户名前可以有空格也可以没有空格,但是密...2015-11-08
  • Navicat for MySQL 11注册码\激活码汇总

    Navicat for MySQL注册码用来激活 Navicat for MySQL 软件,只要拥有 Navicat 注册码就能激活相应的 Navicat 产品。这篇文章主要介绍了Navicat for MySQL 11注册码\激活码汇总,需要的朋友可以参考下...2020-11-23
  • mysql IS NULL使用索引案例讲解

    这篇文章主要介绍了mysql IS NULL使用索引案例讲解,本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下...2021-08-14
  • RHEL6.5编译安装MySQL5.6.26教程

    一、准备编译环境,安装所需依赖包yum groupinstall 'Development' -y yum install openssl openssl-devel zlib zlib-devel -y yum install readline-devel pcre-devel ncurses-devel bison-devel cmake -y二、编译安...2015-10-21
  • 基于PostgreSQL和mysql数据类型对比兼容

    这篇文章主要介绍了基于PostgreSQL和mysql数据类型对比兼容,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2020-12-25
  • Mysql中 show table status 获取表信息的方法

    这篇文章主要介绍了Mysql中 show table status 获取表信息的方法的相关资料,需要的朋友可以参考下...2016-03-12