说说MySQL中的Redo log Undo log都在干啥
1 undo
1.1 undo是啥
Id | Name |
1 | A |
2 | B |
3 | C |
4 |
D
|
1.2 undo参数
1 mysql> show global variables like '%undo%'; 2 +--------------------------+------------+ 3 | Variable_name | Value | 4 +--------------------------+------------+ 5 | innodb_max_undo_log_size | 1073741824 | 6 | innodb_undo_directory | ./ | 7 | innodb_undo_log_truncate | OFF | 8 | innodb_undo_logs | 128 | 9 | innodb_undo_tablespaces | 3 | 10 +--------------------------+------------+ 11 12 mysql> show global variables like '%truncate%'; 13 +--------------------------------------+-------+ 14 | Variable_name | Value | 15 +--------------------------------------+-------+ 16 | innodb_purge_rseg_truncate_frequency | 128 | 17 | innodb_undo_log_truncate | OFF | 18 +--------------------------------------+-------+
- innodb_max_undo_log_size
- innodb_undo_tablespaces
- innodb_undo_log_truncate
- innodb_purge_rseg_truncate_frequency
1.3 undo空间管理
- slot 0 ,预留给系统表空间;
- slot 1- 32,预留给临时表空间,每次数据库重启的时候,都会重建临时表空间;
- slot33-127,如果有独立表空间,则预留给UNDO独立表空间;如果没有,则预留给系统表空间;
Cannot find a free slot for an undo log。
则说明并发的事务太多了,需要考虑下是否要分流业务。
2 redo
2.1 redo是啥
- 当buffer pool中的dirty page 还没有刷新到磁盘的时候,发生crash,启动服务后,可通过redo log 找到需要重新刷新到磁盘文件的记录;
- buffer pool中的数据直接flush到disk file,是一个随机IO,效率较差,而把buffer pool中的数据记录到redo log,是一个顺序IO,可以提高事务提交的速度;
Id | Name |
1 | A |
2 | B |
3 | C |
4 |
D
|
2.2 redo 参数
- innodb_log_files_in_group
- innodb_log_file_size
- innodb_log_group_home_dir
- innodb_log_buffer_size
- innodb_flush_log_at_trx_commit
- innodb_flush_log_at_trx_commit=1,每次commit都会把redo log从redo log buffer写入到system,并fsync刷新到磁盘文件中。
- innodb_flush_log_at_trx_commit=2,每次事务提交时MySQL会把日志从redo log buffer写入到system,但只写入到file system buffer,由系统内部来fsync到磁盘文件。如果数据库实例crash,不会丢失redo log,但是如果服务器crash,由于file system buffer还来不及fsync到磁盘文件,所以会丢失这一部分的数据。
- innodb_flush_log_at_trx_commit=0,事务发生过程,日志一直激励在redo log buffer中,跟其他设置一样,但是在事务提交时,不产生redo 写操作,而是MySQL内部每秒操作一次,从redo log buffer,把数据写入到系统中去。如果发生crash,即丢失1s内的事务修改操作。
- 注意:由于进程调度策略问题,这个“每秒执行一次 flush(刷到磁盘)操作”并不是保证100%的“每秒”。
2.3 redo 空间管理
ib_logfile[number]
命名,Redo log 以顺序的方式写入文件文件,写满时则回溯到第一个文件,进行覆盖写。(但在做redo checkpoint时,也会更新第一个日志文件的头部checkpoint标记,所以严格来讲也不算顺序写)。
- Redo log buffer空间不足
- 事务提交(依赖innodb_flush_log_at_trx_commit参数设置)
- 后台线程
- 做checkpoint
- 实例shutdown
- binlog切换
3 undo及redo如何记录事务
3.1 Undo + Redo事务的简化过程
B.记录A=1到undo log.
C.修改A=3.
D.记录A=3到redo log.
E.记录B=2到undo log.
F.修改B=4.
G.记录B=4到redo log.
H.将redo log写入磁盘。
3.2 IO影响
以减少日志占用的空间。例如,Redo Log中的记录内容可能是这样的:
记录1: <trx1, insert …>
记录2: <trx2, update …>
记录3: <trx1, delete …>
记录4: <trx3, update …>
记录5: <trx2, insert …>
D. 因为C的原因,当一个事务将Redo Log写入磁盘时,也会将其他未提交的事务的日志写入磁盘。
3.3 恢复
B. 进行恢复时,重做所有事务包括未提交的事务和回滚了的事务。然后通过Undo Log回滚那些
记录1: <trx1, Undo log insert <undo_insert …>>
记录2: <trx1, insert …>
记录3: <trx2, Undo log insert <undo_update …>>
记录4: <trx2, update …>
记录5: <trx3, Undo log insert <undo_delete …>>
记录6: <trx3, delete …>
C. 到这里,还有一个问题没有弄清楚。既然Redo没有事务性,那岂不是会重新执行被回滚了的事务?
确实是这样。同时Innodb也会将事务回滚时的操作也记录到redo log中。回滚操作本质上也是
对数据进行修改,因此回滚时对数据的操作也会记录到Redo Log中。
一个回滚了的事务的Redo Log,看起来是这样的:
记录1: <trx1, Undo log insert <undo_insert …>>
记录2: <trx1, insert A…>
记录3: <trx1, Undo log insert <undo_update …>>
记录4: <trx1, update B…>
记录5: <trx1, Undo log insert <undo_delete …>>
记录6: <trx1, delete C…>
记录7: <trx1, insert C>
记录8: <trx1, update B to old value>
http://mysql.taobao.org/monthly/2015/04/01/
转载于:https://www.cnblogs.com/xinysu/p/6555082.html
说说MySQL中的Redo log Undo log都在干啥相关推荐
- Mysql中的redo log
Mysql中的redo log 1.什么是redo log redo log叫做重做日志,是保证事务持久性的重要机制.当mysql服务器意外崩溃或者宕机后,保证已经提交的事务,确定持久化到磁盘中的一种 ...
- binlog redo log undo log
WAL是什么 Write-Ahead Logging,先写日志,再写磁盘 先写日志,等适当的时候再写磁盘,降低磁盘 IO 成本,提高更新效率 什么是 redo log 重做日志,属于引擎层,InnoD ...
- 面试官:MySQL中的7种日志你都知道是干啥的吗?
你知道的越多,不知道的就越多,业余的像一棵小草! 你来,我们一起精进!你不来,我和你的竞争对手一起精进! 编辑:业余草 cnblogs.com/wy123/p/8365234.html 推荐:http ...
- 把MySQL中的各种锁及其原理都画出来
疫情期间在家工作时,同事使用了 insert into on duplicate key update 语句进行插入去重,但是在测试过程中发生了死锁现象: ERROR 1213 (40001): De ...
- MYSQL专题-MySQL三大日志binlog、redo log和undo log
日志是mysql数据库的重要组成部分,记录着数据库运行期间各种状态信息.mysql日志主要包括重做日志(redo log).回滚日志(undo log).二进制日志(bin log).错误日志(err ...
- 原创 MySQL探秘(八):基于Redo Log和Undo Log的MySQL崩溃恢复流程(一致性)
黑盒下的更新数据流程 当我们查询数据的时候,会先去Buffer Pool中查询.如果Buffer Pool中不存在,存储引擎会先将数据从磁盘加载到Buffer Pool中,然后将数据返回给客户端:同理 ...
- MySQL日志(undo log 和 redo log 实现事务的原子性/持久性/一致性)
日志的重要性 日志绝对是数据库的核心. 持久化的日志记录了各种重要的信息. 数据的恢复需要依赖日志. 慢查询sql语句需要用到慢查询日志.以及错误日志中保存着mysqld数据库服务端在启动过程中 ...
- MySQL——binlog,redo log
一.什么是binlog.redo log binlog属于逻辑日志,是逻辑操作.innodb redo属于物理日志,是物理变更.逻辑日志有个缺点是难以并行,而物理日志可以比较好的并行操作. binlo ...
- undolog 是binlog_mysql日志redo log、undo log、binlog以及作用看这篇就可以啦
什么是事务日志? 事务要保证ACID的完整性必须依靠事务日志做跟踪,每一个操作在真正写入数据数据库之前,先写入到日志文件中如要删除一行数据会先在日志文件中将此行标记为删除,但是数据库中的数据文件并没有 ...
最新文章
- android 实现自定义监听接口,Android在自定义类中实现自定义监听器方式
- JAVA的System.out.println和System.out.printf之间有什么区别?
- java和net共同点,Java和.NET中的垃圾回收机制比较
- 黄聪:WordPress判断当前用户是否为管理员登录
- 局部变量写在循环内还是外_循环内的局部变量和性能
- rnn按时间展开_双向RNN的理解
- 使用JFreeChart实现基于Web的柱状图
- SDNU 1272.SL的秘密
- 【jQuery笔记Part4】02-jQuery微博案例
- redis数据结构小结
- 生僻词汇(地名,动植物名)
- linux启动清除指定内存,柴少鹏的官方网站
- NIS 报错No such map passwd.byname. Reason: Can't bind to server which serves this domain
- Fedora 9 Samba 配置
- 事业单位计算机岗位考公基吗,【事业单位】江苏统考考什么?公基、言语……题量分布!...
- Git 图标无法正常显示解决方案
- git clone报错error: RPC failed; curl 56 GnuTLS recv error (-110): The TLS connection was non-properly
- 19寸宽屏液晶显示器的设置 有效保护视力
- 985硕士美女程序媛:10次面试的真实经历!阿里/携程/美团/58/华为....
- (四)激活函数与loss梯度
热门文章
- 空压机数据采集系统,使用昆仑通态触摸屏制作,具备完善的数据采集和历史记录保存功能
- 使用Delve调试Go应用程序
- 阿里云官网全新版本抢先看
- 2015 年下半年 网络管理员 下午试卷
- 发送验证码倒计时效果实现
- php 怎么视频截图,视频如何截图 如何截图视频画面
- 如何只通过指针获取所指内容的大小
- OSCAR开源先锋日|成立三大开源组织,2022 OSCAR开源先锋日成功举办!
- 巴比特 | 元宇宙每日必读:浙江发布2023年元宇宙产业发展工作要点,6月底前组建元宇宙产业联盟,年底打造20家“专精特新”企业...
- 博士申请 | 香港大学刘希慧老师课题组招收CV方向全奖博士/博后/RA/实习生