MySQL架构图(重做日志,以及落盘机制)

  |   0 评论   |   0 浏览

事物

四大特性(ACID)

Atomicity(原子性):构成事务的的所有操作必须是一个逻辑单元,要么全部执行,要么全部不
执行。

Consistency(一致性):数据库在事务执行前后状态都必须是稳定的或者是一致的。

Isolation(隔离性):事务之间不会相互影响。

由锁机制和MVCC机制来实现的

MVCC(多版本并发控制):优化读写性能(读不加锁、读写不冲突)

Durability(持久性):事务执行成功后必须全部写入磁盘。

image.png

Redo log Buffffer重做日志缓冲

image.png

重做日志: Redo Log 如果要存储数据则先存储数据的日志 , 一旦内存崩了 则可以从日志找

重做日志保证了数据的可靠性,InnoDB采用了Write Ahead Log(预写日志)策略,即当事务提交

时,先写重做日志,然后再择时将脏页写入磁盘。如果发生宕机导致数据丢失,就通过重做日志进行数

据恢复。

insert into xxxx

commit; Redo Log File 写成功 则Commit;

Redo Log : ib_logfifile0 ib_logfifile1 默认为8MB。 可通过配置参数 innodb_log_buffer_size 控制

Force Log at Commit机制实现事务的持久性,即当事务提交时,必须先将该事务的所有日志写入到重

做日志文件进行持久化,然后事务的提交操作完成才算完成。为了确保每次日志都写入到重做日志文

件,在每次将重做日志缓冲写入重做日志后,必须调用一次fsync操作(操作系统),将缓冲文件从文

件系统缓存中真正写入磁盘。

innodb_flflush_log_at_trx_commit (默认值为1)值可以为0,1,2 以下三种情况
0写到用户缓冲区 2写到系统缓冲区
image.png

Double Write双写

image.png

Double Write带给InnoDB存储引擎的是数据页的可靠性

如上图所示,Double Write由两部分组成,一部分是内存中的double write buffffer,大小为2MB,

另一部分是物理磁盘上共享表空间连续的128个页,大小也为2MB。在对缓冲池的脏页进行刷新时,并

不直接写磁盘,而是通过memcpy函数将脏页先复制到内存中的double write buffffer区域,之后通过

double write buffffer再分两次,每次1MB顺序地写入共享表空间的物理磁盘上,然后马上调用fsync函

数,同步磁盘,避免操作系统缓冲写带来的问题。在完成double write页的写入后,再讲double wirite

buffffer中的页写入各个表空间文件中。如果操作系统在将页写入磁盘的过程中发生了崩溃,在恢复过程

中,InnoDB存储引擎可以从共享表空间中的double write中找到该页的一个副本,将其复制到表空间

文件中,再应用重做日志。

FYI:

  1. 有个缓冲池 Buffer Pool
    数据在commit时候,先提交到 redo log file(重做日志) ,(预写机制),以便宕机后恢复, 然后redo log 写的时候有个可配参数innodb_flflush_log_at_trx_commit (默认为1,速度虽然慢但是安全性高,数据一灌到底) 配置重做日志的落盘机制。
  2. Buffer Pool中的数据 一旦走左侧 checkpoint那条线 落到文件系统表空间后,redo log中对应的数据就会清空(部分清空)。
  3. 左侧checkpoint 采用双写机制(写系统表空间,和用户表空间)
  4. 双写机制相当于是备份。双写后就是落盘了,然后清空redo log.
  5. binlog 主要用于主从, 和 异步读取数据。

详细可以参考:

https://blog.csdn.net/qq_35246620/article/details/79345359


标题:MySQL架构图(重做日志,以及落盘机制)
作者:码农路上
地址:http://wujingjian.club/articles/2021/04/02/1617350859646.html