数据库系统中常见的四种故障主要有事务内部的故障、系统故障、介质故障以及计算机病毒故障,对应于每种故障都有不同的解决方法。事务故障表明事务没有提交或撤销就结束了,因此数据库可能处于不准确的状态。
事务内部的故障:
事务内部故障可分为预期的和非预期的,其中大部分的故障都是非预期的。
预期的事务内部故障是指可以通过事务程序本身发现的事务内部故障;
非预期的事务内部故障是不能由事务程序处理的,如运算溢出故障、并发事务死锁故障、违反了某些完整性限制而导致的故障等。
系统故障:
系统故障也称为软故障,是指数据库在运行过程中,由于硬件故障、数据库软件及操作系统的漏洞、突然停电灯情况,导致系统停止运转,所有正在运行的事务以非正常方式终止,需要系统重新启动的一类故障。这类事务不破坏数据库,但是影响正在运行的所有事务。
介质故障:
介质故障也称为硬故障,主要指数据库在运行过程中,由于磁头碰撞、磁盘损坏、强磁干扰、天灾人祸等情况,使得数据库中的数据部分或全部丢失的一类故障。
计算机病毒故障:
计算机病毒故障是一种恶意的计算机程序,它可以像病毒一样繁殖和传播,在对计算机系统造成破坏的同时也可能对数据库系统造成破坏(破坏方式以数据库文件为主)。
事务内部的故障
预期的事务内部故障:将事务回滚,撤销对数据库的修改。
非预期的事务内部故障:强制回滚事务,在保证该事务对其他事务没有影响的条件下,利用日志文件撤销其对数据库的修改。
具体做法如下:
1:反向扫描日志文件,查找该事务的更新操作。
2:对该事务的更新操作执行反操作,即对已经插入的新记录进行删除操作,对己删除的记录进行插入操作,对修改的数据恢复旧值,用旧值代替新值。这样由后向前逐个扫描该事务已做的所有更新操作,并做同样处理,直到扫描到此事务的开始标记,事务故障恢复完毕为止。
因此,一个事务是一个工作单位,也是一个恢复单位。一个事务越短,越便于对它进行UNDO操作。如果一个应用程序运行时间较长,则应该把该应用程序分成多个事务,用明确的COMMIT语句来结束各个事务。
系统故障
待计算机重新启动之后,对于未完成的事务可能写入数据库的内容,回滚所有未完成的事务写的结果;对于已完成的事务可能部分或全部留在缓冲区的结果,需要重做所有已提交的事务(即撤销所有未提交的事务,重做所有已提交的事务)。
具体做法如下:
1:正向扫描日志文件,查找尚未提交的事务,将其事务标识记人撤销队列。同时查找已经提交的事务,将其事务标识记入重做队列。
2:对撤销队列中的各个事务进行撤销处理。方法同事务故障中所介绍的撤销方法。
3:对重做队列中的各个事务进行重做处理。进行重做处理的方法是正向扫描日志文件,按照日志文件中所登记的操作内容,重新执行操作,使数据库恢复到最近某个可用状态。
系统发生故障后,由于无法确定哪些末完成的事务已更新过数据库,哪些事务的提交结果尚未写入数据库,因此系统重新启动后,就要撤销所有的末完成的事务,重做所有的已经提交的事务。
但是,在故障发生前已经运行完毕的事务有些是正常结束的,有些是异常结束的。所以无须把它们全部撤销或重做。
通常采用设立检查点(checkPoint)的方法来判断事务是否正常结束。每隔一段时间,比如说5分钟,系统就产生一个检查点,做下面一些事情:a,把仍保留在日志缓冲区中的内容写到日志文件中;b,在日志文件中写一个“检查点记录”;c,把数据库缓冲区中的内容写到数据库中,即把更新的内容写到物理数据库中;d,把日志文件中检查点记录的地址写到“重新启动文件”中。
每个检查点记录包含的信息有在检查点时间的所有活动事务一览表、每个事务最近日志记录的地址。
在重新启动时,恢复管理程序先从“重新启动文件”中获得检查点记录的地址,从日志文件中找到该检查点记录的内容,通过日志往回找,就能决定哪些事务需要撤销,恢复到初始的状态,哪些事务需要重做。为此利用检查点信息能做到及时、有效、正确地完成恢复工作。
介质故障
介质故障的软件容错:使用数据库备份及事务日志文件,通过恢复技术,恢复数据库到备份结束时的状态。
介质故障的硬件容错:采用双物理存储设备,使两个硬盘存储内容相同,当其中一个硬盘出现故障时,及时使用另一个备份硬盘。
具体方法如下。
1:装入最新的数据库副本,使数据库恢复到最近一次转储时的可用状态。
2:装入最新的日志文件副本,根据日志文件中的内容重做已完成的事务。首先扫描日志文件,找出故障发生时己提交的事务,将其记入重做队列。然后正向扫描日志文件,对重做队列中的各个事务进行重做处理,方法是正向扫描日志文件,对每个重做事务重新执行登记的操作,即将日志记录中“更新后的值”写入数据库。
计算机病毒故障
使用防火墙软件防止病毒侵入,对于已感染病毒的数据库文件,使用杀毒软件进行查杀,如果杀毒软件杀毒失败,此时只能用数据库备份文件,以软件容错的方式恢复数据库文件。
Tips:
这四类故障虽然有所不同,但是对数据库的影响无外乎是对数据库本身的破坏或对数据库中数据的破坏,其恢复的基本原理概况起来也就是利用存储在别处的冗余数据来重建数据库中的数据。
恢复的基本原理非常简单:冗余。
数据库中任何一部分被破坏或不正确的数据可以根据存储在系统别处的冗余数据来重建。
建立冗余数据最常用的技术是数据转储和登记日志文件。
数据转储
数据库管理员定期地把整个数据库复制到磁带、磁盘或其他存储介质上保存起来。这些备用的数据称为后备副本(backup)。
当数据库遭到破坏后,可以将后备副本重新装入,但重装后备副本只能将数据库恢复到转储完毕时的状态(进行转储需要一个时间段),想要恢复到故障发生时的状态,必须重新运行自转储以后的所有更新事务。
转储十分耗费时间和资源,不能频繁地进行。
转储可以分为静态转储和动态转储:
1:静态转储:在系统中无运行事务时进行转储操作。静态存储简单,但转储必须等待正运行的用户事务结束才能进行,同样下一个用户事务必须等待转储完毕才能进行。显然,这会降低数据库的利用率。
2:动态转储:转储期间允许事务运行,允许对数据库的存取或修改。虽然动态转储克服了静态转储的缺点,使得转储和用户事务能并发运行,但是转储完毕时,后备副本保存的数据有可能是过时的。比如上一个时刻刚转储完数据A,下一个时刻就改变了数据A的值,那样重装后备副本时,载入的数据就是不正确的。
因此,必须把转储期间各事务对数据库的修改登记下来,建立日志文件(log file)。这样,后备副本配合上日志文件就能把数据库恢复到某一时刻的正确状态。
转储还可以再分为海量转储和增量转储:
1:海量转储:转储整个数据库;
2:增量转储:每次只转储上一次转储后更新过的数据。
从恢复角度来看,海量转储更方便用于恢复。但如果数据库很大,事务处理又十分繁琐,建议使用增量转储。
登记日志文件
日志文件是用来记录事务对数据库的更新操作的文件。不同数据库系统采用的日志文件格式不完全一样。概括起来日志文件主要有两种格式:以记录为单位的日志文件和以数据块为单位的日志文件。
(1)以记录为单位的日志文件需要登记三种日志记录(log record):
把对数据的修改写到数据库和把表示这个修改的日志记录写到日志文件中是两个不同的操作。
如果先修改数据库,后写日志文件,以后就无法恢复这个修改了。
RTO(恢复时间目标)
RTO是指灾难发生后,从IT系统宕机导致业务停顿之刻开始,到IT系统恢复至可以支持各部门运作,业务恢复运营之时,此两点之间的时间段。
RPO (恢复点目标)
RPO(Recovery Point Object),即恢复点目标。是指灾难发生后,容灾系统能把数据恢复到灾难发生前时间点的数据。
服务器
服务层面,可以使用cluster(集群)、master-slave(主从)、fail-over HA(故障切换HA)的方法,获取服务器层面的冗余
1:cluster(集群):
集群(cluster)就是一组计算机,它们作为一个整体向用户提供一组网络资源。这些单个的计算机系统就是集群的节点(node)。一个理想的集群是,用户从来不会意识到集群系统底层的节点,在他/她们看来,集群是一个系统,而非多个计算机系统。并且集群系统的管理员可以随意增加和删改集群系统的节点。
集群系统主要分为高可用(High Availability)集群,简称 HA 集群,和高性能计算(High Perfermance Computing)集群,简称 HPC 集群。
集群系统(Cluster)主要解决下面几个问题:
2:master-slave(主从):
master-slave(主从)方式下,数据从master复制到slave上。通常master是读写状态,slave是只读状态,master和slave的角色可以切换。
对于数据库应用而言基本上是读大于写,因此由 Master 服务器负责增、删、改操作,由 Slave 负责读操作(也就是 SELECT),Master 一般只有一台,而 Slave 可以有好多台。Slave 与 Master 之间会有心跳数据包(一般数据库服务器会提供配置)。当 Master 有数据写入时 Master 会将数据同步至各 Slave 上。
如果数据库采用 Master-Slave 的话,那对于应用程序来说是透明的,也就是说,不管用不用 Master-Slave,我们的代码不需要进行修改。
3:fail-over HA方式:
fail-over HA方式,是通过切换存储和vip(浮动IP)资源实现数据库在主机和备机之间切换的。
实际上只有1个节点对外提供服务
磁盘RAID
RAID是Redundant Arrays of Independent Drives的简称,用来提供磁盘层面的冗余,在服务器和存储中都有此概念。
对于 RAID 类型的选择,需要从速度、容量、安全3个维度来综合考虑,速度快、磁盘空间利用率高、安全可靠永远是用户追求的目标,但在实际部署中,受用户实际需求及应用场景的限制,速度、容量、安全3个维度各自的优先级还是有所侧重的。
RAID 类型介绍与选择:
常用RAID种类有JBOD、RAID 0、RAID 1、RAID 5、RAID 6、RAID 10以及RAID50等
1:JBOD :
JBOD是将多个硬盘空间合并成一个大 的逻辑硬盘,不具有错误备援机制。 数据的存放机制是由第一个硬盘开始 1 n 依序往后存放,如果硬盘损毁,则该硬 盘上的所有数据将无法救回。
最小磁盘数:1
空间利用率:n
2:RAID 0
RAIDO是将多个硬盘合并成一个大的硬盘,不具有冗余,并行I/0。在存放数据时,其将数据按硬盘的个数来进行分段,然后同时将这些数据写进这些盘中。在所有的RAID级别中,RAID 0的速度是最快的,但是RAID 0没有冗余功能,如果一个硬盘(物理)损坏,则所有的数据都会丢失。
最小磁盘数:2
空间利用率:n
3:RAID1 :
RAID1是将两组以上的N个硬盘相互作镜像,在主硬盘上存放数据的同时也在镜像硬盘上写一样的数据。RAID1就是镜像,其原理为当主硬盘(物理)损坏时,镜像硬盘则代替主硬盘的工作。速度没有提高,除非拥有相同数据的主磁盘与镜像同时损坏,否则最高可坏剩N个硬盘,可靠性最高。
最小磁盘数:2
空间利用率:n/2
4:RAID 5 :
RAID 5不对存储的数据进行备份,而是 把数据和相对应的奇偶校验信息存储 到组成 RAID5 的各个磁盘上,并且奇偶 校验信息和相对应的数据分别存储于 不同的磁盘上。
当 RAID5 的一个磁盘数据发生损坏后, 利用剩下的数据和相应的奇偶校验信 息去恢复被损坏的数据。
最小磁盘数:3
空间利用率:n-1
5:RAID 6:
RAID 6在RAID 5的基础上增加了第二 个独立的奇偶校验信息块。两个独立的 奇偶系统使用不同的算法,数据的可靠 性非常高,即使两块磁盘同时失效也不 会影响数据的使用。 同一阵列中容许两个硬盘同时失效(或 是当一个失效后还来不及更换便有第 二个失效)。
最小磁盘数:4
空间利用率:n-2
6:RAID 10 :
RAID1+0是先镜像再分割数据。是将所有硬盘分为两组,视为是RAID 0的最低组合然后将这两组各自视AID 1运作。RAID 1+0有着不错的读取速度,而且拥有比RAID0更高的数据保护性。
最小磁盘数:4
空间利用率:n/2
RAID 0+1则是跟RAID 1+0的程序相反,是先分割再将数据镜像到两组硬盘。它将所有的硬盘分为两组,变成RAID1的最低组合,而将两组硬盘各自视为RAID 0运作。
最小磁盘数:4
空间利用率:n/2
7:RAID 50:
RAID 50是RAID 5与RAID 0的结合, 将若干个RAID 5组合为RAID 0运作。 RAID 50具备更高的容错能力,因为它 允许某个组内有一个磁盘出现故障,而 不会造成数据丢失。
最小磁盘数:6
空间利用率:N-i (i为备份盘数量)
RAIDO通过把I/0负载分布到多个磁盘上,有效的提高了系统性能,但RAID完全不
具有数据保护功能,一般不推荐使用。
RAID1通过磁盘镜像来确保数据的可靠性,100%数据冗余从而带来高可用性,还可以
保持关键应用的正常运行数据读取的性能有所提高,而数据写入性能与单个磁盘没有区别,磁盘的空间利用率在所有RAID类型中最低。适用于安全性要求高、低负载的应用场景。
RAID5通过奇偶检验技术保持数据的冗余,可以更有效地利用磁盘容量,同时保持良
好的读写性能。校验数据用于保持数据的完整性并在磁盘出现故障时进行重建,如果阵列内的某个磁盘出现故障,丟失的数据可以根据其它磁盘上的校验数据进行重建。RAID5的缺点在于阵列不能同时损坏2块以上磁盘,而且在磁盘阵列重建时,性能会有所下降,同时影.响吞吐速率。RAID5下的各项指标均衡性较好,是目前视频监控应用的主要推荐RAID模式。
RAID 10是RAID 1和RAID 0的结合,在所有RAID等级中,性能、保护功能及容量都
是最佳的。多数情况下,RAID10能够承受多个磁盘出现故障的情况,因此系统可用性更高,.但凡事都有两面,在结合RAID 1 和RAID 0优势的同时,RAID 10 也存在和RAID 1同样的冗余特性,磁盘利用率过低。适用于安全性要求高、高负载的应用场景,存储系统高端应用的默认配置一般都采用RAID 10模式。
RAID50是RAID5和RAID0的结合,继承了RAID5的高磁盘利用率和RAID0高速的
优点,而且通过分散RAID5阵列,在重建速度上也较单纯的RAID 5模式有所提高,但依旧存在磁盘阵列重建影响性能和吞吐速率的问题。
网络
网络层面的冗余分为2个层面:
文件系统规划
将不同文件类型放到不同的磁盘中,可以减小某个磁盘故障时的影响范围,进而影响数据库的恢复时间。
1:所有文件都放在一起
磁盘 | 挂载点 | 内容 |
---|---|---|
/dev/sda | /oradata | 控制文件,数据文件,redo日志,归档日志,备份文件 |
2:根据文件特性分开放到不同的盘中
磁盘 | 挂载点 | 内容 |
---|---|---|
/dev/sda | /oradata | 控制文件,数据文件,redo日志 |
/dev/sdb | /fra | 控制文件,redo日志,归档日志 |
/dev/sdc | /backup | 备份文件 |
备份策略
DataGuard
1:DataGuard解决什么问题:
数据库层面冗余
硬件故障
机房故障
只读访问,可以分担主库压力
2:DataGuard应该怎么设计:
物理独立(服务、存储)
考虑服务器配置,带宽需求
规划时应用也要一起考虑
RAC
1: RAC解决什么问题:
数据库实例层面冗余
单个节点损坏时,不影响集群对外提供服务
单节点性能不足
2: RAC应该怎么设计:
硬件要求高
外接存储(2台冗余)
光纤交换机(2台冗余)
不建议使用虚拟化
Oracle 最高可用性体系结构 — MAA
Oracle 最高可用性体系结构 (MAA) 是 Oracle 的最佳实践方案,它基于成熟的 Oracle 高可用性技术和建议。MAA 的目的是以最低的成本和复杂性获得最佳的高可用性体系结构。
MAA 最佳实践涉及 Oracle Database、Oracle Application Server、Oracle 应用产品和 Grid Control。
MAA 考虑了各种业务需求,以使这些最佳实践得到尽可能广泛的应用。
MAA 使用更低成本的服务器和存储。
MAA 随着新的 Oracle 版本和特性而不断发展完善。
MAA 独立于硬件和操作系统。
可参考:
https://www.oracle.com/technetwork/cn/database/features/availability/maa-096107-zhs.html
Oracle的MAA并不是一套全新的技术,它是将以前分散的技术打包成一个整体, 包括以下几种:
1、RMAN:oracle的备份恢复工具,全程RMAN,
2、ASM:oracle auto storage management,oracle的自动存储管理技术,此功能提供了卷管理,集群文件特征,能够在软件层面提供数据冗余能力,避免单点故障(类似于raid)
3、Oracle stream:stream也是从10g之后开始拥有的新特征,这种技术同data guard一样,都是建立在对联机日志、归档日志的提取和应用的基础上,可以看作是备份恢复的一个扩展oracle stream适用于应用层面的数据共享。
4、Oracle data guard:这个技术也是利用了联机日志和归档日志的传递应用来实现数据的完全冗余,从性价比来说,这个技术是最经济实惠的高可用方案。
5、RAC: oracle real application cluster ,oracle的集群技术,RAC不能解决存储的单点故障,一般情况下实施RAC必须结合其他高可用技术方案,如RAC+data guard
6、Oracle flashback:oracle闪回技术,即把数据库回滚到某个之前的状态。