CMU15445 Lecture 20 Logging Schemes
Crash Recovery
recovery algorithm 需要做两件事情:
- txn 正常执行时的额外工作,以保证DBMS能够recover from failure
- failure之后的recover action,以此来保证原子性,一致性,可持久性
Failure Classification
dram每个2ms要刷新一次防止数据丢失 而sram是静态的 不需要刷新 效率必须高。SRAM——“Static RAM(静态随机存储器)”的简称,所谓“静态”,是指这种存储器只要保持通电,里面储存的数据就可以恒常保持。
存储器分级
TRANSACTION FAILURES
SYSTEM FAILURES
STORAGE MEDIA FAILURE
磁盘本身坏了,难以处理,一般只有备份才行
DBMS为了性能需要先把page放在buffer pool,另外,DBMS需要保证committed的数据是durable,也需要保证aborted的txn不是durable,这其中的存在着性能与安全的权衡。一般有两种操作去实现txn的安全性
Buffer Pool Management Policies
steal and no-steal
steal police表明可以把uncommited的数据刷入disk
force and no-force
force police决定在commit的时候强制将updates made by a txn刷到disk上
no-steal and force
既不需要redo 也不需要undo
但是需要大量的使用memeory
Shadow Paging
Shadow Paging使用了no-steal and force做法,但有些不同,undo的时候需要清理shadow page
每次update shadow page都需要去将该page写入磁盘
disadvantage
copy paths是啥?修改内存中的Database root和磁盘中的database root,修改其中导向leaf node的path
non-contiguous?每次upate shadow page时会随机write
Write-Ahead Logging
采取steal + no-force方案
维持log文件,write ahead log表示在真正的把update的数据刷到disk之前,先写log
一般而言,buffer pool中会有特定的区域来存放log
必须保证在commit的时候,所有的log都被刷到disk中。
DBMS会在log中分别在txn开始和完成时,写上
log information包含了:
wal实际操作中是一同修改wal buffer与update page
implementation
使用group commit去优化log的batch flushes,也就是txn需要commit的时候,使其“卡住”,等到多个txn可以commit的时候一起flush到disk
Logging Schemes
log record的内容可以是
Physical Logging
MySQL把undo log与redo log分开。单独的undo log可以用于回退数据的上一个版本,实现mvcc的delta page,当然还可以用来实现undo操作
记录实际变化
缺点是数据量可能会很大
Logical Logging
记录SQL语句
如果SQL中包含时间函数,可能再次执行SQL时会出错;如果有limit谓词,那么再次执行SQL的结果可能会不一致;在数据库备份的时候,备份数据库可能不存在主库中的索引,那么SQL再次执行的时候会出错?
Physiological Logging:
MySQL一般用的这个
还是基于Physical Logging,但是不同之处是log的specific location记录的是slot number?
其他
mixed logging,分析SQL的内容是否会重现出错,如果不会就记录SQL queries
checkpoints
注意,checkpoint之前commit的txn一定会被刷到disk
checkpoint可以优化 steal and no-force的recover所花费的时间。
log file如果过大,那么recover的时间就很长,checkpoints用于记录已经被flush到磁盘的内存数据,checkpoint之前的update已经全部写到disk了
challenges
- 做checkpoint的时候需要花费时间,txn这时候会卡住?这个chckpoint是指花费时间是指讲这个checkpoint写到disk会费时间吗
- 在recover的时候,需要去扫描判断,找到checkpoint之前没有commit的txn需要耗费时间
- 多久做一次checkpoint的记录呢?
- checkpoint记录过于频繁,性能损耗严重
- checkpoint记录时间间隔大,recover时间长
Blocking Checkpoint Implementation:
这种checkpoint的实现,在recover时,不需要扫描checkpoint之前未commit的txn