mysql-log
redo log
数据库事务提交后,必须将更新后的数据刷到磁盘上,以保证ACID特性。磁盘随机写性能较低,如果每次都刷盘,会极大影响数据库的吞吐量。
优化方式是,将修改行为先写到redo日志里(此时变成了顺序写),再定期将数据刷到磁盘上,这样能极大提高性能。
假如某一时刻,数据库崩溃,还没来得及刷盘的数据,在数据库重启后,会重做redo日志里的内容,以保证已提交事务对数据产生的影响都刷到磁盘上。
一句话,redo日志用于保障,已提交事务的ACID特性。
undo log
数据库事务未提交时,会将事务修改数据的镜像(即修改前的旧版本)存放到undo日志里,当事务回滚时,或者数据库奔溃时,可以利用undo日志,即旧版本数据,撤销未提交事务对数据库产生的影响。
insert undo log和update undo log分别存放在不同的buffer里。
一句话,undo日志用于保障,未提交事务不会对数据库的ACID特性产生影响。
rollbacl segment 回滚段
存储undo日志的地方,是回滚段。
undo日志和回滚段和InnoDB的MVCC密切相关。
- redo log 是innodb引擎产生的,主要用于支持MySQL事务,MySQL会先写redo log,而后在写binlog。redo log可以保证即使数据库异常重启,数据也不会丢失
- undo log 是innodb引擎产生的,主要时候用于解决事务回滚和MVCC。数据修改的时候,不仅记录redo log,也会记录undo log。在事务执行失败的时候,会使用undo log进行回滚;
- binlog 主要用于复制和数据恢复,记录了写入性的操作。binlog分成基于语句,基于行和混合模式三种复制模式。
(扩展点1,阐述两阶段提交) 因为redo log生成到binlog写入之间有一个时间差,所以为了保证两者的一致性,MySQL引入了两阶段提交:
- Prepare阶段,写入redo log;
- Commit阶段,写入binlog,提交事务;
(扩展点2,阐述一下的刷盘时机)
binlog 刷盘可以通过sync_binlog
参数来控制。
- 0-系统自由判断,
- 1-commit刷盘,
- N-每N个事务刷盘
redo log刷盘可以通过参数innodb_flush_log_at_trx_commit
控制。
- 0-写入log buffer,每秒刷新到盘;
- 1-每次提交;
- 2-写入到OS cache,每秒刷盘;
网友评论