zoukankan      html  css  js  c++  java
  • 【学习笔记】InnoDB存储引擎执行一次更新的流程

    InnoDB存储引擎执行一个更新语句的流程

    1.加载数据到缓存中,从磁盘文件加载数据到缓冲池里
    2.把旧值写入undo日志文件,便于回滚
    3.更新内存数据,也就是更新缓冲池里的数据,此时缓冲池的数据变成了脏数据,也即是说和磁盘文件里的数据不一致了
    4.在3步更新后,万一出现系统宕机,缓冲池里的数据会丢失,所以引入redo log来解决,redo log也是先写入内存中的
    5.在提交事务时会把redo log buffer的数据写入redo日志文件,从而保证即使系统宕机了也可以从redo日志文件中恢复数据
        此时可以会有一个疑问,如果在提交事务前系统宕机了呢?此时缓冲区和redo log buffer的数据不是全丢了吗,数据不是丢失了吗?其实这种情况数据丢失是不要紧的,一个事务没有提交,代表它没有执行成功,此时数据丢失,磁盘文件里的数据还是原来的数据,是正常的,不会有任何问题
        把redo日志从redo log buffer里刷入到磁盘文件有几个策略,可以通过innodb_flush_log_at_trx_commit来设置
    为0时不刷入磁盘,为1时刷入磁盘,为2时先写入磁盘文件对应的os cache中,然后可能每隔1s刷入磁盘
    6.在提交事务时也会更新bin log,它时mysql自己的日志文件,不是InnoDB特有的文件,记录的是偏向逻辑性的日志
        bin log刷入磁盘也有几个策略,通过sync_binlog来设置,为0时先写入os cache,为1时直接输入磁盘文件
    7.把binlog文件名称和这次更新的位置写入redo log中去,同时redolog也写入一个commit标记,这个做完一个事务就算结束了
        这一步的意义是保持redo log日志和binlog日志一致,因为5和6是分开做的,在系统宕机时,它俩都有可能一个完成了一个没完成
    8.mysql有一个线程定时的把缓冲区里的数据刷入磁盘
     

  • 相关阅读:
    swagger多个分组代码展示
    rabbitMQ基本概念
    谈谈微信支付曝出的漏洞
    谈谈离职和跳槽
    一个著名的任务调度系统是怎么设计的?
    BAT等公司必问的8道Java经典面试题,你都会了吗?
    从世界杯竞猜骗局谈二分法
    Spring4+Spring MVC+MyBatis整合思路
    十张图让你了解阿里公司架构设计的发展变化史
    一位00后程序员的成长历程
  • 原文地址:https://www.cnblogs.com/lostyears/p/13223525.html
Copyright © 2011-2022 走看看