每日一面 - MySQL 的双一设置是什么?
2021-01-13 本文已影响0人
干货满满张哈希
问题参考自: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
- 如果
innodb_flush_log_at_trx_commit
设置为 0:log buffer
将每秒一次地写入log file
中,并且log file
的flush
(刷到磁盘)操作同时进行.该模式下,在事务提交的时候,不会主动触发写入磁盘的操作; - 如果
innodb_flush_log_at_trx_commit
设置为 1:每次事务提交时MySQL
都会把log buffer
的数据写入log file
,并且flush
(刷到磁盘)中去; - 如果
innodb_flush_log_at_trx_commit
设置为 2:每次事务提交时MySQL
都会把log buffer的数据写入log file
,但是flush
(刷到磁盘)操作并不会同时进行。该模式下,MySQL会每秒执行一次flush
(刷到磁盘)操作。
sync_binlog
:binlog 的刷盘策略,默认为0
- 如果为 0,像操作系统刷其他文件的机制一样,MySQL不会同步到磁盘中去而是依赖操作系统来刷新
binary log
。 -
sync_binlog = N (N>0)
,MySQL 在每写 N 次 二进制日志binary log
时,会使用fdatasync()
函数将它的写二进制日志binary log
同步到磁盘中去。