MySQL日志简述(redo log、undo log、bin log)

一、前言

redo log、undo log、bin log是MySQL中的三大核心日志,其中redo log、undo log是innoDB引擎层的日志,bin log是server层的日志。理解这三种日志,对于帮助我们理解事务有十分重要的意义。

二、redo log

作用:确保事务的持久性,记录数据修改之后的值,当数据写入到内存,但还没写到磁盘时,服务器出现故障,重启MySQL后,会从redo log恢复发生故障之前的数据,叫做crash-safe

提升性能:更新数据时,为了减少磁盘IO次数,每次操作都会先将数据写入到内存中,再根据策略将redo log中的数据刷到磁盘中去。

刷盘策略:通过innodb_flush_log_at_trx_commit 值来控制刷盘策略

  • 值为0时,每次提交事务不进行刷盘操作,而是每秒执行一次将数据刷新写入到磁盘中,在事务提交后,Log Buffer不会直接将数据写入到OS Buffer,而是每秒写入一次数据到OS Buffer并调用fsync()写入磁盘,所以MySQL服务挂了或服务器宕机时有可能导致1秒钟数据丢失,性能最高
  • 值为1时,每次提交事务都会将Log Buffer写入OS Buffer再调用fsync()写入磁盘。即使过程中MySQL服务挂了或服务器宕机,也不会丢失数据,但性能最差,也是默认的策略
  • 值为2时,每次提交事务都会写入到OS Buffer中,再每秒调用fsync()写入磁盘,只有服务器宕机才有可能丢失一秒钟数据,性能居中,但比起值为0时的策略要安全很多

OS buffer:操作系统的缓存

log buffer:MySQL的缓存

通过show variables like '%innodb_log%' ;可以查看redo log的文件大小等信息

二、undo log

作用:确保事务的原子性,同时可以实现多版本并发控制(MVCC)

内容:undo log是逻辑日志,会通过逻辑将数据恢复到事务开始之前的的状态

产生时间:在事务开始之前就会产生

存储位置:默认存储在共享空间中,可通过以下语法查看

show global variables like "innodb_data_file_path%";

三、bin log

作用:可以恢复数据库,可以帮助实现MySQL主从复制

bin log与redo log的区别

  1. bin log是server层面的,redo log是innoDB独有的
  2. bin log是逻辑日志,redo log是物理日志
  3. redo log的恢复效率比bin log快
  4. redo log是循环写的,有空间限制,binlog是追加的

你可能感兴趣的:(mysql,mysql)