更新语句的流程

1: 查看基础架构
2: 连接, 由于更新所以查询缓存失效
3: 分析, 优化, 执行
image.png

redo log (重做日志)

问题: 每次更新的时候,需要先找到对应的记录, 然后更新, i/o成本很大, 查找成本也很大
解决: 采取wal技术, 先写日志,再写磁盘. 比如innobe引擎会先写日志,然后更新内存就可以返回, 同时引擎会在闲暇的时间再更新到磁盘
特点: 采用循环写的方式, 类似于ring buffer机制, 所以如果buffer满了, 需要等待更新到磁盘, 腾出位置才能继续写
用途: 数据库如果异常重启, 不至于数据丢失

binlog (归档日志)

用途: 恢复数据到某一个时刻
概述: 逻辑日志, 记录的是原始语句的逻辑, 属于追加写, 不存在覆盖问题

两个日志区别和联系

binlog 逻辑日志 server层 追加写, 不会覆盖
redo log 物理日志 引擎层 循环写, 会覆盖

两阶段提交

解决: 保证两个日志的逻辑一致

如何让数据库恢复到误删之前的状态

1: 找到最近的一次全量备份的数据, 记为时间a
2: 记误删时间为b, 将[a,b]时间段的binlog取出来执行即可