ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

【学习笔记】InnoDB存储引擎执行一次更新的流程

2020-07-02 11:03:24  阅读:249  来源: 互联网

标签:存储 log 数据 写入 笔记 InnoDB 磁盘 日志 redo


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有一个线程定时的把缓冲区里的数据刷入磁盘  

 

标签:存储,log,数据,写入,笔记,InnoDB,磁盘,日志,redo
来源: https://www.cnblogs.com/lostyears/p/13223525.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有