与任何其他计算机系统一样,数据库系统也会出现故障,但存储在其中的数据必须在需要时可用。当数据库出现故障时,它必须具备快速恢复的功能。它还必须具有原子性,即要么事务成功完成并提交(效果永久记录在数据库中),要么事务对数据库没有影响。
两者都有自动和非自动方式,备份数据和从任何故障情况中恢复。用于恢复由于系统崩溃、事务错误、病毒、灾难性故障、不正确的命令执行等而丢失的数据的技术是数据库恢复技术。因此可以使用基于延迟更新和立即更新或备份数据的防止数据丢失的恢复技术。
恢复技术在很大程度上依赖于一个称为系统日志的特殊文件的存在。它包含开始和每一笔交易的结束,发生在交易的任何更新的信息。日志会跟踪影响数据库项目值的所有事务操作。从事务失败中恢复需要此信息。
- 日志保存在磁盘 start_transaction(T):该日志条目记录事务 T 开始执行。
- read_item(T, X):这个日志条目记录了事务 T 读取了数据库项 X 的值。
- write_item(T, X, old_value, new_value):该日志条目记录了事务 T 将数据库项 X 的值从 old_value 更改为 new_value。旧值有时称为 X 的前像,而新值称为 X 的后像。
- commit(T):该日志条目记录事务T已成功完成对数据库的所有访问,其效果可以提交(永久记录)到数据库中。
- abort(T):记录事务 T 已中止。
- 检查点:检查点是一种机制,将所有以前的日志从系统中删除并永久存储在存储磁盘中。检查点声明了一个点,在该点之前 DBMS 处于一致状态,并且所有事务都已提交。
当事务 T 访问数据库的所有操作都已成功执行时,事务 T 到达其提交点,即事务已到达不会中止(未完成而终止)的点。提交后,事务将永久记录在数据库中。提交总是涉及将提交条目写入日志并将日志写入磁盘。在系统崩溃时,在日志中搜索所有已将 start_transaction(T) 条目写入日志但尚未写入 commit(T) 条目的事务 T 的条目;在恢复过程中,这些事务可能必须回滚以撤消它们对数据库的影响
- 撤销——如果一个事务崩溃,那么恢复管理器可以撤销事务,即撤销事务的操作。这涉及检查日志条目 write_item(T, x, old_value, new_value) 的事务并将数据库中项 x 的值设置为旧值。从非灾难性事务失败中恢复有两种主要技术:延迟更新和即时更新。
- 延迟更新——在事务到达其提交点之前,此技术不会物理更新磁盘上的数据库。在到达提交之前,所有事务更新都记录在本地事务工作区中。如果事务在到达其提交点之前失败,则它不会以任何方式更改数据库,因此不需要 UNDO。可能需要重做记录在本地事务工作区中的操作的效果,因为它们的效果可能尚未写入数据库。因此,延迟更新也称为No-undo/redo 算法
- 立即更新 –在立即更新中,数据库可能会在事务到达其提交点之前被事务的某些操作更新。但是,这些操作在应用到数据库之前会记录在磁盘上的日志中,因此仍然可以进行恢复。如果事务未能到达其提交点,则必须撤消其操作的影响,即必须回滚事务,因此我们需要撤消和重做。这种技术被称为撤销/重做算法。
- 缓存/缓冲——在这种情况下,包含要更新的数据项的一个或多个磁盘页面被缓存到主内存缓冲区中,然后在写回磁盘之前在内存中更新。一组称为 DBMS 缓存的内存缓冲区由 DBMS 控制以保存这些缓冲区。目录用于跟踪缓冲区中的数据库项。一个脏位与每个缓冲区相关联,如果缓冲区未被修改则为 0,否则为 1 如果已修改。
- 影子分页——它提供了原子性和持久性。构建了一个具有 n 个条目的目录,其中第 i 个条目指向链接上的第 i 个数据库页面。当事务开始执行时,当前目录被复制到影子目录中。当要修改页面时,会分配一个影子页面,在其中进行更改,当它准备好成为持久页面时,所有引用原始页面的页面都会更新以引用新的替换页面。
一些备份技术如下:
- 全数据库备份——在这个包括数据和数据库在内的全数据库中,恢复整个数据库所需的元信息,包括全文目录,都按照预定义的时间序列进行备份。
- 差异备份 –它仅存储自上次完整数据库备份以来发生的数据更改。如果自上次完整数据库备份以来相同数据已更改多次,差异备份将存储更改数据的最新版本。首先,我们需要恢复完整的数据库备份。
- 事务日志备份——在这种情况下,数据库中发生的所有事件,例如执行的每条语句的记录都被备份。它是事务日志条目的备份,包含发生在数据库中的所有事务。通过这种方式,可以将数据库恢复到特定的时间点。如果数据文件被破坏,甚至一个提交的事务没有丢失,甚至可以从事务日志执行备份。
参考 –
备份和恢复 – cs.uct.ac.za/mit_notes