SQL执行流程
SQL更新流程
查询语句的流程,更新时也是一样走一遍,但区别是引入了redo log和binlog日志模块
redo log
孔乙己中,有人要赊账或还账时,掌柜一般有两种做法:
- 记在账本上
- 写在粉板上,之后将粉板的内容记录在账本上 往往生意火爆时,掌柜的会选择后者
同样,在Mysql里也有同样的问题,而充当粉板角色的就是redo log日志。
它用到了WAL技术(预写式日志),关键点就是先写日志(顺序写)在写磁盘。
InnoDB的redo log是固定大小的,比如可以配置为一组4个文件,每个文件的大小是1GB,那么这块“粉板”总共就可以记录4GB的操作。从头开始写,写到末尾就又回到开头循环写。
binlog
和redo log区别
- redo log是innoDB引擎特有,而binlog是Mysql的Server层实现,所有引擎都可以使用。
- redo log是物理日志,记录的是“在某个数据页上做了什么修改”。binlog是逻辑日志,记录的是这个语句的原始逻辑。
- redo log是循环写,空间固定会用完;binlog是可以追加写入,不会覆盖从前文件。
mysql如何恢复勿删数据,应该怎么做
- 首先,找到最近一次的全量备份(要做定期备份,比如一天一备),从这个备份恢复到临时库。
- 然后从备份时间开始,将备份的binlog依次取出,重放到中午勿删表之前的那个时刻
Mysql两阶段提交
- 如果redo log里面事务完整,也就是存在commit标志,直接提交。
- 如过redo log里面事务只有完整的prepare,则判断对应事务在binlog中是否存在并完整。完整提交,不完整回滚。