1.  概述

很多企业选择MySQL都会担心它的数据丢失问题,从而选择Oracle,但是其实并不十分清楚什么情况下,各种原因导致MySQL会丢失部分数据。本文不讨论Oracle和MySQL的优劣,仅仅关注MySQL丢失数据的几种情况。希望能够抛砖引玉,让各位MySQL大牛们梳理出MySQL最安全或者性价比合适的适合各种应用场景的方案。

2.  问题定义

一般我们希望把一系列的数据作为一个原子操作,这样的话,这一系列操作,要么提交,要么全部回滚掉。

当我们提交一个事务,数据库要么告诉我们事务提交成功了,要么告诉我们提交失败。

数据库为了效率等原因,数据只保存在内存中,没有真正的写入到磁盘上去。如果数据库响应为“提交成功”,但是由于数据库挂掉,操作系统,数据库主机等任何问题导致这次“提交成功”的事务对数据库的修改没有生效,那么我们认为这个事务的数据丢失了。这个对银行或者支付宝这种业务场景来说是不能接受的。所以,保证数据不丢失也是数据库选择的一个重要衡量指标

mysql的架构和普通的数据库架构最大的差异在于它使用插件式的存储引擎。数据的存取由存储引擎负责。要了解MySQL数据丢失的问题就需要从MySQL server层和InnoDB目前最流行的支持事务的存储引擎分别来分析了。

3.  InnoDB事务数据丢失

首先,我们来看一下InnoDB事务数据丢失的情况。

3.1. InnoDB事务基本原理

InnoDB的事务提交需要写入undo log,redo log,以及真正的数据页。专业的介绍可以参考丁奇和云华的两篇文章。我们这里通俗一点简单介绍一下。

InnoDB跟Oracle非常类似,使用日志先行的策略,将数据的变更在内存中完成,并且将事务记录成redo,转换为顺序IO高效的提交事务。这里日志先行,也就是说,日志记录到数据库以后,对应的事务就可以返回给用户,表示事务完成。但是实际上,这个数据可能还只在内存中修改完成,并没有刷到磁盘上去,俗称“还没有落地”。内存是易失的,如果在数据“落地”之前,机器挂了,那么这部分数据就丢失了。而数据库怎么保证这些数据还是能够找回来列?否则,用户提交了一个事务,数据库响应请求并回应为事务“提交成功”,数据库重启以后,这部分修改数据的却回到了事务提交之前的状态。

3.2. InnoDB事务崩溃恢复基本原理

InnoDB和Oracle都是利用redo来保证数据一致性的。如果你有从数据库新建一直到数据库挂掉的所有redo,那么你可以将数据完完整整的重新build出来。但是这样的话,速度肯定很慢。所以一般每隔一段时间,数据库会做一个checkpoint的操作,做checkpoint的目的就是为了让在该时刻之前的所有数据都”落地”。这样的话,数据库挂了,内存中的数据丢了,不用从最原始的位置开始恢复,而只需要从最新的checkpoint来恢复。将已经提交的所有事务变更到具体的数据块中,将那些未提交的事务回滚掉。

3.3. InnoDB redo日志

这样的话,保证事务的redo日志刷到磁盘就成了事务数据是否丢失的关键。而InnoDB为了保证日志的刷写的高效,使用了内存的log buffer,另外,由于InnoDB大部分情况下使用的是文件系统,(linux文件系统本身也是有buffer的)而不是直接使用物理块设备,这样的话就有两种丢失日志的可能性:日志保存在log_buffer中,机器挂了,对应的事务数据就丢失了;日志从log buffer刷到了linux文件系统的buffer,机器挂掉了,对应的事务数据就丢失了。当然,文件系统的缓存刷新到硬件设备,还有可能被raid卡的缓存,甚至是磁盘本身的缓存保留,而不是真正的写到磁盘介质上去了。这个就不在我们这次讨论的范围内了。

InnoDB的日志你还可以参考这篇文章

mysql丢失数据,mysql数据丢失问题讨论(转)相关推荐

  1. mysql丢失数据_MySQL数据丢失问题

    这两天遇到mysql宕机的问题,导致数据出现不一致的现象,结果发现有个特别重要的参数innodb_flush_log_at_trx_commit特别需要关注,默认情况下这个参数是1,即严格保证数据库的 ...

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

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

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

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

  4. mysql空洞数据,Mysql 表空间和 数据页空洞

    一.表空间 1.表空间: innodb 引擎存储的最高层: 存放所有的数据 2.独立表空间:Mysql 版本5.6 后默认开启的单表单空间 (1)Innodb 默认存储引擎页的大小为 16K :默认表 ...

  5. excel数据选项卡中无从mysql导入数据/mysql for excel搞不定

    关于mysql不能导入EXCEL excel和mysql均安装为最新版本,在mysql官网检查发现安装选项中未安装"Mysql for excel" 全部卸载重来时显示不能安装该插 ...

  6. mysql提交数据时会丢失一部分_技术|MYSQL数据丢失讨论

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

  7. mysql 查询数据 程序_MySQL 查询数据

    MySQL 查询数据 MySQL 数据库使用SQL SELECT语句来查询数据. 你可以通过 mysql> 命令提示窗口中在数据库中查询数据,或者通过PHP脚本来查询数据. 语法 以下为在MyS ...

  8. 向 mysql导入数据 源码_MySQL 导入数据

    MySQL 导入数据 MySQL中可以使用两种简单的方式来导入MySQL导出的数据. 使用 LOAD DATA 导入数据 MySQL 中提供了LOAD DATA INFILE语句来插入数据. 以下实例 ...

  9. mysql11导入数据_MySQL专题11之MySQL导出数据、MySQL导入数据

    1.MySQL导出数据 -  MySQL中你可以使用SELECT...INTO OUTFILE语句来简单的导出数据到文本文件中. a.使用SELECT...INTO OUTFILE -  以下实例中我 ...

最新文章

  1. PHP导出MySQL数据字典
  2. code block怎样导入整个文件夹_一文就能get!带你了解Python模块导入的真相,拿走不谢...
  3. mysql-5.7.24初始化数据库_MySQL5.7.28 初始化数据库
  4. Linux进程管理:上帝视角看进程调度
  5. maven工程 java 实现文件上传 SSM ajax异步请求上传
  6. flex 颜色16进制对照表
  7. arcgis server学习(一)
  8. [js方法pk]之instanceof() vs isPrototypeOf() hasOwnProperty() vs propertyIsEnumerable()
  9. AD13中对工程进行编译出现的error
  10. 线性代数Python计算:无关向量组的正交化
  11. html5+ mui框架 微信授权登录无响应,不回跳APP
  12. 2022-10-24 dell R740服务器 安装显卡 NVIDIA Tesla P40 24GB
  13. Lively Wallpaper —— 优秀的开源视频壁纸软件
  14. Measure and entertain
  15. Windows RC版、RTM版、OEM版、RTL版、VOL版的区别
  16. matlab八分之一中点画圆算法,中点八分画圆算法
  17. win10全屏之后任务栏不消失的问题
  18. oracle创建同义词授权,Oracle同义词赋权
  19. 云服务器怎么维护运营
  20. 图像分割中阈值的自动选取的研究及其算法实现

热门文章

  1. 微信订阅号推广只要这一个标题就够了!
  2. 骨传导蓝牙耳机哪个好,五款热门骨传导蓝牙耳机推荐
  3. 深入学习Linux摄像头(一)v4l2应用编程
  4. python图表_使用Python绘制图表大全总结
  5. 几种常用的power bi 图表怎么做
  6. Bose SoundLink Revolve或者Bose SoundLink Revolve+ AUX音频播放一会没有声音
  7. Unity GL画线的坑
  8. OpenCV学习(函数)
  9. linux 信号signum.h SIGINT SIGUSR1 SIGUSR2
  10. 我为何在 CSDN 乐在其中