存储引擎写入操作

1. 数据写入

  • 第一步,首先在数据更新操作的时候,记录旧数据到UndoLog日志文件中,用于提供回滚操作

    如执行一条删除语句:
    DELETE FROM user WHERE id = 1;
    则undo log会记录一条对应的额insert语句(反向操作的语句)保证事务回滚时,还原回去
    
  • 第二步,将需要更新/写入的数据写入到Buffer Pool中,并且InnoDB会让IO线程在特定的时机从内存中将需要更新写入的数据读出来,同时写入磁盘

  • 第三步,在这个过程中通过调用操作系统的openwrite函数执行,如下图

    InnoDB在调用open函数时候使用(O DIRECT)方式,从而跳过内核提供的缓存Page cache,直接用了自己的缓存机制

2. Redo Log体系

当数据存储在Buffer Pool中时,是无法避免一些特殊情况的,如果发生断电,则会导致丢失内存中的数据,因此我们需要一种新的功能,能够在发生内存崩溃时候保存下来在内存中的数据,Redo Log体系从而诞生。

当数据存储在Buffer Pool中时,会将更新/写入信息放入内存的另一个区域Redo Log Buffer中

除此之外,除了将数据储存在Redo Log Buffer中之外,还需要刷盘到Redo Log中

-- Redo log刷盘策略
SHOW VARIABLES LIKE 'innodb_flush_log_at_trx_commit';

SET GLOBAL innodb_fluch_log_at_trx_commit=1
  • 操作值=1,将更新写入信息写入内存Redo Log Buffer中,与此同时添加到操作系统的内存中,并且立刻进行刷盘

  • 操作值=0中,会先写入到Redo Log Buffer中,每隔一秒种进行系统内存放入和刷盘

  • 操作值=2,会写入Redo Log Buffer 和操作系统内存。但也会等待每秒的刷盘操作

操作完成后,当系统出现断电情况,Buffer Pool中还没来得及写入磁盘的数据丢失,由于Redo日志会把数据更新写入的信息都记录下来,在系统重启后会优先从Redo log中回复数据,保证了数据的完整性。---注:InnoDB在读取或者写入数据时,每次都会通过“页”结构来传递,后续会讲解。

3. BinLog日志

因为写入的操作都是在InnoDB内部进行的,因此程序猿们并不能直接进行使用,如执行错了一些语句,是没有办法回复如初的,因此有了一个Bin Log日志

Bin Log日志与InnoDB没有关系,处于InnoDB之外,包含了

  • 变更历史查询
  • 数据库备份和回复
  • 主从赋值

在Redo日志写入的同时进行Bin Log刷盘操作,刷盘成功后,会告知Redo日志事务”已提交“这个信息,Redo日志也会打入commit标记

最终,一次数据写入的流程完成

posted @ 2023-02-28 15:25  Lachlan_Yang  阅读(27)  评论(0编辑  收藏  举报