由浅入深讲解Oracle数据库的备份与恢复
备份的概念
所谓备份,就是把数据库复制到转储设备的过程。其中,转储设备是指用于放置数据库拷贝的磁带或磁盘。通常也将存放于转储设备中的数据库的拷贝称为原数据库的备份或转储。如下图所示:
ORACLE数据库的备份分为物理备份和逻辑备份两种。物理备份是将实际组成数据库的操作系统文件从一处拷贝到另一处的备份过程,通常是从磁盘到磁带。可以使用 Oracle 的恢复管理器(Recovery Manager,RMAN)或操作系统命令进行数据库的物理备份。逻辑备份是利用SQL语言从数据库中抽取数据并存于二进制文件的过程。Oracle提供的逻辑备份工具是 EXP。数据库逻辑备份是物理备份的补充。
根据在物理备份时数据库的状态,可以将备份分为一致性备份(consistent backup)和不一致性备份(inconsistent backup)两种:
一致性备份:一致性备份是当数据库的所有可读写的数据库文件和控制文件具有相同的系统改变号(SCN),并且数据文件不包含当前 SCN 之外的任何改变。在做数据库检查点时,Oracle 使所有的控制文件和数据文件一致。对于只读表空间和脱机的表空间,Oracle 也认为它们是一致的。使数据库处于一致状态的唯一方法是数据库正常关闭(用shutdown normal 或 shutdown immediate 命令关闭)。因此,只有在以下条件下的备份是一致性备份:
数据库正常关闭(用shutdown normal 或 shutdown immediate 命令关闭)。
不一致性备份:不一致备份是当数据库的可读写的数据库文件和控制文件的系统改变号(SCN)在不一致条件下的备份。对于一个 7*24 工作的数据库来说,由于不可能关机,而数据库数据是不断改变的,因此只能进行不一致备份。在 SCN 号不一致的条件下,数据库必须通过应用重做日志使 SCN 一致的情况下才能启动。因此,如果进行不一致备份,数据库必须设为归档状态,并对重做日志归档才有意义。在以下条件下的备份是不一致性备份:
数据库处于打开状态。
数据库处于关闭状态,但是用非正常手段关闭的。例如,数据库是通过 shutdown abort 或机器掉电等等方法关闭的。
恢复的概念
所谓恢复,就是把数据库由存在故障的状态转变为无故障状态的过程。根据出现故障的原因,恢复分为两种类型:
实例恢复。这种恢复是Oracle实例出现失败后,Oracle自动进行的恢复。
介质恢复。这种恢复是当存放数据库的介质出现故障时所做的恢复。本书后面提到的恢复都是指介质恢复。
装载(restore)物理备份与恢复(Recover)物理备份是介质恢复的手段。装载是将备份考回到磁盘,恢复是利用重做日志(物理备份的一部分)修改考回到磁盘的数据文件(物理备份的另一部分),从而恢复数据库的过程。如下图所示:
根据数据库的恢复程度,将恢复方法分为两种类型:
完全恢复:将数据库恢复到数据库失败时数据库的状态。这种恢复是通过装载数据库备份和并应用全部的重做日志做到的。
不完全恢复:将数据库恢复到数据库失败前的某一时刻数据库的状态。这种恢复是通过装载数据库备份和并应用部分的重做日志做到的。进行不完全恢复后必须在启动数据库时用 resetlogs 选项重设联机重做日志。
例如,在上午10:00,由于磁盘损坏导致数据库中止使用。现在使用两种方法进行数据库的恢复,第一种方法使数据库可以正常使用,且使恢复后与损坏时(10:00)数据库中的数据相同,那么第一种恢复方法就属于完全恢复类型;第二种方法能使数据库正常使用,但只能使恢复后与损坏前(例如9:00)数据库中的数据相同,没能恢复数据库到失败时(10:00)数据库的状态,那么第二种恢复方法就属于不完全恢复类型。
事实上,如果数据库备份是一致性的备份,则装载后的数据库即可使用,从而也可以不用重做日志恢复到数据库备份时的点。这也是一种不完全恢复。
备份与恢复的关系
备份一个Oracle数据库,类似于买医疗保险——在遇到疾病之前不会意识到它的重要性,获得保险金的数量取决于保险单的种类。同理,随着制作备份的种类和频繁程度的不同,数据库发生故障后其恢复的可行性、难度与所花费的时间也不同。
数据库故障是指数据库运行过程中影响数据库正常使用的特殊事件。数据库故障有许多类型,最严重的是介质失败(如磁盘损坏),这种故障如不能恢复将导致数据库中数据的丢失。数据库故障类型有:
语句失败。
用户进程失败。
实例失败。
用户或应用错误操作。这类错误可能是意外地删除了表中的数据等错误操作。
介质失败。如硬盘失败,硬盘中的数据丢失。
自然灾害。如地震、洪水等。
由于故障类型的不同,恢复数据库的方法也不同。通过装载备份来恢复数据库既是常用的恢复手段,也是恢复介质失败故障的主要方法。
备份与恢复要考虑的问题
备份与恢复要考虑以下的三个问题:
备份与恢复策略要考虑的商业、操作、及技术问题;
灾难恢复计划的组成;
测试备份与恢复策略的重要性。
能够进行什么样的恢复依赖于有什么样的备份。作为 DBA,有责任从以下三个方面维护数据库的可恢复性:
使数据库的失效次数减到最少,从而使数据库保持最大的可用性;
当数据库不可避免地失效后,要使恢复时间减到最少,从而使恢复的效率达到最高;
当数据库失效后,要确保尽量少的数据丢失或根本不丢失,从而使数据具有最大的可恢复性。
备份与恢复策略要考虑的商业、操作、及技术问题
作为 DBA,首先需要了解企业是如何使用数据库系统的,以及企业对数据库的可用性,恢复性能,和数据的可恢复性以及恢复时间的要求。然后,DBA 需要使企业的管理人员了解维护这样的数据库的可用性的代价有多大。做到这点的最好方法是评估恢复需要的花费,以及丢失数据给企业带来的损失。
在代价被评估后,就可以进行备份与恢复的讨论了。此时,要定义数据库总体的可用性需求,并根据各项工作对数据库可用性的影响程度来定义工作重点的次序。例如,如果数据库需要 7*24 的可用性,那么其重要性就高于其它任何工作,其它任何需要关机才能做的工作就不能做。
另外,数据库变化的情况也是备份与恢复策略需要考虑的一个因素。例如,如果数据不断改变,有新数据或数据文件加入,或表结构有大的变化,则应该经常备份;反之,如果数据是静态的或只读的,则备份一次即可。无论如何,应遵从这样一个原则,如果怀疑数据库的可恢复性,就应该备份。
灾难恢复计划的组成
针对灾难恢复,必须回答下述问题:
系统可能出现什么样的灾难恢复情况?
如果出现数据丢失,灾难恢复情况是怎样的?
系统中数据的易变程度如何?
如果出现问题,系统需要多快的速度恢复?
在各种情况下恢复策略的代价,以及相应的花时间重新录入数据的代价?
对这些问题的回答组成了灾难恢复计划。
计算机是易坏的。主板上的芯片、主板电路、内存、电源等任何一项不能正常工作,都会导致计算机系统不能正常工作。当然,这些损坏可以修复,不会导致应用和数据的损坏。但是,如果计算机的硬盘损坏,将会导致数据丢失,此时必须用备份恢复数据。
灾难恢复的最重要步骤是设计充足频率的硬盘备份过程。备份过程应该满足系统要求的可恢复性。例如,如果数据库可有较长的关机时间,则可以每周进行一次冷备份,并归档重做日志;但是,如果数据库只有极少的关机时间,则只能从硬件的角度来考虑备份与恢复的问题,例如使用硬盘镜像或双机系统。选择备份策略的依据是:丢是数据的代价与确保数据不丢失的代价之比。
果每天都能备份当然会很理想,但要考虑其现实性。企业都在想办法降低维护成本,现实的方案才可能被采用。只要仔细计划,并想办法达到数据库可用性的底线,花少量的钱进行成功的备份与恢复也是可能的。
DBA 还应以服务协议的形式制订一个可恢复性与可用性的标准文件。该文件应成为讨论DBA 服务,以及服务是否能达到预期标准的依据。这样做可使所有相关人员对同样的预期有潜在的危机感。
测试备份与恢复策略的重要性
备份与恢复策略必须经测试无误后才可使用。如果进行了备份,但不知道该备份是否支持希望的恢复目标则与根本没有备份没有两样。
恢复策略也要考虑虑对环境的依赖性。例如,假如机器的硬盘失效了,供货商能在多长时间内提供一个新的硬盘;在机器需要重新启动时,能找到操作系统管理员吗?
另外一个需要考虑的问题是数据库是否能经受自然的破坏。应在与计算机不同的地方再存储一份备份介质,以免出现自然灾害时主机与备份一起遭到破坏。
最后需要考虑的问题是万一DBA 出现了问题怎么办?后备的DBA能否执行备份策略?他或她能找到支持用的文档吗?这些文档存在吗?
没有比花了大精力指定了好的计划,但没有测试其有效性而使其付诸东流的了。一个好的计划还应容纳人为错误,特别是用于开发的系统。理想的测试计划应包括以下内容:
一系列的测试例子及其状态描述;
测试结果是否成功的标准;
解决这些状态的步骤。
只有在上述情况测试成功的前提下,DBA 才应该考虑把备份计划付诸实施,用于实际使用的生产系统。
在数据库实际使用时,备份策略的测试也不能终止。小范围的测试可以确保备份策略可以满足未来的需求。随着应用系统的成熟,备份策略也应相应地成熟。如果备份策略不能满足新的需求,就应该重新设计。
测试备份策略的益处:
测试人工的备份过程可能会发现人工的疏漏,促使DBA考虑自动的备份方法。只要自动的备份过程经过了测试,并能解决数据库改变后的(例如增加了表空间)的备份问题,自动备份是有益无害的。
测试的另外一个好处是可以发现数据块的问题。如果数据文件的一个或多个数据块损坏了,而又使用了数据库的物理备份方法,则损坏了的数据块会被拷贝到备份文件中,这会导致备份的损坏和数据库的损坏。如果不做测试,该问题是不会被发现的。当然,也可以通过设置INIT.ORA 文件中的参数DB_BLOCK_CHECKSUM 或用DBVERIFY 实用工具进行数据的完整性检查。