Undo日志文件的产生和使用
Undo 日志
比如A有200块钱, B有50 块钱,现在A要给B转100块” 。
(1) 开始事务 T1 (假设T1是个事务的内部编号)
(2) A余额 = A余额 -100
(3) B余额 = B余额 + 100
(4) 提交事务 T1
会对此事务记录Undo的日志文件,记录下事务开始之前的他俩账号余额:
[开始事务 T1]
[事务T1, A原有余额,200]
[事务T1, B原有余额,50]
如果事务执行到一半挂了,数据库重启以后我就根据undo的日志文件来恢复。
例子:如果第三步还没执行完就断电了, 数据库重启以后就需要根据undo日志复原,要是系统恢复的过程中又断电了,下次重启再次恢复,此操作拥有幂等性,重复多少次都没有问题。
如何判断哪些事务需要恢复
恢复之后需要在日志文件中加上一行 [回滚事务 T1] , 这样下一次恢复就不用再考虑T1这个事务了。
[开始事务 T1]
[事务T1, A原有余额,200]
[事务T1, B原有余额,50]
[提交事务 T1]
Undo日志文件中不仅仅只有余额, 事务的开始和结束也会记录,如果我在日志文件中看到了[提交事务 T1], 或者 [回滚事务 T1], 就表示此事务已经结束,不用再去理会它了, 更不用去恢复。 如果我只看到 [开始事务 T1], 而找不到提交或回滚,那就得恢复。
日志从缓冲区写入磁盘的时机
两条规则:
1. 在最新余额写入硬盘之前, 一定要先把相关的Undo日志记录写入硬盘。 例如[事务T1, A原有余额,200] 一定要在A的新余额=100写入硬盘之前写入。
2. [提交事务 T1] 这样的Undo日志记录一定要在所有的新余额写入硬盘之后再写入。
| 操作 | 数据缓冲区 |
Undo日志缓冲区 |
|
| 1 |
开始事务T1 |
开始事务T1 |
|
| 2 | A余额 = A余额 -100 | A新余额:100 | 事务T1,A原有余额,200 |
| 3 | 把undo日志缓冲区内容写入磁盘 | ps:此步骤会清空undo日志缓冲区 | |
| 4 | 把A新余额写入磁盘 | ||
| 5 | B余额 = B余额 + 100 | B新余额:150 | |
| 6 | 把undo日志缓冲区内容写入磁盘 | ||
| 7 | 把B新余额写入磁盘 | ||
| 8 | 提交事务T1 | 提交事务T1 | |
| 9 | 把undo日志缓冲区内容写入磁盘 |
情况一:
如果系统在第4步和第5步之间崩溃,A的余额写入了硬盘,但是B的还没写入, Undo日志看起来是这样的:
[开始事务 T1]
[事务T1, A原有余额,200]
由于找不到事务结束的日志, 进行恢复操作, 把A的原有余额给恢复了。
情况二:
如果是在第7步和第8步之间系统崩溃,A和B的最新余额都写入了硬盘,但是没有提交事务, 那Undo日志看起来是这样的:
[开始事务 T1]
[事务T1, 旺财原有余额,200]
[事务T1, 小强原有余额,50]
由于没有事务结束的日志,也需要进行恢复,把A和B的原有余额恢复成200和50
情况三:
如果是在第8步和第9步之间系统崩溃, A和B的最新余额都写入了硬盘也提交了事务, 但是提交事务的操作没有写入Undo 日志,Undo日志还是这样:
[开始事务 T1]
[事务T1, 旺财原有余额,200]
[事务T1, 小强原有余额,50]
由于没有事务结束的日志,需要进行恢复,把A和B原有余额恢复成200和50
Undo日志文件的产生和使用的更多相关文章
- MySQL数据库日志文件(redo与undo)
+++++++++++++++++++++++++++++++++++++++++++标题:MySQL数据库日志文件时间:2019年2月25日内容:MySQL数据库日志文件(redo日志和undo日志 ...
- ORACLE 移动数据文件 控制文件 重做日志文件
ORACLE数据库有时候需要对存储进行调整,增加分区.IO调优等等,此时需要移动数据文件.重做日志文件.控制文件等等,下文结合例子总结一下这方面的知识点. 进行数据文件.重做日志文件.控制文件的迁移前 ...
- 批量迁移Oracle数据文件,日志文件及控制文件
有些时候需要将Oracle的多个数据文件以及日志文件重定位或者迁移到新的分区或新的位置,比如磁盘空间不足,或因为特殊需求.对于这种情形可以采取批量迁移的方式将多个数据文件或者日志文件实现一次性迁移.当 ...
- undo日志
InnoDB’s Undo 前言 Undo log是InnoDB MVCC事务特性的重要组成部分.当我们对记录做了变更操作时就会产生undo记录,Undo记录默认被记录到系统表空间(ibdata)中, ...
- mysql 初识之日志文件篇
日志文件 1. err日志 error log 记录mysql在运行的过程中所有较为严重的警告和错误信息,以及mysql server每次启动和关闭的详细信息.系统在默认情况下关闭error ...
- mysql基础---日志文件
一 基本日志文件 MYSQL有不同类型的日志文件(各自存储了不同类型的日志),从它们当中可以查询到MYSQL里都做了些什么,对于MYSQL的管理工作,这些日志文件是不可缺少的. 1.错误日志(The ...
- MySQL 各类日志文件介绍
日志文件 1.错误日志 ErrorLog 错误日志记录了MyQLServer运行过程中所有较为严重的警告和错误信息,以及MySQLServer每次启动和关闭的详细信息. 在默认情况下,系统记录错误日志 ...
- 数据库中的undo日志、redo日志
MySQL中有六种日志文件,分别是:重做日志(redo log).回滚日志(undo log).二进制日志(binlog).错误日志(errorlog).慢查询日志(slow query log).一 ...
- Oracle备份恢复之断电导致控制文件和日志文件损坏修复
Oracle数据库遭遇断电遭遇ora-00214.ora-00314.ora-00312错误恢复案例一枚 1.数据库在17日21:19启动开始报错ora-214错误: Tue Jan 17 21:19 ...
随机推荐
- android 按照拼音模糊查询中如何把字符转换成拼音
http://files.cnblogs.com/liaolandemengxiang/%E6%96%B0%E5%BB%BA%E6%96%87%E4%BB%B6%E5%A4%B9.rar 首先转换成的 ...
- mysql变更数据的捕获和入库
问题:涉及状态的信息,mysql中是update的,缺少中间状态的记录.数据分析中需要这部分数据. 思路:后端服务通过监控某张表的某个字段,根据mysql的binlog文件,还原数据,发送到kafka ...
- HRBUST 1161 树状数组区间更新求和
Leyni Time Limit: 3000 MS Memory Limit: 65536 K Total Submit: 267(64 users) Total Accepted: 82(57 us ...
- java 异步机制与同步机制的区别
所谓异步输入输出机制,是指在进行输入输出处理时,不必等到输入输出处理完毕才返回.所以异步的同义语是非阻塞(None Blocking). 网上有很多网友用很通俗的比喻 把同步和异步讲解的很透彻 转过 ...
- Elasticsearch 系列1 --- Windows10安装Elasticsearch
在Windows环境下,ES提供了两种安装方式,一种是通过MSI,特点是简单方便:另一种是绿色安装,解压zip包.本文选择第二种方式. 1. 准备工作 (1) Windows 10 (2) JDK 1 ...
- Kali Linux渗透测试实战 1.4 小试牛刀
目录 1.4 小试牛刀 1.4.1 信息搜集 whois查询 服务指纹识别 端口扫描 综合性扫描 1.4.2 发现漏洞 1.4.3 攻击与权限维持 小结 1.4 小试牛刀 本节作为第一章的最后一节,给 ...
- vue项目webpack中Npm传递参数配置不同域名接口
项目开发中,前端在配置后端api域名时很困扰,常常出现:本地开发环境: api-dev.demo.com测试环境: api-test.demo.com线上生产环境: api.demo.com, 这次是 ...
- Fiddler工具使用介绍三
我们知道Fiddler是位于客户端和服务器之间的代理,它能够记录客户端和服务器之间的所有 HTTP请求,可以针对特定的HTTP请求,分析请求数据.设置断点.调试web应用.修改请求的数据,甚至可以修改 ...
- 企业项目开发--cookie(1)
此文已由作者赵计刚授权网易云社区发布. 欢迎访问网易云社区,了解更多网易技术产品运营经验. 注:本章代码基于<第五章 企业项目开发--mybatis注解与xml并用>的代码,链接如下: h ...
- ssh远程登录出现Host key verification failed.解决办法
今天通过ssh和域名连接主机: IcarusdeMacBook-Pro:~ icarus$ ssh root@icarusyu.me 出现了如下错误: @@@@@@@@@@@@@@@@@@@@@@@@ ...