如何理解MySQL中binlog和innodb

57次阅读
没有评论

共计 1991 个字符,预计需要花费 5 分钟才能阅读完成。

如何理解 MySQL 中 binlog 和 innodb_flush_log_at_trx_commit,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面丸趣 TV 小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。

 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 系统的性能达到最优化。

看完上述内容是否对您有帮助呢?如果还想对相关知识有进一步的了解或阅读更多相关文章,请关注丸趣 TV 行业资讯频道,感谢您对丸趣 TV 的支持。

正文完
 
丸趣
版权声明:本站原创文章,由 丸趣 2023-07-19发表,共计1991字。
转载说明:除特殊说明外本站除技术相关以外文章皆由网络搜集发布,转载请注明出处。
评论(没有评论)