redo log 的写入机制
redo log buffer:
事务在执行过程中,生成的 redo log 是要先写到 redo log buffer 的。redo log buffer 里面的内容,是不是每次生成后都要直接持久化到磁盘呢?
答案是,不需要。
如果事务执行期间 MySQL 发生异常重启,那这部分日志就丢了。由于事务并没有提交,所以这时日志丢了也不会有损失。
那么,另外一个问题是,事务还没提交的时候,redo log buffer 中的部分日志有没有可能被持久化到磁盘呢?答案是,确实会有。
redo log 三种状态

1.存在 redo log buffer 中,物理上是在 MySQL 进程内存中,就是图中的红色部分;
2.写到磁盘 (write),但是没有持久化(fsync),物理上是在文件系统的 page cache 里面,也就是图中的黄色部分
3.持久化到磁盘,对应的是 hard disk,也就是图中的绿色部分。
日志写到 redo log buffer 是很快的,wirte 到 page cache 也差不多,但是持久化到磁盘的速度就慢多了。
innodb_flush_log_at_trx_commit
1.设置为 0 的时候,表示每次事务提交时都只是把 redo log 留在 redo log buffer 中 ;mysql 崩溃会丢失数据。
2.设置为 1 的时候,表示每次事务提交时都将 redo log 直接持久化到磁盘。
3.设置为 2 的时候,表示每次事务提交时都只是把 redo log 写到 page cache,OS宕机会丢失数据。
InnoDB

MySQL的redo log在事务执行时先写入redo log buffer,不立即持久化。根据innodb_flush_log_at_trx_commit的设置,提交时可能仅写入page cache或直接持久化到磁盘。后台线程每秒会将buffer中的日志写入并持久化。未提交事务的redo log也可能因空间占用或并发提交而被写入磁盘。
745

被折叠的 条评论
为什么被折叠?



