MySQL学习笔记(3)——日志

redo log

  • redo log是InnoDB存储引擎层面的实现,并非所有存储引擎都具备。
  • redo log用于记录事务对数据页的修改。
  • redo log采用WAL(Write-Ahead Log)技术,先将记录写入内存中的Redo Log Buffer,再在一定时机将缓存写入磁盘。
  • innodb_flush_log_at_trx_commit参数用于设置redo log刷盘时机:
    • 0:InnoDB线程每秒1次将Redo Log Buffer中的日志刷入磁盘。
    • 1:事务每次提交时就会把Redo Log Buffer中的日志写入磁盘。
    • 2:事务提交时仅写入OS Buffer,由InnoDB线程每秒1次将OS Buffer中的日志刷入磁盘。
  • redo log采用大小固定、循环写入的方式,当写到文件结尾时,回到文件头部循环写入日志。因此redo log无法记录完整的数据,必须配合binlog才能保证数据不丢失。
  • redo log用于数据服务奔溃后的恢复。

undo log

  • undo log记录数据的逻辑变化,例如当执行了一条INSERT语句,undo log会记录一条对应的DELETE语句,这样便于数据回滚到事务执行前的状态。
  • undo log还用于MVCC。
  • undo log保证事务的原子性。

binlog

  • binlog是MySQL服务层的实现,因此所有存储引擎都能使用。
  • binlog日志是二进制格式的,具有以下三种工作模式:
    • Row Level:日志会记录每一行数据被修改的情况,支持一些特殊功能(存储过程、触发器、函数),但会造成日志内容庞大。
    • Statement Level:日志会记录对数据进行修改的SQL语句,减少了日志量,但不支持一些语句。是默认的工作模式。
    • Mixed:混合以上两种模式,根据执行的具体语句判断使用哪种工作模式。
  • binlog是以追加写入的方式执行的,当一个bin log文件到达设置的最大值(max_binlog_size)时,会另生成新的文件来保存新的日志。
  • binlog会在每次事务提交时写入内存,并在一定时机写入磁盘,通过sync_binlog参数设置刷盘时机,默认为1即每次提交事务的时候都进行刷盘,如果将此参数调大可以牺牲一定的一致性来提升性能。
  • binlog主要用于MySQL主从复制,监听binlog能用于数据同步、作为实时计算引擎的数据源。