highlight: arduino-light
redo log 刷盘步骤
log_buff(内存) ---> os cache --->OS刷新 (flush)---> disk
redo log 刷盘策略
InnoDB提供了几种刷盘策略,此时这个策略是通过这个参数innodbflushlogattrx_commit来配置的.
innodbflushlogattrx_commit=0
表示每隔一秒把redo log buffer刷到磁盘文件系统中(os cache)去,并且调用文件系统的“flush”操作将缓存刷新到磁盘上去。 也就是说一秒之前的日志都保存在内存缓冲区,此时如果mysql机器宕掉,最极端的情况是可能丢失1秒的数据变更。
innodbflushlogattrx_commit=1
表示在每次事务提交的时候,都会把redo log buffer刷到磁盘文件系统中(os cache)去,并立刻调用文件系统的“flush”操作将缓存刷新到磁盘上去。
这个设置是最安全的设置,能够保证不论是MySQL Crash 还是OS Crash或者是主机断电都不会丢失任何已经提交的数据。
但是这样的话,数据库对磁盘IO的要求就非常高了,如果底层的硬件比较差,那么MySQL数据库的并发很快就会由于硬件IO的问题而无法提升,会大大降低mysql的性能。
innodbflushlogattrx_commit=2
表示在每次事务提交的时候会把redo log buffer刷到磁盘文件系统中(os cache)去,但并不会立即刷写到磁盘,每隔1s 将os cache中的数据刷新到磁盘。
如果只是MySQL数据库挂掉了(MySQL Crash),由于文件系统没有问题,那么对应的事务数据并没有丢失。只有在数据库所在的主机操作系统损坏或者突然掉电的情况下,数据库的事务数据可能丢失1秒之类的事务数据。
这样的好处,减少了事务数据丢失的概率,而对底层硬件的IO要求也没有那么高了。(log buffer写到文件系统中,一般只是从log buffer的内存转移的文件系统的内存缓存(os cache)中,对底层IO没有压力)。
redo log刷盘策略总结
0:延迟写。效率最高,最不安全:log_buff —> 每隔1秒 —> os cache —>实时---—> disk
1:实时写,实时刷。效率最低,最安全:log_buff —> 实时 —> os cache —>实时---—> disk
2:实时写,延迟刷。效率折中,安全折中:log_buff —> 实时 —> os cache —>每隔1秒—> disk