暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

数据库发生故障?使用数据库恢复技术!

1273

 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;

}


    这个例子所包含的两个更新操作要么全部完成,要么全部不做,否则就会使数据不一致。在这段代码中,应用程序可以发现甲账户余额不足的情况并让事务返回,撤销已经修改的操作,恢复数据到正常状态。想必讲到这里,大家对事务内部故障的处理有一定思路了吧~。

    但是事务内部的故障更多都是不可预期的,是不能由应用程序处理的。比如运算溢出、并发事务发生死锁而被选中撤消该事务等。

    事务的故障会导致数据库处于一个不正常的状态。因此我们采用事务撤销,在不影响其他事务运行的情况下,强行回滚该事务,使得事务好像根本没有启动一样。

事务撤销的恢复步骤:

    1、反向扫描文件日志(从后往前扫描),查找该事务的更新操作

    2、对该事务的更新操作执行逆操作,即将日志记录中“更新前的值”写入数据库

    3、继续反向扫描日志文件,查找该事务的其他更新操作,并做同样处理。

    4、如此处理下去,直至读到此事务的开始标记,事务故障恢复就完成了。

    接下来就讲一下事务撤销的具体实现吧~

begin transaction a;

更新一条数据

if(数据操作无异常)

commit transaction a;

else

rollback transaction a;

    假设这段程序在执行的时候出现了事务内部故障,只执行到3的一半就终止了,要知道,数据库的更新操作相当于数据库先执行删除操作,再执行插入操作,这两个操作加起来才是一个更新的操作。此时出现了故障,相当于一部分数据被删除了,没有来得及更新。这时我们需要扫描此时开启该事务的时候事务所处数据库日志文件的位置,此时我们需要一个神奇的工具ApexSql Log,它是一个强大的处理数据库日志的工具,可以轻松帮我们在日志找到该事务的位置。

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

系统故障

    系统故障是指造成系统停止运转的任何事件,使得系统要重新启动。如硬件错误、操作系统故障、系统断电等。这类故障会影响所有正在运行的事务,一些尚未完成的事务的结果可能已送入物理数据库,从而造成数据库可能处于一个不正常的状态。因此,为了保持数据的一致性,需要清除这些事务对数据库的所有修改。还有一种错误的结果是已提交事务对数据库的更新还留在缓存区没来得及写入数据库,这需要我们重做所有已提交的事务。

    恢复原来的子系统必须在系统重新启动时让所有非正常终止的事务回滚,强行撤销所有未完成的事务。

1、正向扫描日志文件(将在故障发生前已经提交的事务加入重做(REDO)队列,这些事务既有begin transaction记录,也有commit记录;将在故障发生时未完成的事务加入撤销(Undo)队列,这些事务中只有begin transaction记录,无相应的commit记录)

2、对撤销(Undo)队列事务进行撤销(Undo)处理(1.反向扫描日志文件,对每个undo事务的更新操作进行逆操作;2.将日志记录中“更新前的值”写入数据库)

3、对重做(Redo)队列事务进行重做(Redo)处理(正向扫描日志文件,对每个REDO事务重新执行登记的操作;将日志记录中“更新后的值”写入数据库)

    系统故障也可以通过Apex Log工具进行故障恢复,这里就不再次列举了。


03

介质故障

    介质故障指外存故障,比如磁盘损坏、磁头碰撞等。这类故障将破坏数据库或部分数据库,并影响正在存取这部分数据的所有事务。这种故障发生的可能性较小,但它的破坏性是最大的。

    这种故障的恢复方法就是重装数据库,重做已完成的事务。具体步骤如下

(1) 装入最新的数据库后备副本(离故障发生时刻最近的转储副本),使数据库恢复到最近一次转储时的一致性状态。

(2) 转入相应的日志文件副本,重做已完成的事务。即首先扫描日志文件,找出故障发生时已提交的事物的标识,将其记入重做队列;然后正向扫描日志文件,对重做队列中的所有事务进行重做处理。即将日志记录中“更新后的值”写入数据库。

04

计算机病毒

    计算机病毒这方面想必大家都很了解,这是计算机系统的主要威胁,自然也是数据库系统的主要威胁。多数计算机病毒一开始并不摧毁整个计算机系统,它们可能只在数据库或者其他数据文件中将小数点向左或向右移一两位,或者增加或修改一两个“0”,从而导致系统不正常

   计算机病毒只能预防,因为它的破坏性是极大的。到目前为止,已经出现了许多能检查、诊断、消灭计算机病毒的杀毒软件出现,但计算机病毒同时也在不断进步,能使计算机终身免疫病毒的技术至今还未实现。因此预防计算机病毒,就要减少使用盗版软件的次数,不要打开来历不明的文件。


    总结各类故障各类故障对数据库的影响: 一是数据库本身被破坏。二是数据库没有被破坏,但数据可能不正确,这是由事物 的运行被非正常中止造成的。

    恢复的原理也十分简单,可以用一词来概括:冗余。也就是说,数据库中任何一部分被破坏或者不正确的数据可以根据存储在系统别处的冗余数据来重建。尽管恢复原理很简单,实现步骤却挺复杂。

    所以,想要保护自己的数据库,就要常常做好备份!这样,就算别人删库跑路,你也能重新备份回原来的数据库~~~



    我们是图灵智能创新团队,同时也是广东海洋大学第一个人工智能创新团队,我们的方向有:计算机视觉、自然语言处理、前端&后台。本公众号主要面向对人工智能感兴趣的读者,如果想了解更多,欢迎关注我们!


图灵人工智能创新团队

Turing Club


图灵智创

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


文章转载自图灵智能创新团队,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论