2021 · 导读
相信不少程序员才操作数据库的时候都会产生一些故障,这些故障大概分为以下几类:①事务内部的故障 ②系统故障 ③介质故障 ④计算机病毒 。这些故障都会导致数据库中的数据出现错误,因此,学会数据库的恢复技术是非常重要的,它不仅对系统的可靠程度起着决定性作用,而且对系统的运行效率也有很大影响,是衡量系统性能优劣的重要指标。
01
事务内部的故障
首先讲一下针对事务内部的故障采取的恢复技术吧~在此之前,先介绍一下什么是事务。所谓事务是用户定义的一个数据库操作系列,这些操作要么全做,要么全不做,是一个不可分割的工作单位。事务具有如下4个特性:
1. 原子性(Atomicity) 原子性是指事务是一个不可分割的工作单位,事务中的操作要么 都发生,要么都不发生。
2. 一致性(Consistency) 事务必须使数据库从一个一致性状态变换到另外一个一致性状态 。
3. 隔离性(Isolation) 事务的隔离性是指一个事务的执行不能被其他事务干扰,即一个 事务内部的操作及使用的数据对并发的其他事务是隔离的,并发 执行的各个事务之间不能互相干扰。
4. 持久性(Durability) 持久性是指一个事务一旦被提交,它对数据库中数据的改变就是 永久性的,接下来的其他操作和数据库故障不应该对其有任何影响。
首先,事务内部的故障是可以通过事务程序本身发现的,有些是非预期的,不能由事务程序处理。如以下例子,就是一个预期发现事物内部故障的伪代码例子
begin transaction
读取账户甲的余额balance;
balance=balance-amount;
if(balance<0)then
{
打印“余额不足,不能转账”
rollback;
}
else
{
读取账户乙的余额balance1;
balance1=balance1+amount;
commit;
}
这个例子所包含的两个更新操作要么全部完成,要么全部不做,否则就会使数据不一致。在这段代码中,应用程序可以发现甲账户余额不足的情况并让事务返回,撤销已经修改的操作,恢复数据到正常状态。想必讲到这里,大家对事务内部故障的处理有一定思路了吧~。
但是事务内部的故障更多都是不可预期的,是不能由应用程序处理的。比如运算溢出、并发事务发生死锁而被选中撤消该事务等。
事务的故障会导致数据库处于一个不正常的状态。因此我们采用事务撤销,在不影响其他事务运行的情况下,强行回滚该事务,使得事务好像根本没有启动一样。
begin transaction a;
更新一条数据
if(数据操作无异常)
commit transaction a;
else
rollback transaction a;
1、打开ApexSql,连接数据库

2、使用Time range部分在过滤设置选项步骤里,选择尽可能靠近UPDATE 语句被执行时的时刻以缩小恢复时间段范围 。

3、在过滤设置选项步骤中选择更新行,操作选项卡

4、选择在过滤设置选项步骤中被更新数据的表,表过滤器

5、如果可以的话,使用用户和应用程序过滤器来缩小结果范围
6、点击“打开”
7、创建“Undo”脚本
在主页的tab窗口里的Actions 组里去点击“Create undo 脚本 ”来创建所有在grid窗格里显示的事务undo 脚本。检查您想创建的 Undo 脚本里的事务,在主grid窗格里右击并在邮件菜单里点击“创建undo脚本” 来创建已经被选中的事务的Undo 脚本

8、对数据库执行脚本
在执行Undo 脚本之后,UPDATE语句都会被回滚并且原始数据都会恢复到数据库受损坏之前。
02
系统故障
系统故障是指造成系统停止运转的任何事件,使得系统要重新启动。如硬件错误、操作系统故障、系统断电等。这类故障会影响所有正在运行的事务,一些尚未完成的事务的结果可能已送入物理数据库,从而造成数据库可能处于一个不正常的状态。因此,为了保持数据的一致性,需要清除这些事务对数据库的所有修改。还有一种错误的结果是已提交事务对数据库的更新还留在缓存区没来得及写入数据库,这需要我们重做所有已提交的事务。
恢复原来的子系统必须在系统重新启动时让所有非正常终止的事务回滚,强行撤销所有未完成的事务。
系统故障也可以通过Apex Log工具进行故障恢复,这里就不再次列举了。
03
介质故障
介质故障指外存故障,比如磁盘损坏、磁头碰撞等。这类故障将破坏数据库或部分数据库,并影响正在存取这部分数据的所有事务。这种故障发生的可能性较小,但它的破坏性是最大的。
这种故障的恢复方法就是重装数据库,重做已完成的事务。具体步骤如下
04
计算机病毒
计算机病毒这方面想必大家都很了解,这是计算机系统的主要威胁,自然也是数据库系统的主要威胁。多数计算机病毒一开始并不摧毁整个计算机系统,它们可能只在数据库或者其他数据文件中将小数点向左或向右移一两位,或者增加或修改一两个“0”,从而导致系统不正常

计算机病毒只能预防,因为它的破坏性是极大的。到目前为止,已经出现了许多能检查、诊断、消灭计算机病毒的杀毒软件出现,但计算机病毒同时也在不断进步,能使计算机终身免疫病毒的技术至今还未实现。因此预防计算机病毒,就要减少使用盗版软件的次数,不要打开来历不明的文件。
总结各类故障各类故障对数据库的影响: 一是数据库本身被破坏。二是数据库没有被破坏,但数据可能不正确,这是由事物 的运行被非正常中止造成的。
恢复的原理也十分简单,可以用一词来概括:冗余。也就是说,数据库中任何一部分被破坏或者不正确的数据可以根据存储在系统别处的冗余数据来重建。尽管恢复原理很简单,实现步骤却挺复杂。
所以,想要保护自己的数据库,就要常常做好备份!这样,就算别人删库跑路,你也能重新备份回原来的数据库~~~
我们是图灵智能创新团队,同时也是广东海洋大学第一个人工智能创新团队,我们的方向有:计算机视觉、自然语言处理、前端&后台。本公众号主要面向对人工智能感兴趣的读者,如果想了解更多,欢迎关注我们!
图灵人工智能创新团队
Turing Club

图灵智创
微信公众号|图灵智能创新团队




