更新语句的流程
1: 查看基础架构
2: 连接, 由于更新所以查询缓存失效
3: 分析, 优化, 执行
redo log (重做日志)
问题: 每次更新的时候,需要先找到对应的记录, 然后更新, i/o成本很大, 查找成本也很大
解决: 采取wal技术, 先写日志,再写磁盘. 比如innobe引擎会先写日志,然后更新内存就可以返回, 同时引擎会在闲暇的时间再更新到磁盘
特点: 采用循环写的方式, 类似于ring buffer机制, 所以如果buffer满了, 需要等待更新到磁盘, 腾出位置才能继续写
用途: 数据库如果异常重启, 不至于数据丢失
binlog (归档日志)
用途: 恢复数据到某一个时刻
概述: 逻辑日志, 记录的是原始语句的逻辑, 属于追加写, 不存在覆盖问题
两个日志区别和联系
binlog | 逻辑日志 | server层 | 追加写, 不会覆盖 |
---|---|---|---|
redo log | 物理日志 | 引擎层 | 循环写, 会覆盖 |
两阶段提交
如何让数据库恢复到误删之前的状态
1: 找到最近的一次全量备份的数据, 记为时间a
2: 记误删时间为b, 将[a,b]时间段的binlog取出来执行即可