这一对难兄难弟配在一起,面试的时候聊起来不要太嗨。估计面试者直接就死在这了。对MySQL的了解越多,越发现想很清晰的聊明白这两个之间的区别和联系就越难。
本着写博客让自己更清晰的角度,还是要记录一下笔者对他们的理解的。
1.事务的特性实现
什么是事务?估计这个问题每个人的回答都不太一样。笔者简单理解为:事务是一组操作的集合,这组操作是原子性的,同时成功或同时失败,不存在中间状态。
那么事务有哪些特性呢?这个大家都可以很顺溜的回答出来:ACID
那么ACID是如何实现的呢?估计这个要干倒一大片,实际笔者也无法很清楚的回答这个问题,只能照抄书本的答案:
隔离性(I):数据库锁实现
持久性(D):redo log实现
原子性(A),一致性(C):undo log实现
2.redo log
redo log也就是重做日志文件
在我们的%MYSQL_DATA_DIR%目录下,我们可以看到会有两个名为ib_logfile0 ib_logfile1的文件,这两个文件存放的就是redo log。
1)记录内容
redo log是InnoDB存储引擎的一个专属功能,它主要记录了该存储引擎的事务日志(insert、update、delete等会产生数据变更操作的一个物理记录)。
2)redo log与二进制日志的不同?按照之前的binlog的介绍,我们知道,binlog主要记录了数据变更操作的事务日志,那么两个都记录事务日志,究竟有何区别呢?
不同点产生的存储引擎不同记录内容形式不同写入磁盘时间点不同binlog任何存储引擎对数据库的更改都会产生记录逻辑日志事务完成后进行一次写入redo logInnoDB产生的数据库更改才会产生记录页修改的物理日志在事务进行中被不断写入在这里说一下什么叫做页修改的物理日志?
我们都知道数据存储在磁盘上,针对InnoDB而言,最小存储格式为页,数据的修改实际修改的是磁盘上对应页的数据,那么这里的页修改的物理日志就是当发生update操作时,redo log会记录在某页的某个position发生的数据的变更,修改为何值。
3)redo log存储格式
redo log以log block的形式存储,每一个log block为512字节,格式如下:
每一个block包括header、tailer和body。
4)redo log的组成redolog由两部分组成:log buffer(内存中的日志缓冲);redo log file(磁盘上的重做日志文件)
当发生事务操作时,相关操作会被记录到log buffer中(内存中),然后在一定时机会被刷新到磁盘上(redo log file)
5)log buffer刷新磁盘时机* 事务提交时
* log buffer中有一半内存空间被使用时
* log checkpoint时
6)LSN先介绍一个概念LSN:Log Sequence Number的缩写,表示当前重做日志序号,它记录的是重做日志的总量(以字节为单位)。
LSN不仅存在于redo log中,还存在每个页总,每个页的头部,存在一个叫做FIL_PAGE_LSN的值,表示该页最后刷新时LSN的大小。
7)checkpoint本来想自己写的,但是这篇博客写的挺完美了
https://blog.csdn.net/weixin_33712987/article/details/85967332
8)如何使用redo log恢复数据
我们可以先通过命令show engine innodb status;查看一下InnoDB的状态信息
...
---
LOG
---
Log sequence number 4400601352
Log flushed up to 4400601352
Pages flushed up to 4400601352
Last checkpoint at 4400601315
0 pending log flushes, 0 pending chkp writes
15 log i/o's done, 0.09 log i/o's/second
----------------------
BUFFER POOL AND MEMORY
----------------------
Total large memory allocated 8585216
Dictionary memory allocated 1013188
Buffer pool size 512
Free buffers 256
Database pages 256
Old database pages 0
Modified db pages 0
Pending reads 0
Pending writes: LRU 0, flush list 0, single page 0
...
注意:如果没有状态信息,可以先执行一个update操作
我们重点看一下这个LOG中的几个参数:
Log sequence number: log buffer中已经写入的LSN值 Log flushed up to: 已经刷新到redo logfile的LSN值 Last checkpoint at:最近一次checkpoint时的LSN值
可以看到last checkpoint
最近更新
- 深拷贝和浅拷贝的区别(重点)
- 【Vue】走进Vue框架世界
- 【云服务器】项目部署—搭建网站—vue电商后台管理系统
- 【React介绍】 一文带你深入React
- 【React】React组件实例的三大属性之state,props,refs(你学废了吗)
- 【脚手架VueCLI】从零开始,创建一个VUE项目
- 【React】深入理解React组件生命周期----图文详解(含代码)
- 【React】DOM的Diffing算法是什么?以及DOM中key的作用----经典面试题
- 【React】1_使用React脚手架创建项目步骤--------详解(含项目结构说明)
- 【React】2_如何使用react脚手架写一个简单的页面?