mysql-log

2021-06-27  本文已影响0人  甜甜起司猫_

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密切相关。


(扩展点1,阐述两阶段提交) 因为redo log生成到binlog写入之间有一个时间差,所以为了保证两者的一致性,MySQL引入了两阶段提交:

  1. Prepare阶段,写入redo log;
  2. Commit阶段,写入binlog,提交事务;

(扩展点2,阐述一下的刷盘时机)

binlog 刷盘可以通过sync_binlog参数来控制。

  1. 0-系统自由判断,
  2. 1-commit刷盘,
  3. N-每N个事务刷盘

redo log刷盘可以通过参数innodb_flush_log_at_trx_commit控制。

  1. 0-写入log buffer,每秒刷新到盘;
  2. 1-每次提交;
  3. 2-写入到OS cache,每秒刷盘;
上一篇下一篇

猜你喜欢

热点阅读