这两天遇到mysql宕机的问题,导致数据出现不一致的现象,结果发现有个特别重要的参数innodb_flush_log_at_trx_commit特别需要关注,默认情况下这个参数是1,即严格保证数据库的一致性,事务在提交之后立即将log buffer的数据写入到log file,同时调用文件系统的flush操作。

仔细分析一下mysql和文件系统的关系,基本上分为write和flush两个主要的操作,mysql管理自己的log buffer,文件系统管理log file,mysql事务提交后会调用write方法将数据从log buffer写入到log file,即持久化;学过操作系统的同学都知道文件系统为了提高IO的效率,本身会对每个文件做缓存,所以要想保证数据真正落地到磁盘上,有时会多一步flush操作,这个flush操作可能是文件系统自己flush,也可能是mysql通过系统调用强制让文件系统去flush。

但是出现故障的时候innodb_flush_log_at_trx_commit参数的设置为2,根据下面文档的解释,为2时mysql会在事务提交之后立即向文件系统写入log file,但并不会立即调用文件系统的flush操作,而是由定时任务调度每隔1秒flush一次,这就会引发数据丢失问题:当操作系统挂掉时,恰好文件系统自己也没有调用flush操作,那么那部分写入到文件缓存的数据就会丢失。如果mysql自己挂掉,由于log buffer中的数据已经写入文件系统,只要文件系统不挂掉,数据还是在的。The default value of 1 is required for full ACID compliance. With this value, the contents of the InnoDBlog buffer are written out to thelog file at each transaction commit and the log file is flushed to disk.

With a value of 0, the contents of the InnoDBlog buffer are written to the log file approximately once per second and the log file is flushed to disk. No writes from the log buffer to the log file are performed at transaction commit. Once-per-second flushing is not 100% guaranteed to happen every second, due to process scheduling issues. Because the flush to disk operation only occurs approximately once per second, you can lose up to a second of transactions with any mysqld process crash.

With a value of 2, the contents of the InnoDBlog buffer are written to the log file after each transaction commit and the log file is flushed to disk approximately once per second. Once-per-second flushing is not 100% guaranteed to happen every second, due to process scheduling issues. Because the flush to disk operation only occurs approximately once per second, you can lose up to a second of transactions in an operating system crash or a power outage.

翻开mysql的源代码,很好地解释了innodb_flush_log_at_trx_commit为0、1、2时mysql是如何处理数据落地的问题的。innodb_flush_log_at_trx_commit为0时,什么都不做,等着定时任务调度去每隔1秒write和flush,这种效率最高,但是丢失数据的风险最大,mysql进程挂掉数据就有可能丢到,更不用说操作系统挂掉;为1时事务提交后立即write和flush,能保证强一致,但IO效率很差;为2时事务提交后立即write,但是每秒flush一次,IO效率有所提升,但是仍有丢失数据的风险,大部分互联网应用都是这个值。

/**********************************************************************//**If required, flushes the log to disk based on the value ofinnodb_flush_log_at_trx_commit. */

static

void

trx_flush_log_if_needed_low(

/*========================*/

lsn_t lsn) /*!< in: lsn up to which logs are to beflushed. */

{

switch (srv_flush_log_at_trx_commit) {

case 0:

/* Do nothing */

break;

case 1:

/* Write the log and optionally flush it to disk */

log_write_up_to(lsn, LOG_WAIT_ONE_GROUP,

srv_unix_file_flush_method != SRV_UNIX_NOSYNC);

break;

case 2:

/* Write the log but do not flush it to disk */

log_write_up_to(lsn, LOG_WAIT_ONE_GROUP, FALSE);

break;

default:

ut_error;

}

}

建议对数据一致性要求比较高的,还是把innodb_flush_log_at_trx_commit设置为1,对一致性要求相对较弱的可以设置为2。

mysql丢失数据_MySQL数据丢失问题相关推荐

  1. mysql丢失数据,mysql数据丢失问题讨论(转)

    1.  概述 很多企业选择MySQL都会担心它的数据丢失问题,从而选择Oracle,但是其实并不十分清楚什么情况下,各种原因导致MySQL会丢失部分数据.本文不讨论Oracle和MySQL的优劣,仅仅 ...

  2. mysql 不会丢失数据吗_讨论MySQL丢失数据的几种情况

    1. 概述 很多企业选择MySQL都会担心它的数据丢失问题,从而选择Oracle,但是其实并不十分清楚什么情况下,各种原因导致MySQL会丢失部分数据.本文不讨论Oracle和MySQL的优劣,仅仅关 ...

  3. mysql ibata文件_重装系统后,怎么调用之前mysql的数据_mysql

    重装系统后,如何调用之前mysql的数据 前提是:必须保留之前的数据库数据 在介绍此方法之前,提醒各位最好的转移数据的方法为: 在原来MYSQL服务器导出SQL文件,然后再在新的MYSQL服务器导入数 ...

  4. 讨论MySQL丢失数据的几种情况

    1. 问题定义 一般我们希望把一系列的数据作为一个原子操作,这样的话,这一系列操作,要么提交,要么全部回滚掉. 当我们提交一个事务,数据库要么告诉我们事务提交成功了,要么告诉我们提交失败. 数据库为了 ...

  5. mysql 复制数据_MySQL快速复制数据库数据表的方法

    某些时候,例如为了搭建一个测试环境,或者克隆一个网站,需要复制一个已存在的mysql数据库.使用以下方法,可以非常简单地实现. 假设已经存在的数据库名字叫db1,想要复制一份,命名为newdb.步骤如 ...

  6. elastic如何和mysql同步数据_MySQL数据库之mysql 同步数据到 ElasticSearch 的方案

    本文主要向大家介绍了MySQL数据库之mysql 同步数据到 ElasticSearch 的方案 ,通过具体的内容向大家展现,希望对大家学习MySQL数据库有所帮助. MySQL Binlog 要通过 ...

  7. mysql解决丢失更新_mysql 数据丢失更新的解决方法

    最新看<innodb 引擎内幕>,作者有介绍丢失更新的问题,这里记录自己的想法和方案 --------------------------------------------------- ...

  8. mysql丢失召回_mysql笔记

    1.1启动与关闭mysql 单实例: 方法一: /etc/init.d/mysqld start/stop netstat -lnt|grep 3306 提示:/etc/init.d/mysqld由m ...

  9. mysql 单机 数据_MySQL数据一致性-单机

    数据+LOG 数据库的数据由两部分组成,一部分是数据,一部分是LOG.Innodb的数据包括内存(Innodb buffer pool)中和硬盘中的数据.数据的更改首先会作用到内存中的缓存数据,然后I ...

最新文章

  1. Windows HTML本地快速渲染轨迹线
  2. 2002: [Hnoi2010]Bounce 弹飞绵羊
  3. java关机命令收集cmd关机命令
  4. 3项目里面全局用less变量 cli vue_vue-cli3配置使用vw实现移动端适配案例
  5. 刚看了一个视频,介绍了实体店十几种线上线下引流方法
  6. Spark 原理 —— 从 akka 到 spark 集群的启动
  7. 响应式架构:消息模式Actor实现与Scala、Akka应用集成
  8. linux c 进程池 简单实现
  9. TapTap推广统计逻辑
  10. 请问大家,有没有法学相关的毕业论文选题 ?
  11. mac软件推荐及chrome插件推荐
  12. keepalived+nginx,haproxy
  13. 团队作业8----第二次项目冲刺(Beta阶段) 第一天
  14. 计算9+99+999+……+999999999
  15. 代谢组学助力研究“线粒体闪烁”,揭示细胞“返老还童”的新奥秘
  16. 手机拍照技巧(一:校园拍摄)
  17. 微信公众号留言功能实现方法分享
  18. 如何构建一个基于IEC61499 的“云化PLC“
  19. 深入理解iputils网络工具-第5篇 arping:地址解析程序
  20. IOS10.3.0~10.3.3不完美越狱

热门文章

  1. 视觉slam第一讲——
  2. php设置页面最小高度,HTML_CSS布局中最小高度的妙用,最小高度可以设定一个BOX的最 - phpStudy...
  3. php self script name,PHP_SELF,SCRIPT_NAME,REQUEST_URI区别
  4. 机器学习、神经网络中不懂的函数及功能实现
  5. Leetcode每日一题:111.minimum-depth-of-binary-tree(二叉树的最小深度)
  6. [golang]如何看懂调用堆栈
  7. 简单的俄罗斯方块代码(Java)
  8. php中js验证表单,js实现表单验证
  9. win 10 1709安装linux,小编详解win10 1709安装教程
  10. [JS进阶] HTML5 之文件操作(file)