第十章 数据库恢复技术

一、事务

定义

数据操作序列,不可分割的工作单位,恢复和并发的基本单位。

ACID特性

原子性

一致性

隔离性

持续性

二、数据库恢复概述

就是从错误的状态恢复到某一已知的正确状态。

三、故障的种类

事务内部的故障

非预期的故障:运算溢出、并发事务发生死锁、违反了某些完整性限制。

恢复:撤销事务。

系统故障

类型(软故障):

特定类型的硬件错误、操作系统故障、DBMS代码错误、系统断电

恢复:

故障时事务未提交:强行撤销所有未完成事务

故障时事务已提交但缓冲区信息尚未完全写回到磁盘上:重做所有已提交事务。

介质故障

硬故障

磁盘损坏、磁头碰撞、强磁场干扰

恢复

装入故障前的数据副本、重做自此始时的所有成功事务。

计算机病毒

四、恢复的实现技术

基本原理:冗余

利用存储在系统其他地方的冗余数据来重建数据库中已被破坏的数据。

如何建立冗余数据

数据转储

DBA将整个数据库复制到磁带或磁盘保存起来作为备用数据,当数据库遭到破坏时将备用数据重新装入。这个过程很耗时。

静态转储

条件:

1)无事务运行;

2)处于一致性状态;

3)转储期间不能存取修改;

4)优点:实现简单,能够保证一致性;缺点:降低可数据库的可用性。

动态存储

能够与用户事务并发进行、期间允许存取和修改。

优点:不用等待事务结束,不会影响新事务运行;

缺点:不能保证副本的数据正确有效。 只有通过后备副本加上日志文件才能恢复到某一时刻正确状态。

海量转储

每次转储全部数据库。

增量转储

只转储上次转储后更新过的数据。

日志文件

记录事务对数据库的更新操作的文件。

格式:记录为单位的日志文件;数据块为单位的日志文件。

当Tf发生故障时,通过将Tb时刻的后备副本装入数据库,然后根据日志文件中的内容重新执行Tb到Tf的事务来恢复数据库。

登记日志文件

必须先写日志文件,后写数据库操作。

恢复策略

事务故障的恢复

由子系统利用日志文件撤销事务。由系统自动完成,对用户透明,不需要用户干预。

过程:反向扫描日志文件,找到该事务后,执行逆操作。如原事务是插入,则逆操作是删除,原事务是删除,逆操作是插入。直到读到该事务的开始标记。

系统故障的恢复

正向扫描日志文件,也是由系统重新启动时自动完成,不需要用户参与。

重做队列:故障发生前已经提交的事务,既有begin,也有commit。 正向扫描日志文件,执行REDO操作。

撤销队列:故障发生时尚未提交的事务,只有begin,没有commit。 反向扫描日志文件,执行UNDO操作。

介质故障的恢复

重装数据库,重做已完成的事务。这个需要DBA的介入。

将后备数据装入数据库,先恢复到一致状态,再利用日志文件按照恢复系统故障的方法进行重做(REDO)和撤销(UNDO)操作。

具有检查点的恢复技术

从检查点开始,遇到一个新开始的事务先将它放到UNDO队列,若遇到已提交事务的则转入REDO队列,最后对UNDO队列执行撤销操作,对REDO队列执行重做操作。

数据库镜像

预防介质故障,DBMS自动将整个数据库或其中的关键数据复制到另一个磁盘上,且自动保证镜像和主数据库的一致性。

出现介质故障时可由镜像磁盘提供使用,DBMS并利用镜像进行自动恢复。

相关推荐
德彪稳坐倒骑驴16 分钟前
SQL连续登录问题
服务器·数据库·sql
葡萄城技术团队16 分钟前
告别臃肿 SQL:HR 系统如何实现“字段级”权限控制与动态脱敏方案?
数据库·sql
SQL必知必会31 分钟前
SQL HAVING 是什么?一篇讲清 WHERE 和 HAVING 的区别
数据库·sql
weixin_5689960632 分钟前
c++如何实现日志文件的异步落盘功能_基于无锁队列方案【附代码】
jvm·数据库·python
tongyiixiaohuang43 分钟前
技术案例分享:金蝶云星空客户数据同步到MySQL的实现
android·数据库·mysql
淘矿人1 小时前
2026年4月-DeepSeek V4 vs GPT-5.5深度对比测评:weelinking一键切换实测
服务器·数据库·人工智能·python·gpt·学习·php
2401_831419441 小时前
CSS 悬停箭头闪烁下移问题的根源与稳定解决方案
jvm·数据库·python
reasonsummer1 小时前
【教学类-160-11】20260419 AI视频培训-练习011“豆包AI视频《佛源植语》+豆包图片风格:无(关键词:藏传唐卡)”
数据库·音视频·豆包
瀚高PG实验室2 小时前
pgroonga全文检索插件的BUG
数据库·postgresql·bug·瀚高数据库
Rick19932 小时前
mysql 慢查询如何快速定位
数据库·mysql