Skip to content

1070124410/Database_Failure_Recovery

 
 

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

7 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Database_Failure_Recovery

  • 数据库故障恢复
  • 实现一个支持持久化的事务管理系统。
  • 主要解决的故障:发生系统故障时,事务已提交,但缓冲区的信息尚未完全写回磁盘。
  • 恢复策略:使用Redo log重做所有已提交的事务。正向扫描日志记录,使用日志记录中的新值恢复数据。

日志内容

长度(int)+ 数据类型(两个字节)+txID(long)+数据

  • 单条日志最大长度不超过 128 byte;
  • 0 - 3 以 int 类型记录本条日志的长度(不包括 int 数值本身长度);
  • 4 - 5 以两个 byte 记录本条日志的类型,解释如下:
类型名称 数据值 解释
事务开始标识日志记录 10 标志着事务的开始,存储了事务 ID,后继日志记录为该事件提交的数据(不一定已经持久化)
事务结束标识日志 11 标志着事务的结束, 存储了事务ID,后继日志记录为新的事件开始记录。同时也由此类标识记录判断是否能成为截断点
无后继日志记录的 key-value 记录日志 00 完整 key-value 的记录日志或者有一个分割 key-value 记录的最后一条日志
有后继日志记录的 key-value 记录日志 01 一个分割 key-value 记录日志
  • 6 - 13 为 key-value 日志记录的 key 值或开始/结束标识记录日志的 txID 即事务 ID;
  • 14 之后是 key-value 类型日志记录的 value 值,value 值不定长,由单条日志总长度减去其他类型字段长度可以求得,但由于每条记录限制在128 byte 以内,参考计算机网络报文传输数据分组的方式,对 value 进行分割记录。

性能改进

  • 影响性能因素:日志记录中存在大量日志数据,如果每次从头恢复耗时耗力
  • 解决方案:采用截断点的方式进行优化。截断点之前的数据能保证以事务为单位完成持久化。定期设置和更新截断点,每次故障恢复时从截断点开始恢复即可,能大大减少日志扫描恢复的事件消耗。

About

数据库故障恢复

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages

  • Java 99.5%
  • Other 0.5%