Mysql架构

27 阅读2分钟

SQL执行流程

image.png

SQL更新流程

查询语句的流程,更新时也是一样走一遍,但区别是引入了redo log和binlog日志模块

redo log

孔乙己中,有人要赊账或还账时,掌柜一般有两种做法:

  • 记在账本上
  • 写在粉板上,之后将粉板的内容记录在账本上 往往生意火爆时,掌柜的会选择后者

同样,在Mysql里也有同样的问题,而充当粉板角色的就是redo log日志。

它用到了WAL技术(预写式日志),关键点就是先写日志(顺序写)在写磁盘。

InnoDB的redo log是固定大小的,比如可以配置为一组4个文件,每个文件的大小是1GB,那么这块“粉板”总共就可以记录4GB的操作。从头开始写,写到末尾就又回到开头循环写。

image.png

binlog

和redo log区别

  1. redo log是innoDB引擎特有,而binlog是Mysql的Server层实现,所有引擎都可以使用。
  2. redo log是物理日志,记录的是“在某个数据页上做了什么修改”。binlog是逻辑日志,记录的是这个语句的原始逻辑。
  3. redo log是循环写,空间固定会用完;binlog是可以追加写入,不会覆盖从前文件。

mysql如何恢复勿删数据,应该怎么做

  • 首先,找到最近一次的全量备份(要做定期备份,比如一天一备),从这个备份恢复到临时库。
  • 然后从备份时间开始,将备份的binlog依次取出,重放到中午勿删表之前的那个时刻

Mysql两阶段提交

  1. 如果redo log里面事务完整,也就是存在commit标志,直接提交。
  2. 如过redo log里面事务只有完整的prepare,则判断对应事务在binlog中是否存在并完整。完整提交,不完整回滚。