数据库 redo日志

持久性

磁盘上的页缓存到内存中的Buffer Pool之后才可以访问,在内存中的Buffer Pool中对数据进行的修改,需要写回到磁盘中,才能保证数据的持久性

把事务所修改的所有页面都刷新到磁盘,存在问题:

  1. 修改很少的数据,却要把整个页面刷新回磁盘,太浪费
  2. 修改的页面不相邻,需要随机IO,随机IO很慢

对修改的数据,记录在 redo日志中,将redo 日志写回磁盘

  1. redo 日志占用内存小
  2. redo 日志 是顺序IO,因为redo日志是按照日志生成顺序记录的

redo 日志 结构

数据库 redo日志

  1. 物理日志

redo日志中只需要记录一下在某个页面的某个偏移量处修改了几个字节的值,具体被修改的内容是什么
修改页面中一条记录,会引起多处修改,redo日志会很大

把一条记录插入到一个页面时需要更改的地方非常多。如果使用简单的物理redo日志来记录这些修改时,可以有两种解决方案:

    1. 在每个修改的地方都记录一条redo日志
      缺点:被修改的地方太多了,可能记录的redo日志占用的空间都比整个页面占用的空间都多了
    1. 将整个页面的第一个被修改的字节到最后一个修改的字节之间所有的数据当成是一条物理redo日志中的具体数据
      缺点:第一个被修改的字节到最后一个修改的字节之间仍然有许多没有修改过的数据,我们把这些没有修改的数据也加入到redo日志中去岂不是太浪费了
  1. 更多类型日志

以组的形式写日志(组内的一系列日志,要么全写,要么全部写,需要满足原子操作)
数据库 redo日志

redo 日志写入

把用来存储redo日志的页称为block,(redo log block)。
数据库 redo日志

redo 日志缓存区

磁盘存取速度慢,写入redo日志时也不能直接直接写到磁盘上,在服务器启动时就向操作系统申请了一大片称之为redo log buffer的连续内存空间,就是redo日志缓冲区,这片内存空间被划分成若干个连续的redo log block
数据库 redo日志