MySQL学习笔记二

131 阅读2分钟
  • MySQL中的WAL, Write-Ahead-Logging, 即先写日志,后写磁盘
  • MySQL执行更新语句时,InnoDb引擎会先将操作(更新)记录写到redo log中,并更新内存,此时就算更新完成了
  • InnoDb引擎会在空闲或适当的时候将操作记录写到磁盘上
  • InnoDb的redo log是固定大小的,从头开始写,写到末尾之后又回头开头循环写。

  • 上图中画出了序号从0-3,共4个redo log
  • write pos为当前写入位置, check point为检查点, write pos和check point都一直向前推进;write pos和check point之间的绿色部分就可以用来写入redo log。
  • 如果redo log过多, 此时check point还没有推进, write pos就追上了check point, 那么就必须等待check point向前推进, 此时MySQL无法处理更新操作。
  • redo log提供了crash-safe的能力,即使MySQL异常重启,之前提交的记录也不会丢失。

  • redo log是InnoDb引擎特有的日志

  • binlog是MySQL Server层的日志(在笔记一中提到了,MySQL由两部分组成,引擎层和Server层)

  • 这两个日志的对比

    • redo log 是 InnoDB 引擎特有的;binlog 是 MySQL 的 Server 层实现的,所有引擎都可以使用。
    • redo log 是物理日志,记录的是“在某个数据页上做了什么修改”;binlog 是逻辑日志,记录的是这个语句的原始逻辑,比如“给 ID=2 这一行的 c 字段加 1 ”。
    • redo log 是循环写的,空间固定会用完;binlog 是可以追加写入的。“追加写”是指 binlog 文件写到一定大小后会切换到下一个,并不会覆盖以前的日志。

上图是MySQL InnoDb引擎执行Update语句时的流程图

  • redo log的写入分成了 preparecommit 两个阶段, 称为两阶段提交

  • 利用binlog进行数据恢复的步骤

    • 找到最近一次的全量备份,把这个全量备份恢复到临时库
    • 找到从全量备份的时间点开始,到要恢复的时间点之间的binlog,在临时库上重放即可。
  • innodb_flush_log_at_trx_commit 这个参数设置成 1 的时候,表示每次事务的 redo log 都直接持久化到磁盘, 建议设置成1

  • sync_binlog 这个参数设置成 1 的时候,表示每次事务的 binlog 都持久化到磁盘, 建议设置成1