一.日志记录缓冲
对于用于保证数据库一致性的最低底线日志来说,最安全的做法就是,每产生一条日志记录就将其写入稳定存储器。但是这样做的结果是增加了大量系统执行开销和I/O操作,并且,向稳定存储器的输出都是以块为单位的,日志记录大小要比块大小小得多,这样就更加增加了物理操作。
事实是,即使是将一个块输出到磁盘上的代价也是不容小觑的,所以,最好是一次输出多个日志记录,甚至是多个块;为了达到这个目的,在实际生产中,我们将日志记录先写到主存中临时开辟的日志缓冲区中,然后按照一定的写入规则,再用一次输出操作输出到磁盘上。
这样就产生一个问题,当日志记录在缓冲区存储的时候,这样的数据是易失的,一旦发生故障,这些日志记录将没办法再反映数据库的操作情况;所以,对日志记录从缓冲区写入磁盘和数据写入磁盘之间顺序要做一下要求:
①在日志记录【Ti
commit】写入磁盘之后,才允许事务Ti进入提交状态(写入磁盘);
②在日志记录【Ti
commit】写入磁盘之前,要保证commit之前的日志记录已经写入磁盘;
③主存中的数据块写入磁盘之前,所有与该数据块相关的日志记录必须已写入磁盘;
这样的规则称为先写日志(write-ahead logging)规则。
我们稍加思考就会发现,提前将日志记录写入磁盘是没有什么不良影响的,因此,当系统发现需要将日志记录输出时,如果主存中有足够的日志记录可以填满一个块就将其整个输出;如果不足以填满整个块,就将其写入半满的块,然后写入磁盘;
将缓冲的日志写入磁盘有时称为日至强制(log force);
二.数据库缓冲
在学习操作系统时我们知道,OS在管理主存时采取虚拟存储技术,也就是说,数据库在主存中暂存的数据或者缓冲区都面临块换入&换出操作。
这样,输出日志记录的规则就限制了系统输出数据块的自由。如果块2的输入似的必须输出
对于用于保证数据库一致性的最低底线日志来说,最安全的做法就是,每产生一条日志记录就将其写入稳定存储器。但是这样做的结果是增加了大量系统执行开销和I/O操作,并且,向稳定存储器的输出都是以块为单位的,日志记录大小要比块大小小得多,这样就更加增加了物理操作。
事实是,即使是将一个块输出到磁盘上的代价也是不容小觑的,所以,最好是一次输出多个日志记录,甚至是多个块;为了达到这个目的,在实际生产中,我们将日志记录先写到主存中临时开辟的日志缓冲区中,然后按照一定的写入规则,再用一次输出操作输出到磁盘上。
这样就产生一个问题,当日志记录在缓冲区存储的时候,这样的数据是易失的,一旦发生故障,这些日志记录将没办法再反映数据库的操作情况;所以,对日志记录从缓冲区写入磁盘和数据写入磁盘之间顺序要做一下要求:
这样的规则称为先写日志(write-ahead logging)规则。
我们稍加思考就会发现,提前将日志记录写入磁盘是没有什么不良影响的,因此,当系统发现需要将日志记录输出时,如果主存中有足够的日志记录可以填满一个块就将其整个输出;如果不足以填满整个块,就将其写入半满的块,然后写入磁盘;
将缓冲的日志写入磁盘有时称为日至强制(log force);
二.数据库缓冲
在学习操作系统时我们知道,OS在管理主存时采取虚拟存储技术,也就是说,数据库在主存中暂存的数据或者缓冲区都面临块换入&换出操作。
这样,输出日志记录的规则就限制了系统输出数据块的自由。如果块2的输入似的必须输出
