MySQL事务日志
⭐️写在前面
这里是允谦的学习之路
👍如果对你有帮助,给博主一个免费的点赞以示鼓励把QAQ
👋博客主页🎉 允谦的学习小屋
⭐️更多文章👨🎓请关注允谦主页📝
🍅文章发布日期:2022.02.27
👋java学习之路!
欢迎各位🔎点赞👍评论收藏⭐️
🎄冲冲冲、持续更新🎄
文章目录
事务有4种特性:原子性、一致性、隔离性和持久性。那么事务的四种特性到底是什么机制实现的呢?
- 事务的隔离性由
锁机制
实现的 - 而事务的原子性、一致性和持久性由事务的redo日志和undo日志来保证。
REDO LOG
称为重做日志,提供再写入的操作,恢复提交事务修改的页操作,用来保证事务的持久性UNDO LOG
称为回滚日志,回滚行记录到某个特定的版本,用来保证事务的原子性、一致性
REDO和UNDO都可视为一种恢复操作,但是
- redo log:是存储引擎层生成的日志,记录的是
物理级别
上的页修改操作,比如页号xxx,偏移量yyy,写入了zzz数据,主要为了保证数据库的可靠性 - undo log :是存储引擎层生成的日志,记录的是
逻辑操作
日志,比如对某一行数据进行了INSERT语句操作,那么Undo日志就记录一条与之相反的delete操作,主要用于事务的回滚
和一致性非锁定读
1、redo日志
1.1 REDO日志的好处、特点
1、好处
redo日志降低了刷盘频率
redo日志占用的空间非常小
存储表空间ID、页号、偏移量以及需要更新的值,所需的存储空间很小,刷盘快
2、特点
redo日志是顺序写入磁盘的
事务执行过程中,redo log不断记录
1.2 redo的组成
Redo log可以简单的分为以下两个部分:
- 重做日志的缓冲(redo log buffer),保存在内存中,是易丢失的。
在服务器启动时就向操作系统申请了一大片称之为redo log buffer的连续内存空间,这片内存空间被划分为若干个连续的redo log block。一个redo log block占用512字节的大小
参数设置innodb_log_buffer_size:
redo log buffer大小,默认是16M,最大值是4096M,最小值是1M
show variables like '%innodb_log_buffer_size%';
- 重做日志文件 redo log file,保存在硬盘中,是持久的
1.3 redo log 的刷盘策略
redo log的写入并不是直接写入磁盘的,InnoDB引擎会在写redo log 的时候先写redo log buffer,之后以一定的频率刷入到真正的redo log file中。
注意,redo log buffer刷盘到redo log file的过程并不是真正的刷到磁盘中去,只是刷入到文件系统缓存(pagecache)中去(这是现代操作系统为了提高文件写入效率做的一个优化),真正的写入会交给系统自己来决定(比如page cache足够大了)。那么对于InnoDB来说就存在一个问题,如果交给系统来同步,同样如果系统宕机,那么数据也丢失了(虽然整个系统宕机的概率还是比较小的)。
针对这种情况,InnoDB给出innodb_flush_log_at_trx_commit参数,该参数控制commit提交事务时,如何将redo log buffer中的日志刷新到redo log file中,它支持三种策略
- 设置为0:表示每次事务提交时不进行刷盘操作(系统默认master thread每隔1s进行一次重做日志的同步)
- 设置为1:表示每次事务提交时都进行同步,刷盘操作(默认值)
- 设置为2:表示每次事务提交都只把redo log buffer内容写入page cache,不进行同步,有系统自己决定什么时候同步到磁盘文件
show variables like 'innodb_flush_log_at_trx_commit';
另外,InnoDB存储引擎中有一个后台线程,每隔1s都会将redo log 写入page cache中
2、Undo日志
redo log是事务持久性的保证,Undo log是事务原子性的保证,在事务中更新数据的前置操作其实是要先写入一个undo log。
2.1 如何理解Undo日志
事务需要保证原子性,也就是事务中的操作要么全部完成,要么什么也不做。但有时候事务执行到一半会出现一些情况,比如:
- 情况一:事务执行过程中可能遇到各种错误,比如服务器本身的错误,操作系统错误,甚至是突然断电导致的错误。
- 情况二:程序员可以在事务执行过程中手动输入ROLLBACK语句结束当前事务的执行。
以上情况出现,我们需要把数据改回原来的样子,这个过程称为回滚,这样就可以造成一个假象:这个事务看起来什么都没做,所以符合原子性的要求。
2.2Undo日志的作用
- 回滚数据
- MVCC
样子,这个过程称为回滚,这样就可以造成一个假象:这个事务看起来什么都没做,所以符合原子性的要求。
2.2Undo日志的作用
- 回滚数据
- MVCC