Rui (Rick) Xie bio photo

Rui (Rick) Xie

Rick @ RPI

Twitter Google Scholar LinkedIn Instagram Github

Tags: [ ]

Logging Schemes 日志管理策略

Crash Recovery

恢复的策略主要分两种:

  • transaction进行中保证DBMS能够从错误中恢复
  • 在错误发生之后去恢复DBMS的atomicity, consistency and durability

在恢复的算法中主要考虑:

  • UNDO: 移除未完成或者废除的transaction->The process of removing the effects of an incomplete or aborted transaction
  • REDO: re-instate已经commit的transaction->The process of re-instating the effects of a committed transaction for durability
  • 这里讲InnoDB的Dirty page和Redo Log

Failure Classification

Buffer Pool Management Policies

Steal Policy

是否允许一个uncommitted的tx将修改更新到磁盘

  • STEAL: 磁盘中可能出现uncommitted的数据,因此系统需要记录undo log,防止tx abort的时候进行rollback
  • NO-STEAL: 磁盘中不会存在uncommitted的数据,无需rollback,也无需记录undo log

Force Policy

tx在commit之后是否必须将所有更新立刻持久化到磁盘

Whether the DBMS ensures that all updates made by a transaction are reflected on nonvolatile storage before the transaction is allowed to commit.

  • FORCE: 容易导致磁盘发生很多写操作,更可能是随机写
    • 较为容易恢复,但是poor runtime performance
  • NO-FORCE: tx在commit之后可以不立即持久化到磁盘,可以缓存很多的batches,降低磁盘的操作次数,提升顺序写
    • 如果commit之后发生crash,那么此时已经commit的数据将会丢失,因此需要记录redo log,并且在系统重启前进行roll-forward的操作

其中一种比较简单的是NO-STEAL+FORCE

  • DBMS不会对aborted transaction进行undo changes,因为changes没有被写入到disk中
  • DBMS不会对已经commit的transaction进行redo changes,因为所有的changes都在commit的时候被写入到了disk中
  • 如果transaction需要修改的data does not fit on memory,那么tx不能execute,因为DBMS不允许在transaction commit之前写出dirty pages到disk中

Shadow Paging

NO-STEAL+FORCE

有两份database的副本:

  • Master: 只包含来自已提交事务的改变
  • Shadow: 一个临时的包含未提交事务的改变的database

事务只在shadow copy中进行更新,当一个事务提交时,会将shadow转换为新的master

shadow page直到修改完毕才被激活,保证了atomicity

Write-Ahead Logging

预写日志,保证数据操作的atomicity and durality

修改并不会直接写入数据库文件中,而是写入到另一个称为WAL的文件中。

如果事务失败,WAL中的记录会被忽略,撤销修改;如果事务成功过,它将在随后的某个事件被写回数据库文件中,提交修改。

STEAL+NO-FORCE

WAL has the fastest runtime performance, but recovery time is slower than shadow paging (replay the log)

  • 在页面本身被允许在非易失性存储中覆盖之前,与更新页面有关的所有日志记录都被写入非易失性存储->log records先写入
  • 在所有日志记录都写入数据库文件中之前,不会认为事务已提交
  • <BEGIN> & <COMMIT>
  • 每个log entry都包含有关于单个对象的更改信息
    • Transaction ID
    • Object ID
    • Before value (used for UNDO)
    • After value (used for REDO)
  • tx提交时将log entries写入disk,可以使用group commit将多个log一起批处理

Checkpoints

log file会越来越大,如果crash发生,DBMS需要重启整个log

checkpoints可以同步WAL文件和数据库文件,一般在WAL文件积累到一定页数修改的时候,或者可以手动执行checkpoints

  • DBMS会停止接收新的事务,并且会等到所有active事务运行完毕
  • 将memory里的log records和dirty blocks都刷到数据库文件中
  • 在log最后 <CHECKPOINT>,并且写入数据库文件

Logging Schemes

  • Physical Logging
  • Logical Logging
  • Physiological Logging