今天有个朋友突然问到我这个问题,当我们的update语句执行过程中,服务器突然断电了会发生什么?其实这个问题主要在于对mysql update生命周期的理解,以及了解mysql 的redolog和binlog这两个日志的作用。

上一篇文章讲到mysql update的执行过程,MySQL update生命周期 。执行过程主要分为server层和存储引擎层两步操作,server层主要是创建连接和SQL的解析优化,存储引擎层主要是事务的执行和提交的操作。这里就不细讲了可以查看之前的文章或者其他论坛文章。

redolog

redolog 也叫预写式日志WAL(write-ahead logging),它是innoDB存储引擎层特有的一种日志。redolog 空间大小固定,可循环写。

redolog的结构包含四部分信息:

type redo日志的类型(mlog_1byte、mlog_2byte、mlog_4byte、mlog_8byte、mlog_write_string);

space ID表空间ID;

page number 页号;

offset 数据修改的位置;

data 该条日志得具体数据内容,redolog是物理日志所以data里记录的是物理操作(例如:某个事务ID将哪张表空间的第几页中的哪个数据做了什么样的修改)。

redolog的写入过程

redolog最终也是写入在磁盘中的,它写入在磁盘中是顺序IO因此它的性能是非常高的。

写入log buffer

redo log在写入时也不是直接写入磁盘中的,它是被写入到 一个大小为512字节的 redo log block页中。它先写入到 redo 日志缓冲区 (log buffer) 的内存区域中,该区域在MySQL启动时就会向操作系统申请,这片区域被划分为若干个连续的 block,可以通过启动选项 innodb_log_buffer_size 指定 log buffer 的大小。

redo日志刷盘

写入到log buffer内存后,需要将数据刷到磁盘中刷盘的策略主要有:1.当log buffer空间不足;2.当前的事务完整提交;3. 固定每秒刷盘一次;4.正常关闭服务器;

binlog

binlog也叫做归档日志,它是mysql  server层的日志。不区分存储引擎,所有存储引擎都可以使用。binlog 日志是逻辑日志,记录的是sql语句的原始逻辑,binlog日志是以追加的方式写入在文件中并不会覆盖之前的日志。

binlog日志的使用场景

1. mysql主从时做数据复制同步使用,binlog日志是二进制的文件所以它的复制性能会高。

2. 做容灾的数据恢复。

binlog的写入过程

写入binglog cache

mysql服务器系统给每个线程分配一个binlog cache的内存块,当事务在执行的过程中,会把操作的日志写到binlog cache中,同一个事务的binlog日志不会被分开写入都是一次性写入到binlog cache中。如果是支持事务的存储引擎,必须要事务提交后才会写入日志。

binlog日志刷盘

binlog日志刷盘取决于sync_binlog参数的设置,表示每sync_binlog次事务提交则将日志刷新到磁盘。如果设置为0,则完全由文件系统去控制它缓存的刷新。因此未保证数据的完整性最好将sync_binlog设置为1,每次事务提交都刷新,但会对性能有所影响。

如果在update执行过程中突然断电会发生什么?

1. 如果在断电时 redolog 还没有写入,那么重启后将没有任何的数据变化。

2. 如果redolog 已经写入了但状态还在prepare时,binlog日志还没有写入,那么重启后会将事务进行回滚,数据也没有任何变化。

3. 如果redolog 已经写入了,binlog也写入了,但redolog日志还没commit, 那么重启后会检查binlog是否完整,如果完整则提交事务,数据发生变化,如果不完整则回滚事务,数据也不发生变化。

MySQL update正在执行中突然断电,数据是否更改成功?相关推荐

  1. mysql复制一个字段值到另一个字段,MySQL怎么把表中一个字段数据复制到另外一个表的某个字段下...

    点击查看MySQL怎么把表中一个字段数据复制到另外一个表的某个字段下具体信息 答:update b set tel =(select mobile from a where a.id=b.aid) 注 ...

  2. mysql update返回_MySQL中,当update修改数据与原数据相同时会再次执行吗?

    本文同步Java知音社区,专注于Java 作者:powdbahttps://yq.aliyun.com/articles/694162 一.背景 本文主要测试MySQL执行update语句时,针对与原 ...

  3. 瞎说系列——Mysql update的执行过程

    要了解mysql update语句的执行过程,首先要了解一下mysql是如何进行数据的操作的. 首先,数据库中的数据存在哪?肯定是文件系统,磁盘上对吧.那么思考一下,每次查询都从磁盘上去查找吗? 答案 ...

  4. MySQL——update 语句执行流程

    图1 update语句执行流程 从 Buffer Pool(内存中) 中查看是否有这条数据,没有就从磁盘中加载到缓冲池,然后对这行记录加独占锁: 把更新行记录的旧值写入 undo log(以便回滚): ...

  5. 原 oracle执行update一直处于执行中,跟卡住一样

    问题: 在数据迁移过程中,遇到大量对表中异常数据进行处理的操作,比如:字段中包括tab.换行符.或者回车符号,这时需要对字段进行update操作,同时就出现update死锁的情况 原因和解决方法 这种 ...

  6. Mysql在生产环境中快速清理数据及表空间释放

    Mysql数据快速清理及表空间释放 1.TABLES表主要字段说明: MySQL的 information_schema 数据库中的TABLES 表记录了MySQL数据库中每个表占用的空间.表记录的行 ...

  7. mysql8审计_审计对存储在MySQL 8.0中的分类数据的更改

    作者:Mike Frank  译:徐轶韬 面临的挑战 使用敏感信息时您需要拥有审计日志.通常,此类数据将包含一个分类级别作为行的一部分,定义如何处理.审计等策略.在之前的博客中,我讨论了如何审计分类数 ...

  8. oracle blob update,Oracle数据库中对BLOB数据的操作问题

    [TechTarget中国原创]问:请问在Oracle数据库中,如何插入并检索二进制大对象数据(BLOB)? 答:我建议在处理大对象数据之前,先阅读一下"Oracle应用开发者指南" ...

  9. mysql 快速复制_MySQL中快速复制数据表方法汇总

    本文将着重介绍两个MySQL命令的组合,它将以原有数据表为基础,创建相同结构和数据的新数据表. 这可以帮助你在开发过程中快速的复制表格作为测试数据,而不必冒险直接操作正在运行 的数据表. 示例如下: ...

最新文章

  1. dex文件结构(一):dex文件结构
  2. on java 8学习笔记
  3. 服务器tomcat配置教程
  4. 8、linux上安装hbase
  5. python网络爬虫爬取视频_Python网络爬虫——爬取小视频网站源视频!自己偷偷看哦!...
  6. Leetcode每日一题:1122.relative-sort-array(数组的相对排序)
  7. 有linux服务器用来干什么用的,linux集群能干什么
  8. 初始Hibernate-关于hibernate的三种状态
  9. 使用canto+w3m实现在控制台上完美阅读RSS
  10. python切换环境_Python 版本环境切换工具
  11. Java 8 时间日期库的20个使用示例
  12. 其它——Siege压力测试工具使用
  13. html文件关联异常怎么修复,在Win7系统中,如何修复exe文件关联错误?
  14. SSA静态单赋值概念理解
  15. 性能测试工具Loadrunner以及性能测试的流程以及每一个步骤的流程和结果分析
  16. 通过谷歌SEO网站建站提高网站质量,获取更多的客户
  17. 思科刀片服务器系统,思科UCS平台:B460 M4刀片服务器解读
  18. 零基础学小程序 —— 模板样式(三)
  19. apk 连接服务器 修改,修改apk连接服务器地址
  20. Java Bouncy Castle TLS PSK example

热门文章

  1. 5行Python代码就能让你的电脑 “永不息屏”?
  2. mysql提供的凭证是什么_记账凭证是什么
  3. ASA+ASO实现APP流量突围
  4. 常见模型量化方法介绍
  5. 十岁孩子幽门螺旋杆菌会不会影响发育?最好的治疗方法是这样的
  6. 有效投资边界的python实现
  7. 企业级微服务构建-01搭建和使用Maven私有仓库(Nexus)-17审计
  8. 社区型商场/购物中心会员管理方案
  9. TiDB-unsafe recover(三台tikv宕机两台)
  10. 赛门铁克Endpoint Encryption系列资料集