本笔记记录的是学习过程中的重要概念要点,类似于提纲式笔记。如有侵权,请联系删除。
执行语句:mysql> create table T(ID int primary key, c int);
更新流程还涉及两个重要的日志模块: redo log(重做日志) 和 binlog(归档日志) 。
redo log
- InnoDB所特有的日志文件。
- 记录的是物理日志,也就是更改的数据信息。
- 循环写入的。拥有两个指针,一个是checkpoint,一个是write pos。分别记录擦除的位置和目前写入的位置。
- 保证crash-safe:即使数据库发生异常重启, 之前提交的记录都不会丢失。
- redo log用于保证crash-safe能力。 innodb_flush_log_at_trx_commit这个参数设置成1的时候,表示每次事务的redo log都直接持久化到磁盘。 建议设置成1, 这样可以保证MySQL异常重启之后数据不丢失。
binlog
- Server 层所拥有的日志模块。
- 所有的引擎所共用
- 记录的是逻辑记录,即每一个命令的这个语句的原始逻辑含义。
- 追加写录的,不会覆盖之前的记录信息。
- sync_binlog这个参数设置成1的时候, 表示每次事务的binlog都持久化到磁盘。 建议设置成1, 这样可以保证MySQL异常重启之后binlog不丢失。
内部流程
图中浅色框表示是在InnoDB内部执行的, 深色框表示是在执行器中执行的:
两阶段提交:为了保证两份日志之间的逻辑。
思考
在什么场景下, 一天一备会比一周一备更有优势呢? 或者说, 它影响了这个数据库系统的哪个指标?
答:在一天一备的模式里,最坏情况下需要应用一天的 binlog。一周一备最坏情况就要应用一周的 binlog 了。
系统的对应指标就是RTO(恢复目标时间)。成本是更频繁全量备份需要消耗更多存储空间,需要你根据业务重要新来评估了。