`

【转载】【MySQL】sync_binlog innodb_flush_log_at_trx_commit 浅析

 
阅读更多

本文转载自:http://blog.itpub.net/22664653/viewspace-1063134/

 

innodb_flush_log_at_trx_commit和sync_binlog 两个参数是控制MySQL 磁盘写入策略以及数据安全性的关键参数。本文从参数含义,性能,安全角度阐述两个参数为不同的值时对db 性能,数据的影响.
 
一 参数意义
innodb_flush_log_at_trx_commit

如果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(刷到磁盘)操作。

 
注意:
  由于进程调度策略问题,这个“每秒执行一次 flush(刷到磁盘)操作”并不是保证100%的“每秒”。
  
sync_binlog
sync_binlog 的默认值是0,像操作系统刷其他文件的机制一样,MySQL不会同步到磁盘中去而是依赖操作系统来刷新binary log。
当sync_binlog =N (N>0) ,MySQL 在每写 N次 二进制日志binary log时,会使用fdatasync()函数将它的写二进制日志binary log同步到磁盘中去。
注:
   如果启用了autocommit,那么每一个语句statement就会有一次写操作;否则每个事务对应一个写操作。
   根据上述描述,我做了一张图,可以方便大家查看。
  
二 性能
    两个参数在不同值时对db的纯写入的影响表现如下
    
 测试场景1 
  innodb_flush_log_at_trx_commit=2 
  sync_binlog=1000
 测试场景2 
  innodb_flush_log_at_trx_commit=1 
  sync_binlog=1000
 测试场景3 
  innodb_flush_log_at_trx_commit=1 
  sync_binlog=1
 测试场景4
  innodb_flush_log_at_trx_commit=1
  sync_binlog=1000
 测试场景5 
  innodb_flush_log_at_trx_commit=2 
  sync_binlog=1000 
 
场景 TPS
场景1 41000
场景2 33000
场景3 26000
场景4 33000
由此可见,当两个参数设置为双1的时候,写入性能最差,sync_binlog=N (N>1 ) innodb_flush_log_at_trx_commit=2 时,(在当前模式下)MySQL的写操作才能达到最高性能。

三 安全
当innodb_flush_log_at_trx_commit和sync_binlog  都为 1 时是最安全的,在mysqld 服务崩溃或者服务器主机crash的情况下,binary log 只有可能丢失最多一个语句或者一个事务。但是鱼与熊掌不可兼得,双11 会导致频繁的io操作,因此该模式也是最慢的一种方式。
当innodb_flush_log_at_trx_commit设置为0,mysqld进程的崩溃会导致上一秒钟所有事务数据的丢失。
当innodb_flush_log_at_trx_commit设置为2,只有在操作系统崩溃或者系统掉电的情况下,上一秒钟所有事务数据才可能丢失。
 
双1适合数据安全性要求非常高,而且磁盘IO写能力足够支持业务,比如订单,交易,充值,支付消费系统。双1模式下,当磁盘IO无法满足业务需求时 比如11.11 活动的压力。推荐的做法是 innodb_flush_log_at_trx_commit=2 ,sync_binlog=N (N为500 或1000) 且使用带蓄电池后备电源的缓存cache,防止系统断电异常。
 
 
四 小结
    系统性能和数据安全是业务系统高可用稳定的必要因素。我们对系统的优化需要寻找一个平衡点,合适的才是最好的,根据不同的业务场景需求,可以将两个参数做组合调整,以便是db系统的性能达到最优化。
 
参考文章

 

分享到:
评论

相关推荐

    :innodb_flush_log_at_trx_commit 和 sync_binlog1

    MySQL 数据库中的 `innodb_flush_log_at_trx_commit` 和 `sync_binlog` 是两个非常重要的配置参数,它们直接影响到数据库的性能与数据安全性。理解并合理设置这两个参数对于优化数据库系统至关重要。 首先,`innodb...

    23.MySQL是怎么保证数据不丢的?1

    在实际应用中,通常会将`sync_binlog`设置为一个较大的值,比如100到1000之间,而`innodb_flush_log_at_trx_commit`通常设置为1,以确保在异常情况下的数据完整性。 总的来说,MySQL通过binlog和redo log的组合使用...

    MYSQL数据库技术分享.ppt

    磁盘I/O优化参数包括`sync_binlog`和`innodb_flush_log_at_trx_commit`,前者控制事务提交后的binlog同步频率,而后者决定日志何时被刷新到磁盘。这两个参数的设置平衡了性能与数据安全性,`sync_binlog=1`提供最高...

    mysql8.0.11多实例安装

    - **innodb_flush_log_at_trx_commit=2**:控制InnoDB日志刷新频率。 - **binlog_format=row**:二进制日志格式设置为行级别。 - **log_bin=/data/mysqldata/3307/binlog/mysql-bin**:指定二进制日志文件的位置。 -...

    MySQL PXC_百度大神cnf配置

    - `innodb_flush_log_at_trx_commit`: 控制事务日志刷新策略,可能设置为1(强一致性),0(性能优先)或2(平衡模式)。 - `query_cache_size`: 查询缓存大小,可能需要根据查询特性调整,也可能禁用(设为0)。 ...

    MySQL主主双向同步测试报告.pdf

    因此,`sync_binlog`和`innodb_flush_log_at_trx_commit`设置对于保证数据的安全至关重要。`auto_increment_increment`和`auto_increment_offset`的值应根据主服务器的数量来设定,以避免自增列的冲突。 忽略同步...

    新美大MySQL数据一致性探索.pdf

    接下来,文档中提到了一些具体的数据库参数和配置项,例如“innodb_flush_log_at_trx_commit”、“bufferpool”、“logbuffer”、“oscache”、“sync_binlog=1”等。这些参数的设置对MySQL数据库的事务日志记录和...

    纵观MySQL数据安全体系.docx

    在MySQL配置中,针对单机环境,设置`innodb_flush_log_at_timeout`和`innodb_flush_log_at_trx_commit`参数有助于保证数据的持久化。前者控制redo log刷新到磁盘的频率,后者控制事务提交时是否将数据刷新到磁盘。...

    MYSQL数据库技术分享.pptx

    MYSQL数据库技术分享 ...* innodb_flush_log_at_trx_commit:以什么方式刷新日志到磁盘。 这些参数的设置可以影响MYSQL数据库的性能和安全性。通过合理的参数设置,可以提高数据库的性能和可靠性。

    MySQL如何快速导入数据

    总结,通过减少导入文件大小(使用扩展插入)、优化导入参数(调整`innodb_flush_log_at_trx_commit`和`sync_binlog`)以及使用MySQL命令行工具,可以显著提升MySQL的数据导入速度。在实际操作中,应根据具体业务...

    MySQL事物实现原理之组提交(group commit).pdf

    例如,sync_binlog参数和innodb_flush_log_at_trx_commit参数需要设置为1,以确保在事务提交时binlog和Redo Log都能得到同步。这样的配置可以进一步保证数据的一致性和可靠性,即使在数据库突然崩溃的情况下也能恢复...

    Mysql安装入门

    innodb_flush_log_at_trx_commit=2 sync_binlog=1000 transaction-isolation=READ-COMMITTED innodb_flush_method=O_DIRECT innodb_io_capacity_max=4000 innodb_log_buffer_size=8M innodb_log_file_size=...

    centos下mysql主从同步快速设置步骤分享

    Master:/etc/my.cnf [mysqld] server-id = 1 log-bin innodb_flush_log_at_trx_commit=1 sync_binlog=1 datadir=/var/lib/mysql character-set-server=utf8 init_connect=’SET NAMES utf8’设定了默认字符集为utf8...

    InnoDB事务、锁、多版本分析

    在MySQL中,可以通过设置sync_binlog和innodb_flush_log_at_trx_commit参数来确保InnoDB的redo log与binlog的一致性。另外,Group Commit技术可以提高性能,通过批量提交多个事务,减少磁盘I/O。 接下来是InnoDB的...

    PXC、MGR、MGC集群之新建、备份、恢复操作步骤

    例如,`server_id`用于唯一标识每个节点,`sync_binlog`控制事务日志的同步频率,`innodb_flush_log_at_trx_commit`决定事务日志何时写入磁盘,`binlog_checksum`设为`NONE`以提高性能,`innodb_support_xa`关闭X/...

    藏经阁-靠谱才是硬道理MySQL数据安全体系详解.pdf

    在单机安全方面,讨论了两个关键概念:Double Write 和 innodb_flush_log_at_trx_commit。 - **Double Write** 是一种用于防止数据页断裂的技术。当InnoDB存储引擎写入数据页时,首先会将其写入一个共享的内存缓冲...

    MySQL参数说明

    * innodb_flush_log_at_trx_commit:日志提交方式(关键参数) + 0 每秒写 1 次日志,将数据刷入磁盘,相当于每秒提交一次事务 + 1 每次提交事务写日志,同时将刷新相应磁盘,默认参数 + 2 每提交事务写一次日志...

    Mysql+drbd+heartbeat+amoeba集群配置详解

    - **Master/Slave架构**:通过设置不同的`server-id`来区分各节点,并配置日志同步参数`innodb_flush_log_at_trx_commit`和`sync_binlog`,确保数据的一致性。 - **数据同步**:利用binlog实现主从同步,降低延迟。 ...

Global site tag (gtag.js) - Google Analytics