首先,三大日志分别是:redo log、bin log、undo log
重点也就是如下部分:每个日志的作用、刷盘时机
日志
redo log
作用
让 MySQL 拥有了崩溃恢复能力。比如 MySQL 实例挂了或宕机了,重启时,InnoDB 存储引擎会使用 redo log 恢复数据,保证数据的持久性与完整性。
刷盘时机
在查询时,InnoDB会将数据页读入 Buffer Pool 以便后续查找,减少磁盘IO。
同理,更新数据时,Buffer Pool 中存在要更新的数据就直接在其中更新,然后记录到 redo log buffer,随后刷盘到磁盘中的 redo log。
innodb_flush_log_at_trx_commit
有三种策略
- 0:事务提交不刷盘、性能最高。但是如果MySQL挂了或者发生宕机,会丢失1s的事务
- 1(默认):每次事务提交都刷盘、性能最低,不会丢失任何数据
- 2:每次事务提交只把log buffer里的redo log写入 page cache。宕机会有1s损失。
当然,没有提交事务的redo log也有可能刷屏。
因为后台线程每秒都将 buffer 中的数据写入 page cache再刷盘。
数据页刷盘是随机写,并且每次只更改了数据页中 n Byte的数据,性能很差。
但是redo log 一行记录几十字节,并且是顺序写,所以刷盘很快