【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 ...
随机推荐
- Spring Security Session并发控制原理解析
当使用spring security 的标签,如下,其中<sec:session-management>对应的SessionManagementFilter.从名字可以看出,这是一个管理S ...
- iOS代码组件化--利用cocoaPods创建私有库
如果项目模块多,模块间逻辑复杂,我们发现多个人同时维护一个代码仓库需要十分小心,一不小心,造成冲突,解决起来很烦,相信很多人都遇到手工删除合并的冲突的文件的经历. 如果利用组件化思想,每个人维护自己的 ...
- Python中的短路计算
在Python中,布尔类型还可以与其他数据类型做 and.or和not运算,请看下面的代码: In [1]: a = True In [2]: print(a and 'a=T' or 'a=F') ...
- nginx上通过ssl证书将http转发为https
环境:阿里云linux,ngnix 1.16.0 ,ssl证书,XXXX.jar 0.自行在阿里云上下载免费的ssl证书.里面有2个文件.key和pem后面要用到. 1.首先将项目在linux上跑起来 ...
- 搭建docker私有仓库
保存镜像的地方成为仓库(registry).目前有2种仓库:公共仓库和私有仓库. 最方便的是使用公共仓库上传和下载镜像,下载不需要注册,上传需要到公共仓库注册.公共仓库网站:https://hub.d ...
- 报错处理——# Creating Server TCP listening socket *:6379: bind: Address already in use
在启动redis时报错 # Creating Server TCP listening socket *:6379: bind: Address already in use 错误原因 6379地址已 ...
- java实现控件的移动及使用鼠标改变控件大小
package cn.com.test; import java.awt.BorderLayout; import java.awt.Color; import java.awt.Component; ...
- Android编程 控件与布局
控件和布局的继承结构 常用控件 1.TextView <?xml version="1.0" encoding="utf-8"?> <Line ...
- cumsum累计函数系列:pd.cumsum()、pd.cumprod()、pd.cummax()、pd.cummin()
cum系列函数是作为DataFrame或Series对象的方法出现的,因此命令格式为D.cumsum() 举例: D=pd.Series(range(0,5)) 1. cumsum 2. cumpro ...
- 详解iBaits中SqlMapClientTemplate的使用
Apache iBatis(现已迁至Google Code下发展,更名为MyBatis)是当前IT项目中使用很广泛的一个半自动ORM框架,区别于Hibernate之类的全自动框架,iBatis对数据库 ...