MySQL-事务的实现-redo
- 事务的实现:
- 原子性(A : Atomicity)
- 一致性(C : consistency )
- 隔离性(I : isolation)
- 持久性(D : durability )
- 实现方式:
- 隔离性:通过锁来实现
- 原子性和持久性:通过redo log 来实现
- 一致性:通过undo来实现
- redo 和 undo 比较:
- redo:恢复提交事务修改的页操作
- undo: 回滚行记录到某个特定版本
- redo: 是物理日志,记录的是物理的修改操作
- undo: 是逻辑日志,根据每行记录进行记录
- redo : 在数据库运行时,不需要读取操作(注:数据库恢复时,才用redo)
- undo : 在数据库运行时,需要随机读取(注:回滚时用)
![](/assets/blank.gif)
InnoDB使用日志来减少提交事务时的开销。因为日志中已经记录了事务,就无须在每个事务提交时把缓冲池的脏块刷新(flush)到磁盘中。事务修改的数据和索引通常会映射到表空间的随机位置,所以刷新这些变更到磁盘需要很多随机IO。InnoDB假设使用常规磁盘,随机IO比顺序IO昂贵得多,因为一个IO请求需要时间把磁头移到正确的位置,然后等待磁盘上读出需要的部分,再转到开始位置。
InnoDB用日志把随机IO变成顺序IO。一旦日志安全写到磁盘,事务就持久化了,即使断电了,InnoDB可以重放日志并且恢复已经提交的事务。
InnoDB使用一个后台线程智能地刷新这些变更到数据文件。这个线程可以批量组合写入,使得数据写入更顺序,以提高效率。
整体的日志文件大小受控于innodb_log_file_size和innodb_log_files_in_group两个参数,这对写性能非常重要。日志文件的总大小是每个文件的大小之和。
当InnoDB变更任何数据时,会写一条变更记录到内存日志缓冲区中。在缓冲满的时候,事务提交的时候,或者每一秒钟,这三个条件无论哪个先达到,InnoDB都会刷新缓冲区的内容到磁盘日志文件。变量innodb_log_buffer_size可以控制日志缓冲区的大小,默认为1M。通常不需要把日志缓冲区设置得非常大。推荐的范围是1~8M。作为一个经验法则,日志文件的全部大小,应该足够容纳服务器一个小时的活动内容。
InnoDB怎么刷新日志缓冲?当InnoDB把日志缓冲刷新到磁盘日志文件时,会先使用一个Mutex锁住缓冲区,刷新到所需要的位置,然后移动剩下的条目到缓冲区的前面。日志缓冲必须被刷新到持久化存储,以确保提交的事务完全被持久化了。如果和持久相比更在乎性能,可以修改innodb_flush_log_at_trx_commit变量来控制日志缓冲刷新的频繁程度。可能的设置如下:
0:每秒一次把日志缓冲写到日志文件,但是事务提交时不做任何时。
1:将日志缓冲写到日志文件,然后每次事务提交都刷新到持久化存储(默认并且最安全的设置),该设置保证不会丢失任何已提交的事务。
2:每秒钟做一次刷新,但每次提交时把日志缓冲写到日志文件,但是不刷新到持久化存储。
“把日志缓冲写到日志文件”和“把日志刷新到持久化存储”是不同的。在大部分操作系统中,把缓冲写到日志只是简单地把数据从InnoDB的内存缓冲转移到了操作系统的缓存,也是在内存里,并没有真正把数据写到持久化存储。
如果MySQL崩溃了或者断电了,设置0和2通常会导致最多1秒的数据丢失,因为数据可能存在于操作系统的缓存中。
相反,把日志刷新到持久化存储意味着InnoDB请求操作系统把数据刷出缓存,并且确认写到磁盘了,这是一个阻塞IO的调用,直到数据被完全写回才会完成,当写数据到磁盘比较慢,而该配置项设置为1时,可能明显地降低InnoDB每秒可以提交的事务数。
innodb_flush_log_at_trx_commit=1.
![](/assets/blank.gif)
![](/assets/blank.gif)
名称 |
大小(字节)
|
log file header
|
512
|
checkpoint1
|
512
|
空
|
512
|
checkpoint2
|
512
|
![](/assets/blank.gif)
![](/assets/blank.gif)
- 重做日志写入的总量
- checkpoint的位置
- 页的版本
![](/assets/blank.gif)
【redo log buffer】【redo log file】-原理
![](/assets/blank.gif)
![](/assets/blank.gif)
- Master Thread 每一秒将重做日志缓冲刷新到重做日志文件;
- 每个事务提交时会将重做日志缓冲刷新到重做日志文件;
- 当重做日志缓冲池剩余空间小于1/2时,重做日志缓冲刷新到重做日志文件。
- 太大:恢复时可能需要很长时间
- 太小:可能导致一个事务需要多次切换重做日志文件;会导致async checkpoint,导致性能抖动。
- 错误日志警告信息:
redo_log_type (1字节) | space (压缩后可能<4字节) | page_no | redo_log_body |
转载于:https://www.cnblogs.com/duanxz/p/3469405.html
MySQL-事务的实现-redo相关推荐
- 【宋红康 MySQL数据库 】【高级篇】【17】MySQL事务日志:redo、undo
持续学习&持续更新中- 学习态度:守破离 [宋红康 MySQL数据库 ][高级篇][17]MySQL事务日志 概述 redo日志 为什么需要redo日志 redo日志的好处.特点 redo的组 ...
- 精讲 MySQL 事务日志:redo log 和 undo log
来源:https://blog.csdn.net/demonson/article/details/104369733 innodb事务日志包括redo log和undo log.redo log是重 ...
- MySQL怎么运行的系列(八)14张图说明白MySQL事务原子性和undo日志原理
本系列文章目录 展开/收起 MySQL怎么运行的系列(一)mysql体系结构和存储引擎 MySQL怎么运行的系列(二)Innodb缓冲池 buffer pool 和 改良版LRU算法 Mysql怎么运 ...
- MySQL事务原理浅析
前言 因为自己对数据的可靠性,可用性方面特别感兴趣,所以在MySQL事务方面看了很多资料,也看了很多博客,所以想到自己也写一篇博客整理整理自己所学内容,尽量用自己的语言解释得通俗易懂. 事务经典场 ...
- MySQL日志:binlog、事务日志(redo、undo)
事务的隔离性是通过锁实现,而事务的原子性.一致性和持久性则是通过日志实现.Mysql的日志可以分为: binlog:server层实现 事务日志:包括redo log.undo log,引擎层(inn ...
- 手撕 MySQL 事务,发生了什么?
点击上方 好好学java ,选择 星标 公众号 重磅资讯.干货,第一时间送达 今日推荐:2 个月的面试亲身经历告诉大家,如何进入大厂? 作者:flyman 链接:https://segmentfaul ...
- MYSQL专题-MySQL事务实现原理
用过事务的伙伴大概都知道它的相关特性主要有四个:原子性(Atomicity),一致性(Consistency),隔离型(Isolation)以及持久性(Durability).今天想跟大家一起研究下事 ...
- mysql事务服务_MySQL (事务篇)
1.事务内,存在两条sql语句,第一条执行成功了,第二条执行失败了,commit之后,什么结果? 结果:第一条执行成功,第二条执行失败,不进行回滚 注意:MySQL 中的回滚,必须人为去做,在PHP ...
- Redis的事务:相关命令 watch 与mysql事务的区别
Redis事务的概念: Redis 事务的本质是一组命令的集合. 事务支持一次执行多个命令,一个事务中所有命令都会被序列化.在事务执行过程,会按照顺序串行化执行队列中的命令,其他客户端提交的命令请求不 ...
- MySQL 事务 :ACID、并发带来的问题、事务的隔离级别、事务的实现
文章目录 ACID 原子性 一致性 持久性 隔离性 并发带来的隔离问题 幻读(虚读) 不可重复读 脏读 丢失更新 隔离级别 Read Uncommitted (读未提交) Read Committed ...
最新文章
- vue element的若干问题
- 【虚拟化】docker部署nginx
- android 官方教程中文版
- linux 下简单的ftp客户端程序
- mysql数据库导入导出文件sql文件
- MySQL 索引底层数据结构实现
- 虚拟机安装mysql_linux虚拟机中安装MySQL
- oracle重新生成控制文件,Oracle重建控制文件的语法
- 微信小程序|开发实战篇之六-pagination分页组件
- Bootstrap Datatable 简单的基本配置
- python数据分析报告范文_Python数据实战分析之定量和定性数据分析
- 拥有2000家门店,他如何晋升为服装界的新宠? 1
- 新浪微博分享错误代码列表
- 【Codeforces Round #476 (Div. 2) [Thanks, Telegram!] B】Battleship
- 仿QQ音乐下载歌曲头部导航
- PMP备考之路 - 汪博士第十二章(项目采购管理)
- c语言编程软件平板_想在ipad上进行C语言程序编写,请问有没有编译的APP
- java中ajax是什么意思,java中使用Ajax技术
- Hybird App混合移动应用开发技术整体解决方案,速来围观!
- 《keep studying》————《持续学习》英译汉【istrangeboy精品英文励志短文系列】
热门文章
- 微信字典排序java_【支付宝,微信支付必备】Java实现url参数按照参数名ASCII码从小到大排序(字典序)...
- python课后题答案第一章_python核心编程课后习题解答第一章
- 【ElasticSearch】es Elasticsearch压测实战 II esrally 进阶实战 笔记
- 【java】java 的网络地址类 InetSocketAddress
- 95-10-030-启动-deamon定时任务
- 【java】Java 中的 Exchanger 线程同步使用方法 线程之间交换数据
- Spark连接hive
- HDFS block丢失过多进入安全模式(safe mode)的解决方法
- spark学习-34-Spark的BroadcastManager广播管理器
- php变量在html调用函数调用,PHP_如何在html标记中调用的函数里传递对象,最近使用jquery结合Ajax开发一个 - phpStudy...