天天看点

每日一面 - MySQL 的双一设置是什么?

问题参考自: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

之后:

  1. binlog 写内存
  2. redo log 写内存
  3. 根据这两个配置决定这两个日志是否刷盘(调用

    fsync

  4. 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

    同步到磁盘中去。