mysql 事务与IO的关系

在这里插入图片描述

  1. innodb_flush_log_at_trx_commit=0 ,innodb 中的 log thread 每隔一秒钟将 log buffer 中的数据写入文件,同时还会通知文件系统进行与文件同步的 flush 操作,保证数据确实已经写入磁盘。但是,每次事务的结束( commit 或者 rollback )并不会触发 log thread 将 log buffer 中的数据写入文件。所以当设置为 0 时,在 mysql crash 或者 os crash 或者主机断电的情况,最极端的情况是丢失一秒的数据变更。
  2. innodb_flush_log_at_trx_commit=1,这也是 innodb 默认设置,每次事务的结束都会触发 log thread 将 log buffer 中的数据写入文件,并通知文件系统同步文件。这个设置是最安全的,能够保证不论是 mysql crash ,os crash 还是主机断电都不会丢失任何已经提交的事务。
  3. innodb_flush_log_at_trx_commit=2,log thread 会在每次事务结束后将数据写入事务日志,但是仅仅是调用了文件系统的写入操作,而文件系统都是有缓存的,所以 log thread 的写入并不能保证将文件系统中缓存写入到物理磁盘进行永久固化。文件系统什么时候将缓存中的数据同步到物理磁盘,log thread 并不知道。所以当设置为 2 的时候,mysql crash 并不会造成数据的丢失,但是os crash 或者主机断电可能造成事务日志的丢失,各种文件系统对文件缓存的刷新机制各不相同。

总结

从以上的分析得出,当 innodb_flush_log_at_trx_commit 设置为 1 时是最安全的,但由于所做的 IO 同步操作最多,性能也是三种当中最差的;如果设置为 0 时,则每秒同步一次,性能相对高些,如果设置为 2 ,性能可能是这三种中最好的,但也有可能会出现故障后丢失的数据最多的。至于具体应该如何设置,一般来说,如果不能完全接受数据的丢失,那可以通过牺牲一定的性能来换取数据的安全性,选择设置为 1 ;如果允许丢失少量的数据( 比如说1秒内 ),那么可以设置为 0 ;当然如果操作系统够稳定,主机的硬件设备足够好的话,而且主机的供电系统也足够安全的话,那么可以设置为 2 ,保证系统的高性能。



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值