问题参考自:https://www.zhihu.com/question/425704691/answer/1524724367 ,答案为个人原创
其实就是
innodb_flush_log_at_trx_commit
和
sync_binlog
两个参数设置,都设置为 1 就是双 1 设置。MySQL 默认配置就是双 1 配置。
innodb_flush_log_at_trx_commit
是
innodb
引擎的配置,
sync_binlog
是 MySQL 引擎上层的配置,都是控制磁盘写入策略。
MySQL innoDB
引擎在事务
commit
之后:
- binlog 写内存
- redo log 写内存
- 根据这两个配置决定这两个日志是否刷盘(调用
)fsync
- commit完成
innodb_flush_log_at_trx_commit
:redo log 的刷盘策略,默认为 1
- 如果
设置为 0:innodb_flush_log_at_trx_commit
将每秒一次地写入log buffer
中,并且log file
的log file
(刷到磁盘)操作同时进行.该模式下,在事务提交的时候,不会主动触发写入磁盘的操作;flush
- 如果
设置为 1:每次事务提交时innodb_flush_log_at_trx_commit
都会把MySQL
的数据写入log buffer
,并且log file
(刷到磁盘)中去;flush
- 如果
设置为 2:每次事务提交时innodb_flush_log_at_trx_commit
都会把log buffer的数据写入MySQL
,但是log file
(刷到磁盘)操作并不会同时进行。该模式下,MySQL会每秒执行一次flush
(刷到磁盘)操作。flush
sync_binlog
:binlog 的刷盘策略,默认为0
- 如果为 0,像操作系统刷其他文件的机制一样,MySQL不会同步到磁盘中去而是依赖操作系统来刷新
。binary log
-
,MySQL 在每写 N 次 二进制日志sync_binlog = N (N>0)
时,会使用binary log
函数将它的写二进制日志fdatasync()
同步到磁盘中去。binary log