目录
一、问题描述
1、存在的问题
- 一、问题描述
- 1、存在的问题
- 2、解决方案一
- 3、解决方案二
- 二、redo 日志
- 如果我们只在内存的Buffer Pool中修改了页面,假设在事务提交后突然发生了某个故障,导致内存中的数据都失效了,那么这个已经提交的事务在数据库中所做的更改也就丢失了。针对这种问题,怎么处理呢?
1、方案一
- 在事务提交时,把该事务修改的所有页面都刷新到磁盘。
2、方案一的缺点
- 刷新一个完整的数据页浪费内存。虽然我们只修改了一条记录,但是会将这条记录所在的页(16KB)都刷新到磁盘上,会造成大量磁盘I/O的浪费。
- 随机I/O刷新起来比较慢。一个事务可能包含很多语句,即使是一条语句也可能修改许多页面,并且该事务修改的这些页面可能并不相邻。着就意味着将某个事务修改的Buffer Pool中的页面刷新到磁盘时,需要进行很多的随机I/O。而随机I/O要比顺序I/O慢,尤其是机械硬盘。
1、方案二
- 在事务提交时,只需要把修改的内容记录一下。 例如:将第1号表空间第10号页面中偏移量为100处的值更新为2。
1、redo 日志的定义
- 因为在系统因崩溃而重启时需要按照上述内容所记录的步骤重新更新数据页,所以上述内容也成为重做日志(redo log)。
2、redo 日志的优点
- redo日志占用的空间非常小;
- redo日志是顺序写入磁盘的;(在执行事务的过程中,每执行一条语句,就可能产生若干条redo日志,这些日志是按照产生的顺序写入磁盘的,也就是使用顺序I/O。)