`

mysql中的innodb_flush_log_at_trx_commit 和 sync_binlog

 
阅读更多
  mysql中的innodb_flush_log_at_trx_commit 和 sync_binlog是两个重要的参数,

分别解析如下:
  innodb_flush_log_at_trx_commit = N:

N=0  – 每隔一秒,把事务日志缓存区的数据写到日志文件中,以及把日志文件的数据刷新到磁盘上;

   log buffer 会 每秒写入到日志文件并刷写(flush)到磁盘。但每次事务提交不会有任何影响,也就是 log buffer 的刷写操作和事务提交操作没有关系。在这种情况下,MySQL性能最好,但如果 mysqld 进程崩溃,通常会导致最后 1s 的日志丢失
   


N=1  – 每个事务提交时候,把事务日志从缓存区写到日志文件中,并且刷新日志文件的数据到磁盘上;
    当取值为 1 时,每次事务提交时,log buffer 会被写入到日志文件并刷写到磁盘。这也是默认值。这是最安全的配置,但由于每次事务都需要进行磁盘I/O,所以也最慢。
  



N=2  – 每事务提交的时候,把事务日志数据从缓存区写到日志文件中;每隔一秒,刷新一次日志文件,但不一定刷新到磁盘上,而是取决于操作系统的调度;

    当取值为 2 时,每次事务提交会写入日志文件,但并不会立即刷写到磁盘,日志文件会每秒刷写一次到磁盘。这时如果 mysqld 进程崩溃,由于日志已经写入到系统缓存,所以并不会丢失数据;在操作系统崩溃的情况下,通常会导致最后 1s 的日志丢失。
上面说到的「最后 1s」并不是绝对的,有的时候会丢失 更多数据。有时候由于调度的问题,每秒刷写(once-per-second flushing)并不能保证 100% 执行。对于一些数据一致性和完整性要求不高的应用,配置为 2 就足够了;如果为了最高性能,可以设置为 0。有些应用,如支付服务,对一致性和完整性要求很高,所以即使最慢,也最好设置为 1.
      当我们设置为2 的时候,Log Thread 会在我们每次事务结束的时候将数据写入事务日志,但是这里的写入仅仅是调用了文件系统的文件写入操作。而我们的文件系统都是有缓存机制的,所以Log Thread 的这个写入并不能保证内容真的已经写入到物理磁盘上面完成持久化的动作。文件系统什么时候会将缓存中的这个数据同步到物理磁盘文件Log Thread 就完全不知道了。所以,当设置为2 的时候,MySQL Crash 并不会造成数据的丢失,但是OS Crash 或者是主机断电后可能丢失的数据量就完全控制在文件系统上了。各种文件系统对于自己缓存的刷新机制各不一样,大家可以自行参阅相关的手册。
    
  
二 
sync_binlog =  N:

N>0  — 每向二进制日志文件写入N条SQL或N个事务后,则把二进制日志文件的数据刷新到磁盘上;

N=0  — 不主动刷新二进制日志文件的数据到磁盘上,而是由操作系统决定;

推荐配置组合:

N=1,1  — 适合数据安全性要求非常高,而且磁盘IO写能力足够支持业务,比如充值消费系统;

N=1,0  — 适合数据安全性要求高,磁盘IO写能力支持业务不富余,允许备库落后或无复制;

N=2,0或2,m(0<m<100)  — 适合数据安全性有要求,允许丢失一点事务日志,复制架构的延迟也能接受;

N=0,0  — 磁盘IO写能力有限,无复制或允许复制延迟稍微长点能接受,例如:日志性登记业务;


  在http://blog.itpub.net/22664653/viewspace-1063134/中谈到了一个评测:


  当两个参数设置为双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,防止系统断电异常。

0
0
分享到:
评论

相关推荐

    :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的组合使用...

    MySQL5.6基本优化配置

    - `innodb_flush_log_at_trx_commit` 设置为2,这意味着每次提交事务时,重做日志缓冲区会被写入日志文件,但不立即同步到磁盘,提供了一定的性能和数据安全平衡。 - `innodb_file_per_table` 开启,每个表的索引...

    MYSQL数据库技术分享.ppt

    5. 磁盘IO优化:通过调整磁盘IO参数,例如sync_binlog、innodb_flush_log_at_trx_commit等,来提高MYSQL数据库的性能。 MYSQL数据库慢SQL定位与分析 MYSQL数据库慢SQL定位与分析是MYSQL数据库性能优化的重要步骤。...

    MySQL参数说明

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

    mysql8.0.11多实例安装

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

    MYSQL数据库技术分享.pptx

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

    纵观MySQL数据安全体系.docx

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

    MySQL和IO 上1

    2. innodb_flush_log_at_trx_commit:控制redo log的刷盘策略,不同的设置平衡了性能与数据安全性。 3. sync_binlog:控制binlog的刷盘策略,它和上面的参数一样,调整这个值会影响系统的事务安全性和性能。 4. ...

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

    mysql 5.5 配置文档

    22. `innodb_flush_log_at_trx_commit`: 控制事务日志刷新策略,以平衡性能和数据一致性。 23. `innodb_log_buffer_size`, `innodb_log_file_size`, `innodb_log_files_in_group`: InnoDB 事务日志相关参数,用于...

    如何构建高性能MySQL系统.docx

    对于redo日志和binlog的刷盘策略,如innodb_flush_log_at_trx_commit和sync_binlog,应根据应用的事务安全性和性能需求进行调整。内存分配方面,可以选用jemalloc或tcmalloc等高效内存管理库。 Schema优化主要包括...

    MySQL核心参数含义的源码解析.pdf

    - `innodb_flush_log_at_trx_commit`:控制事务日志的刷新策略,确保数据的一致性。 - `sync_binlog`:控制二进制日志的同步频率,影响故障恢复的可靠性。 6. **查询缓存**: - `query_cache_size`:查询缓存的...

    MySQL PXC_百度大神cnf配置

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

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

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

    Speedemy-MySQL-Configuration-Tuning-Handbook.pdf

    - innodb_flush_log_at_trx_commit:控制事务日志刷新时机,影响事务的持久性和性能。 - sync_binlog:这个变量控制二进制日志的刷新频率,影响数据同步和恢复的可靠性。 - innodb_flush_method:这个设置可以...

    MYSQL数据库技术分享PPT教案学习.pptx

    - `innodb_flush_log_at_trx_commit`决定事务提交后如何同步InnoDB的日志,以确保数据一致性。 这些参数的优化对于MySQL数据库的性能、稳定性和安全性至关重要。正确调整这些参数可以帮助数据库更好地应对高并发、...

    mysql数据库配置模板

    4. **innodb_flush_log_at_trx_commit**: 调整此参数可平衡事务日志的持久性和性能,一般推荐设置为1或2。 5. **log_bin**: 开启二进制日志记录有助于实现数据恢复和主从复制。 6. **expire_logs_days**: 根据实际...

Global site tag (gtag.js) - Google Analytics