MySQL日志分类

1. redo log(重做日志)

  • 是InnoDB存储引擎的日志
  • 为了记录对数据文件的物理更改,并保证总是日志先行。即在持久化数据文件前,保证之前的redo日志已经写道磁盘了。由于redo log是顺序整块写入,所以性能要更好
  • 写入过程
    • 当数据库对数据进行更改时,需要把数据页从磁盘读到buffer pool(一块内存区域)中,然后再更新buffer pool中的数据。此时buffer pool中的数据页就与磁盘上的数据页内容不一致,称buffer pool的数据页为dirty page 脏数据,此时InnoDB会把新记录写道redo log日志中(因为这个时顺序写入,IO性能高,比将buffer pool里面的数据同步到磁盘性能高。其实写redo log的时候也会有buffer),然后提交事务(但是磁盘数据还是没修改)。如果这个时候突然发生了非正常数据库重启,则这些数据还没有正常同步到磁盘文件中去。则可以通过redo log来重做记录。
  • 本质是虽然事务提交了,但是数据此时还没来得及写入磁盘,此时如果发生故障,则可以通过redo log来进行数据重做
  • 数据更新的时候就会进行redo log写入。而不是要等到要提交的时候才开始redo log写入
  • 是物理日志,

2. undo log(归滚日志)

  • 开始数据修改的时候,undo log会产生一条日志。
  • 存储的是逻辑日志,如我们要insert一条记录,则undo log会记录一条对应的delete日志。
  • 为了达到事务回滚。如果在事务未提交前机器故障,则根据undo log可以回滚数据
  • MVCC就是基于undo log来实现的。

3. binlog(二进制日志)

  • 不同于InnoDB引擎的redo/undo log。其主要是用来记录对MySQL数据更新或潜在发生更新的SQL语句。并以“事务”的形式保存在磁盘中
  • 主要作用
    • 主从复制:MySQL主从复制在Master端开启binlog,Master把它的二进制日志传递给slaves并执行达到master-slaver数据一致性的目的
    • 数据恢复
    • 增量备份
  • 不会记录不修改数据的语句,如select与show语句
  • 可以配置自动删除时间:expire_logs_days
  • 数据提交前才开始进行binlog写盘

4. errorlog(错误日志)

  • 记录出现错误的日志

5. slow query log(慢查询日志)

  • 记录查询比较慢的sql语句
  • 几个常用的配置参数
    • slow_query_log 慢查询开启状态
    • slow_query_log_file  存储位置
    • long_query_time  查询超过多少秒才记录
    • log_queries_not_using_indexes  未使用查询语句也被记录到慢查询日志中

6. general log(一般查询日志)

  • 就是一般查询的日志

7. relay log(中继日志  )

  • 主从复制的时候使用

Innodb完成一次更新操作的具体步骤

  1. 开启事务
  2. 查询待更新的记录到内存,并加X锁
  3. 记录undo log到内存buffer
  4. 记录redo log到内存buffer
  5. 更改内存中的数据记录
  6. 提交事务,出发redo log刷盘
  7. 记录 bin log
  8. 事务结束

上一篇:mysql日志redo log、undo log、binlog以及作用


下一篇:mysql(下)