【MySQL】redo log --- 刷入磁盘过程
1、redo log基本概念
redo log的相关概念这里就不再过多阐述,网上有非常多的好的资料,可以看下缥缈大神的文章:https://www.cnblogs.com/cuisi/p/6525077.html,个人感觉介绍的非常详细。
2、数据更改过程简述
MySQL 在更新数据的时候,都是将数据先从磁盘拉到 buffer pool 中,在buffer pool中修改完成后再写到磁盘中,也就是说MySQL中数据的更改都是要经过buffer pool的。
回到这个更新数据的过程中来看:当数据在buffer pool中更改完成的这一刻,更新后的数据是“最新”的,因为此时磁盘中的数据还是更改前的“旧数据”,而我们都是将磁盘中已经持久化的数据作为“标准数据”,因此此时 buffer pool 中的“最新”数据也常人们被称为“脏数据(dirty data)”。
比如将 update 一百行记录作为一个事务,在这个事务执行过程中会将更新后的数据先写入redo log buffer,redo log buffer 再将数据刷入(请注意刷入这个用语,而非写入,后面会详细介绍)redo log中(这点和 binlog 不同,binlog 是在事务 commit 后一次性写入,而 redo log 在事务执行过程中就会写入)。
3、redo log刷新过程
首先需要明白两个概念:
fsync:传统的unix系统在内核中都设有缓冲区,并且大多数的I/O都会通过缓冲进行。当将数据写入文件时,内核通常先将该数据复制到其中一个缓冲区中,如果该缓冲区尚未写满,则并不将其排入输出队列,而是等待其写满或者当内核需要重用该缓冲区以便存放其他磁盘块数据时,再将该缓冲排入输出队列,然后待其到达队首时,才进行实际的 I/O 操作。这种输出方式被成为延迟写。
unix提供了sync、fsync、fdatasync三个函数,sync只是将所有修改过的块放入写队列,不管它是否写磁盘结束就返回;fsync会等待写磁盘结束才会返回。
O_DIRECT选项:O_DIRECT选项是Linux文件写入中的一个选项,开启了这个选项以后,数据就可以跳过系统层的缓存,直接写入磁盘。
redo log并没有打开O_DIRECT选项,所以redo log buffer只是先刷入redo log file,此时刷入的数据并没有落到磁盘上,而是放在文件系统的缓存中。之后为了确保redo log写入磁盘,就通过fsync操作将数据写入磁盘。(redo log buffer到redo log file只是“刷入”的过程,这个时候并没有写入磁盘,而是写入了OS层的文件系统缓存。)
4、重要参数
innodb_flush_log_at_trx_commit:用来控制redo log刷新到磁盘的策略。
默认值是1,表示每次事务提交的时候都调用fsync来写入到磁盘;
0表示事务在执行过程中,日志一直放在redo log buffer中,但是在事务commit的时候,不写入redo log file,而是通过master线程每秒操作一次,从redo log buffer写入到redo log file中。
2表示事务提交时将redo log buffer刷入redo log file,也即刷入系统文件缓存中,不进行fsync操作,由系统来进行fsync操作。此时如果数据库层宕机,则不会丢失redo log,但是如果服务器宕机,这个时候文件系统中的缓存还没有fsync到磁盘文件中,这个时候就会丢失这一部分数据。
【MySQL】redo log --- 刷入磁盘过程的更多相关文章
- MySQL redo log及recover过程浅析
写在前面:作者水平有限,欢迎不吝赐教,一切以最新源码为准. InnoDB redo log 首先介绍下Innodb redo log是什么,为什么需要记录redo log,以及redo log的作用都 ...
- zz MySQL redo log及recover过程浅析
原作地址:http://www.cnblogs.com/liuhao/p/3714012.html 写在前面:作者水平有限,欢迎不吝赐教,一切以最新源码为准. InnoDB redo log 首先介绍 ...
- MySQL redo log 与 binlog 的区别
MySQL redo log 与 binlog 的区别 什么是redo log 什么是binlog redo log与binlog的区别 1. 什么是redo log? redo log又称重做日志文 ...
- mysql redo log
mysql> show variables like '%innodb_log_file_size%'; +----------------------+-----------+ | Varia ...
- 关于MySQL redo log,挖些坑,慢慢填
1. 为什么可以设置为多个redo log ? (innodb_log_files_in_group,默认值和推荐值都是2,我们线上设的统一为4): 2. 什么条件下会触发刷脏?除了master_th ...
- 基于Redo Log和Undo Log的MySQL崩溃恢复流程
在之前的文章「简单了解InnoDB底层原理」聊了一下MySQL的Buffer Pool.这里再简单提一嘴,Buffer Pool是MySQL内存结构中十分核心的一个组成,你可以先把它想象成一个黑盒子. ...
- 2 万字 + 30 张图 | 细聊 MySQL undo log、redo log、binlog 有什么用?
作者:小林coding 计算机八股文网站:https://xiaolincoding.com/ 大家好,我是小林. 从这篇「执行一条 SQL 查询语句,期间发生了什么?」中,我们知道了一条查询语句经历 ...
- 详细分析MySQL事务日志(redo log和undo log)
innodb事务日志包括redo log和undo log.redo log是重做日志,提供前滚操作,undo log是回滚日志,提供回滚操作. undo log不是redo log的逆向过程,其实它 ...
- 【MySQL (六) | 详细分析MySQL事务日志redo log】
Reference: https://www.cnblogs.com/f-ck-need-u/archive/2018/05/08/9010872.html 引言 为了最大程度避免数据写入时 IO ...
随机推荐
- MongoDB安全使用指引
MongoDB社区版有三大主要安全措施,分别是安全认证.角色授权和TLS/SSL传输加密.当然除此之外,定期做数据库备份,也是很好的安全防范手段.另外,本文还将对一些提升MongoDB安全性的细节做阐 ...
- js导航栏单击事件背景颜色变换
<head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8&quo ...
- Hello greenDAO(SQLite)
一.配置Gradle Scripts: 1.1.build.gradle(Project:*****) buildscript { repositories { google() jcenter() ...
- Mac OS 安装robotframework
1,查看当前系统默认的Python路径 which python1==> /usr/bin/python 2,查看当前python 版本 python1==> Python 2.7.10 ...
- python处理Excel - xlrd xlwr openpyxl
python处理Excel - xlrd xlwr openpyxl 1 xlrd和xlwt Todo: 使用xlrd和xlwt读写Excel文件的方法和示例代码,待续... 参考链接: Creati ...
- RSA公私钥获取模数和质数
实际项目中,发现前端在生成公钥对象的时候并不是使用这种方式,而是通过对应的模数跟质数来构造公钥对象的,这样的话,需要进一步将生成的公钥取出对应的模数和质数.openssl.java api都可以将质数 ...
- 关于delete请求,后台接收不到数据
在前端用axios需要这样写 /** * 删除数据 */export function del(url, data = {}) { return axios.delete(url, { data: q ...
- spring-springmvc-jdbc小案例
此案例是为ssm作铺垫的. 创建一个银行账户和基金账户,然后通过银行账户购买基金.由spring.springmvc.spring自带的c3p0实现. 废话不多说.如下 涉及到的 jar包(多了): ...
- IntelliJ IDEA安装scala插件并创建scala示例
1.http://blog.csdn.net/a2011480169/article/details/52712421 2.http://blog.csdn.net/stark_summer/arti ...
- CF822C Hacker, pack your bags!(思维)
Hacker, pack your bags [题目链接]Hacker, pack your bags &题意: 有n条线段(n<=2e5) 每条线段有左端点li,右端点ri,价值cos ...