innodb存储引擎 初探InnoDB存储引擎的架构设计
前言
InnoDB组件结构:
缓冲池:缓冲池,用于缓存磁盘数据
重做日志缓冲区:记录缓冲池的操作,按照策略写入磁盘,防止宕机,但事务已经提交,数据丢失
撤销日志:修改缓冲池数据时,可以在事务未提交时回滚,将旧值写入撤销日志文件,方便回滚。此时缓冲池的数据与磁盘中的数据不一致,属于脏数据。
1.缓冲池
假设您现在有一个update语句:
updateuserssetname = ' lisi '其中id=1
需要更新到数据库,InnoDB会执行哪些操作?
首先InnoDB会判断缓冲池中是否存在id = 1的数据。如果它不存在,它将从磁盘加载到缓冲池中,并且它还将对此数据设置排他锁,以防止多个sql同时修改此数据。
2.撤消日志文件
假设id=1的原始值是name = '樟山',现在我们需要将其更新为name = 'lisi ',那么我们需要将name = '樟山'和id = 1的旧值写入撤销日志文件。
熟悉数据库的学生知道事务的概念。在事务提交之前,所有操作都可能回滚,也就是说,name = 'lisi '可以回滚到name = 'zhangsan ',所以在更新到撤销日志文件之前,先写下这些值。
3.更新缓冲池数据
写完撤消日志文件后,它开始更新内存中的数据。将id = 1的name = 'zhangsan '更新为name = 'lisi '。此时,内存中的数据已经更新,但磁盘上的数据没有变化。这时,出现不一致的脏数据。
这时可能会出现一个问题,如果事务提交完成,但是Mysql服务宕机,内存中的数据还没有写入磁盘,会不会造成数据丢失,导致sql执行数据不一致?
4.重做日志缓冲区
此时重做日志缓冲区只存在于内存中,无法实现MySQL宕机后的数据恢复。
5.如果不提交事务,停机后会影响数据库吗?
其实没关系。交易未提交,表示执行不成功。即使MySQL崩溃或宕机后,内存中缓冲池和重做日志缓冲区修改的数据也会丢失,不影响数据前后的一致性。如果事务提交失败,数据库中的数据将不会改变。
6.提交事务、重做日志配置策略
提交事务时,重做日志将根据策略实施将重做日志从重做日志缓冲区写入磁盘。策略由innoDB_flush_log_at_trx_commit配置。
innoDB_flush_log_at_trx_commit的参数为0,即使提交了事务,重做日志也不会写入磁盘。当MySQL宕机时,内存中的数据将会丢失。
innoDB_flush_log_at_trx_commit的参数为1。提交事务后,重做日志将从内存刷新到磁盘。只要事务成功提交,重做日志将不可避免地存在于磁盘中。
此时,即使缓冲池的数据没有刷进磁盘,也可以从重做日志中知道哪些数据被修改了。MySQL关闭并重启后,可以从重做日志中恢复修改后的数据。
innoDB_flush_log_at_trx_commit的参数是2。事务提交后,重做日志只保留在os缓存中,但没有刷到磁盘中,以防此时服务关闭。那么os缓存中的数据就会丢失,即使事务提交成功,也会造成数据丢失。
看完这些,我相信为了保证数据安全,参数1是最好的策略。
7.事务的最终提交
Binlog实际上是一个属于MySQL Server的日志文件,之所以在这里提出来,是因为它和重做日志关系密切。
1)大日志和重做日志的区别
重做日志:它记录具有部分物理属性的重做日志,如“哪个数据页的哪些记录被修改了”
Binlog:倾向于逻辑的日志,例如:“用户表中id=10的一行数据已经更新。更新后的值是多少?”
2)提交交易时同时写binlog
在执行更新的同时,innoDB始终与执行器交互,包括将数据加载到缓冲池、写入撤销日志文件、更新内存数据、写入重做日志和刷盘等。对binlog的写入也由执行器执行。
其中,步骤1、2、3和4用于执行更新语句,而步骤5和6用于提交事务。
3)日志刷取策略分析
sync_binlog参数控制binlog的刷牙策略
sync_ binlog的默认值为0。事务提交后,binlog日志将存储在os缓存中,在MySQL宕机后,os缓存中的数据将丢失
sync_binlog的值为1。提交事务后,binlog日志会直接刷到磁盘上。
4)基于binlog和重做日志提交事务
binlog写入磁盘后,binlog文件的位置和文件名将写入重做日志文件,并且提交标志将写入重做日志文件。
5)提交标记的意义是什么?
提交标记意味着保持重做日志和binlog日志一致。如果在步骤5或步骤6中,事务提交开始,MySQL关闭,重做日志中没有提交标记,则事务提交失败。
这意味着commint标志着交易最终提交成功。
8.缓冲池脏数据被刷入磁盘
后台IO线程会将脏数据随机刷入磁盘。
这时,考虑一下,如果MySQL在刷入磁盘之前就宕机了怎么办?此时,事务已经成功提交,重做日志中有一个提交标记。即使宕机,重启后数据也会根据重做日志文件更新到内存中,等待IO线程刷盘。
9.摘要
通过update语句分析后,我们知道InnoDB存储引擎包含缓冲池、重做日志缓冲区等缓存数据,撤销、reod日志等日志文件,以及MySQL Server日志文件。
执行update语句时,会修改缓冲池、写撤销日志文件、写重做日志缓冲区等操作;提交事务时,刷重做日志和binlog,写binlog文件的名称和位置,写提交标记。最后,我会等待IO线程随机刷缓冲池的脏数据。