Alex_McAvoy

想要成为渔夫的猎手

数据库系统的故障种类

【事务内部故障】

事务故障意味着事务没有达到预期的终点 COMMITROLLBACK,因此,数据库可能处于不正确状态

恢复程序要在不影响其他事务运行的情况下,强行回滚该事务,即撤销该事务已作出的任何对数据库的修改,使得该事务好像没有启动,这类恢复操作被称为事务撤销 UNDO 操作

事务内部故障有些可以通过事务程序本身发现

例如,银行转账事务,该事务将一笔金额从一个账户甲转给另一个账户乙

该例中,若产生账户甲余额不足的情况,应用程序可以发现并让事务回滚,撤销已做的修改,恢复数据库到正常状态

1
2
3
4
5
6
7
8
9
10
11
12
13
14
BEGIN TRANSACTION
读账户甲的余额 BALANCE;
BALANCE = BALANCE - AMOUNT; /*AMOUNT为转账金额*/
写回 BALANCE;
IF (BALANCE < 0 ) THEN {
打印 '金额不足,不能转账'; /*事务内部可能造成事务回滚*/
ROLLBACK; /*撤销刚才的修改,恢复事务*/
}
ELSE {
读账户乙的余额 BALANCE1;
BALANCE1 = BALANCE1 + AMOUNT;
写回BALANCE1;
COMMIT;
}

而事务内部故障更多的是非预期的,不能由事务程序处理,例如:运算溢出、并发事务出现死锁、违反某些完整性限制而被终止等

【系统故障】

系统故障又被称为软故障,是指造成系统停止运转的任何事件,使得系统要重新启动

例如,特定的硬件错误、操作系统错误、DBMS 代码错误、系统断电等,这类故障影响所有正在运行的事务,但不会破坏数据库

发生系统故障时,一些尚未完成的事务的结果可能已被送入物理数据库,从而可能造成数据库处于不正确状态,为保证数据的一致性,恢复子系统需要清除这些事务对数据库的所有修改,即进行事务撤销 UNDO 操作

另一方面,发生系统故障时,有些已完成的事务可能一部分甚至全部留在缓冲区,尚未写回物理数据库中,此时,在系统重启后,恢复子系统除了进行事务撤销 UNDO 操作外,还需要进行重做 REDO 所有已提交的事务,将数据库恢复到真正一致状态

【介质故障】

介质故障又被称为硬故障,是指外存故障,该类故障发生的概率较小,但破坏力极强,这类故障将破坏部分或全部数据库的数据,并影响正在存取这部分数据的全部事务

对于该类故障,恢复的方法是装入数据库发生介质故障前某个时刻的数据副本,并重做 REDO 自此时始的所有成功事务,将这些事务已提交的结果重新记入数据库

常见的介质故障有:磁盘损坏、磁头碰撞、操作系统的某种潜在错误、瞬时强磁场干扰等

【计算机病毒】

计算机病毒是一种可以繁殖和传播的人为的故障或破坏,是由一些恶作剧者研制的一种计算机程序

计算机病毒不仅会破坏、盗窃系统中的数据,有时还会破坏系统文件,目前已成为计算机系统和数据库系统的主要威胁

感谢您对我的支持,让我继续努力分享有用的技术与知识点!