mysql 事务日志缓冲_通过事务日志落盘时间理解innodb_flush_log_at_trx_commit

事务日志刷写参数 innodb_flush_log_at_trx_commit=0|1|2三个值

其原理如下图

bea0664867b7

image

1 此为默认值,日志缓冲区将写入日志文件,并在每次事务后执行刷新到磁盘。 这是完全遵守ACID特性

0 提交时没有写磁盘的操作; 而是每秒执行一次将日志缓冲区的提交的事务写入刷新到磁盘。 这样可提供更好的性能,但服务器崩溃可能丢失最后一秒的事务

2 每次提交后都会写入OS的缓冲区,但每秒才会进行一次刷新到磁盘文件中。 性能比0略差一些,但操作系统或停电可能导致最后一秒的交易丢失

高并发业务行业最佳实践,是使用第三种折衷配置(=2):

1.配置为2和配置为0,性能差异并不大,因为将数据从Log Buffer拷贝到OS cache,虽然跨越用户态与内核态,但毕竟只是内存的数据拷贝,速度很快

2.配置为2和配置为0,安全性差异巨大,操作系统崩溃的概率相比MySQL应用程序崩溃的概率,小很多,设置为2,只要操作系统不奔溃,也绝对不会丢数据

那么我们了解了参数innodb_flush_log_at_trx_commit=0|1|2

无非是1是最安全的,每条事务commit后都需要立即从事务日志缓冲区log buffer 执行落盘

0是每条事务commit后会继续放到事务日志缓冲区log buffer中,但是每隔一秒就会落盘log buffer中已提交的事务。假如log buffer中存了上千上万个已提交事务,这一秒也要落盘完。

2和0一样,每条事务commit后不会立即落盘,而是放到os buffer缓冲区中,它和0的区别就是:

0将已提交的事务放在log buffer即mysql的在内存的日志缓冲区,而2是将已提交的事务放到os buffer 系统的内存缓冲区,从用户态转向内核态仅此而已。

准备阶段

库下创建数据表testlog 查看初始大小

use helldb;

CREATE TABLE `testlog` (

`id` int NOT NULL AUTO_INCREMENT,

`name` char(10) DEFAULT NULL,

`age` int DEFAULT '20',

PRIMARY KEY (`id`)

) ENGINE

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值