1-InnoDB存储引擎的架构设计
2022-01-02 21:03:25 4 举报
InnoDB存储引擎是MySQL数据库中最常用的存储引擎之一,它采用了多线程、分布式架构设计。在InnoDB中,数据被分成多个页(Page),每个页的大小为16KB。每个表有且仅有一个聚簇索引,即按照主键顺序排列的B+树。InnoDB通过使用MVCC(多版本并发控制)机制来提高并发性能,支持事务和锁定机制,保证数据的一致性和完整性。此外,InnoDB还提供了行级锁、外键约束、崩溃恢复等功能,使得它在处理大量数据时具有很高的效率和可靠性。总之,InnoDB存储引擎的架构设计使其成为MySQL数据库中最受欢迎的存储引擎之一。
作者其他创作
大纲/内容
InnoDB存储引擎
Redo Log Buffer
2.写数据的旧值,便于数据回滚
undo日志文件
4.写redo log
5.redo日志刷到磁盘
binlog文件
磁盘文件
1.缓存数据
redo日志文件
redo日志记录对哪条数据做了什么修改name=xxx。系统崩溃重启后可以根据这个日志恢复
修改后的数据name=xxx
3.更新内存中的数据
缓存数据
7.写binlog文件位置,commit标记
Buffer Pool缓冲池
内存中更新后的脏数据xxx
磁盘数据为zhangsan
修改前的数据name=zhangsan
最后一步在redo日志中写入commit标记的意义是什么?其实是用来保持redo log日志与binlog日志一致的。假设我们在提交事务的时候,一共有上图中的5、6、7三个步骤,必须是三个步骤都执行完毕,才算是提交了事物。那么在我们刚完成步骤5的时候,也就是redo log刚刷入磁盘文件的时候,MySQL宕机了,此时怎么办?这个时候因为没有最终的事物commit标记在redo日志里,所以此次事物可以判定为不成功。不会说redo日志文件里有这次更新的日志,但是binlog日志文件里没有这次更新到日志,不会出现数据不一致的问题。如果要是完成步骤6的时候,也就是binlog写入磁盘了,此时MySQL宕机了,怎么办?同理,因为没有redo log中的最终commit标记,因此此时事物提交也是失败的。必须是在redo log中写入最终的事物commit标记了,然后此时事物提交成功,而且redo log里有本次更新对应的日志,binlog里也有本次更新对应的日志,redo log和binlog完成是一致的。
update users set name = 'xxx' where id = 1;
脏数据
执行器
redo日志刷到磁盘策略配置:innodb_flush_log_at_trx_commit=【0,1,2】三种值: innodb_flush_log_at_trx_commit = 0 :每秒将日志缓冲区写入log file,并同时flush到磁盘。跟事务提交无关。在机器crash并重启后,会丢失一秒的事务日志数据(并不一定是1s,也许会有延迟,跟操作系统调度有关)。 innodb_flush_log_at_trx_commit = 1:每次事务提交将日志缓冲区写入log file,并同时flush到磁盘。(crash不会丢失事务日志)(默认值) innodb_flush_log_at_trx_commit = 2:每次事务提交将日志缓冲区写入机器内存log file,每秒flush一次到磁盘。(机器crash有可能丢失数据)
问题:系统突然崩溃,buffer pool更新的数据和redo log buffer中的日志都会丢失?会丢失,但没影响。因为更新语句,没提交事物,就代表你没执行成功,此时MySQL宕机虽然导致内存里的数据都丢失了,但是你会发现,磁盘上的数据依然还停留在原先的样子。
8.刷磁盘
redo log,他是一种偏向物理性质的重做日志,因为他里面记录的是类似这样的东西,“对哪个数据页中的什么记录,做了个什么修改”,本身是属于InnoDB存储引擎特有的一个东西。binlog叫做归档日志,他里面记录的是偏向于逻辑性的日志,类似于“对users表中的id=10的一行数据做了更新操作,更新以后的值是什么”,binlog不是InnoDB存储引擎特有的日志文件,是属于MySQL Server自己的日志文件。
有一个sync_binlog参数可以控制binlog的刷盘策略,默认值是0,此时你把binlog写入磁盘的时候,其实不是直接进入磁盘文件,而是进入os cache内存缓存。如果此时机器宕机,那么你在os cache里的binlog日志是会丢失的。sync_binlog参数设置为1的话,那么此时会强制在提交事物的时候,把binlog直接写入到磁盘文件里去,那么这样提交事物之后,哪怕机器宕机,磁盘上的binlog是不会丢失的
内存数据与磁盘数据不一致,造成脏数据
6.准备提交事务binlog刷入磁盘
写数据的旧值,便于数据回滚
把本次更新对应的binlog文件名称和这次更新的binlog日志在文件里的位置,都写入到redo log日志文件里去,同时在redo log日志文件里写入一个commit标记。
磁盘中数据还是zhangshan
redolog和binlog均记录修改日志name=xxx
随机刷盘
记录下来你对数据做了什么修改
内存数据为xx
更新时加行的独占锁
IO线程
InnoDB存储引擎主要就是包含了一些buffer pool、redo log buffer等内存里的缓存数据,同时还包含了一些undo日志文件,redo日志文件等东西,同时MySQL Server自己还有binlog日志文件。在执行更新的时候,每条SQL语句,都会对应修改buffer pool里的缓存数据、写undo日志、写redo log buffer几个步骤。但是当你提交事务的时候,一定会把redo log刷入磁盘,完成redo log中的事物commit标记;最后后台的IO线程会随机的把buffer pool里的脏数据刷入磁盘里去。
0 条评论
下一页