随着办公自动化和电子商务的飞速发展企业对信息系统的依赖性越来越高数据库作为信息系统的核心担当着重要的角色尤其在一些对数据可靠性要求很高的行业如银行证券电信等如果发生意外停机或数据丢失其损失会十分惨重为此数据库管理员应针对具体的业务要求制定详细的数据库备份与灾难恢复策略并通过模拟故障对每种可能的情况进行严格测试只有这样才能保证数据的高可用性数据库的备份是一个长期的过程而恢复只在发生事故后进行恢复可以看作是备份的逆过程恢复的程度的好坏很大程度上依赖于备份的情况此外数据库管理员在恢复时采取的步骤正确与否也直接影响最终的恢复结果本文主要针对Oracle数据库可能遇到的各种故障提供了相应的恢复的方法仅供大家参考
要对Oracle数据库备份与恢复有清晰的认识首先有必要对数据库的几种运行状态有充分的了解Oracle数据库的运行状态主要分为种他们依次为
l Nomount(非安装)Oracle只是读取ini文件中的配置信息并初始化SGA区
l Mount(安装)Oracle除了需要读取ini文件还要读取控制文件并从中获取有关数据库的物理结构等信息
l Open(打开)数据库要检查所有文件处于同一时间点对错误进行恢复对未完成事务回滚并最终可以允许用户访问
数据库的备份主要分为三种类型冷备份热备份逻辑备份
数据库的备份不是本文讨论的重点在这里只作一个概要的介绍Oracle数据库备份主要有
l Cold Backup(冷备份) 主要指在关闭数据库的状态下进行的数据库完全备份备份内容包括所有数据文件控制文件联机日志文件ini文件
l Hot Backup(热备份) 指在数据库处于运行状态下对数据文件和控制文件进行备份要使用热备份必须将数据库运行在(Archive Log)归档方式下
l Export(逻辑备份)这是最简单的备份方法可按数据库中某个表某个用户或整个数据库来导出并且支持全部累计增量三种方式使用这种方法数据库必须处于打开状态而且如果数据库不是在restrict状态将不能保证导出数据的一致性
数据库的恢复可分为两大类完全恢复不完全恢复
完全恢复指将数据库恢复到发生故障的时间点不丢失任何数据不完全恢复指将数据库恢复到发生故障前的某一个时间点此时间点以后的所有改动将会丢失如果没有特殊需求我们建议应尽量使用完全恢复
Oracle数据库的恢复过程分两步进行首先将把存放在重做日志文件中的所有重做运用到数据文件之后对重做中所有未提交的事务进行回滚这样所有数据就恢复到发生灾难那一时刻了数据库的恢复只能在发生故障之前的数据文件上运用重做将其恢复到故障时刻而不能将数据文件反向回滚到之前的某一个时刻举个例子我们有一个//的数据库备份当//使我们发现数据库中数据发生混乱希望将数据库恢复到//时的状态我们只能先恢复//的数据库备份然后在其上运用重做记录使其前滚到//时的状态而不能将//的数据库向后回滚到//
为了系统的设计数据库的恢复方案我们先对可能遇到的错误进行分类Oracle数据库错误主要分为大类
l SQL语句失败
l 线程失败
l 实例失败
l 用户操作失败
l 存储设备失败
如果发生前三种失败不需要我们人为干涉Oracle系统会自动进行恢复对于用户操作型的失败(如误删除数据)我们采取的补救措施主要有导入最新的逻辑备份或进行到某一时间点的不完全恢复从Oracle 之后的新版本中引入了基于表空间的时间点恢复(TSPITR)可以单独将包含错误操作的表空间恢复到指定时间而不必对整个数据库进行不完全恢复当错误操作发现比较及时而且数据量不大的情况下也可以考虑使用logminer生成反向SQL
针对存储设备的失败的情况比较复杂也是本文讨论的重点存储设备的失败必然会使放置在其上的文件变为不可用我们先将Oracle数据库所涉及到的文件进行一个划分主要可分为
l Oracle的系统文件指Oracle的运行文件各种应用程序
l 数据库控制文件
l 数据库联机重做日志文件
l 数据文件
l 归档日志文件
避免第一种文件失败主要依赖系统管理员进行操作系统级的备份当发生事故后只能依靠操作系统备份将其恢复
控制文件中记录着整个数据库的结构每个数据文件的状况系统SCN检查点计数器等重要信息在创建数据库时会让用户指定三个位置来存放控制文件他们之间互为镜像当其中任何一个发生故障只需将其从ini文件中注释掉故障数据文件就可重新将数据启动当所有控制全部失效时可以在Nomount模式下执行create controlfile来重新生成控制文件但必须提供redo logdata file文件名和地址以及MAXLOGFILESMAXDATAFILESMAXINSTANCES等信息如果失败之前运行过alter database backup controlfile to trace或alter database backup controlfile to xxx对控制文件作备份恢复时可使用生成的脚本来重建或用备份文件覆盖如果使用了旧的控制文件在恢复时要使用recover xxx using backup controlfile选项来进行恢复并使用resetlogs选项来打开数据库
如果丢失的是联机日志文件分两种情况处理丢失的是非活动的日志文件丢失的是当前激活的日志文件
如果是第一种情况而发生故障的日志文件组又具有多个成员可以先将数据库shutdown然后用操作系统命令将损坏日志文件组中好的日志成员文件把损坏的成员文件覆盖(在同一个日志成员组中的所有日志文件的各为镜象的)如果其物理位置不可用可将其拷贝到新的驱动器上使用alter database rename file xxxx to xxxx改变文件位置之后启动数据库如果正常马上进行一个冷备份如果损坏的日志组中只有一个日志成员先mount上数据库将其转换为noarchivelog模式执行alter database add logfile member xxx to group x给相关组增加一个成员再执行alter database drop logfile member bad_file将损坏的日志文件删除由于数据库的结构发生变动需要备份控制文件之后将数据库改回archivelog模式做一个冷备份
如果丢失的是当前激活的日志文件数据库又没有镜像而且当前日志组中所有成员均变为不可用首先将数据库shutdown abort从最近的一次全备份中恢复所有的数据文件将数据库启动到mount状态如果原来的日志文件物理位置不可用使用alter database rename file xxx to xxx改变文件的存放位置然后使用recover database until cancel命令来恢复数据库直到提示最后一个归档日志运用完之后输入cancel之后用alter database open resetlogs打开数据库如果没有问题立即进行一个冷备份注意!所有包含在损坏的redo log中的信息将会丢失也就是说数据库崩溃前已经提交的数据有可能会丢失这对于某些要求很高的应用将会损失惨重因此应尽量使每个日志组具有多个日志成员并且放置在不同的驱动器上一防止发生介质故障
数据文件发生故障的情况也分为多种情况丢失包含在SYSTEM表空间的数据文件丢失没有回滚段的非SYSTEM数据文件丢失有回滚段的非SYSTEM数据文件
如果损坏的是系统表空间的数据文件唯一的办法是从上一次备份中恢复受损的数据文件(如果原位置不可用使用alter database rename命令改变新文件的位置)之后在数据库mount的状态下执行recover database/datafile对数据库进行回复才能将数据库打开注意当SYSTEM表空间或其中的数据文件脱机数据库是无法被打开的因此必须在mount状态下将所有的恢复工作完成
当丢失的数据文件不属于系统表空间而且也不包含回滚段时有可选择在数据库的两种状态下进行恢复在数据库open的状态或者在数据库mount的状态如果用户急于访问数据库中未受损部分的数据或对损坏的数据文件进行恢复需要很长时间可以先使受损的数据文件脱机将数据库打开给用户访问再恢复受损的数据文件最后将其联机步骤如下先在数据库mount时将相关的数据文件或表空间进行脱机alter database datafile xxx offline然后将数据库open这样就能使数据库未受损的部分先供用户访问之后再进行recover datafile/tablespace完成后用alter database datafile/tablespace xxx online使其恢复联机就可被访问了 当然用户也可以选择在数据库mount状态下用recover database/datafile将所有的恢复工作做完将所有数据文件一起打开供用户访问
如果丢失的数据文件是最后一种情况即包含有回滚段的非系统表空间数据文件也可以选择是在数据库先open的状态还是在mount状态下恢复不过与上一种情况不同的是当包含回滚段的数据文件损坏时如果使其先offline将数据库打开那么所有数据库崩溃前未提交的事务涉及到的表将无法访问也就是说在回滚段恢复前其中涉及的对象都不允许被访问而且当所有包含回滚段的数据文件都在offline状态时数据库无法进行任何DML操作因此在数据库open状态恢复包含回滚段的数据文件时可以先创建几个临时回滚段供数据使用create rollback segment temp tablespace system; alter rollback segment temp online;当数据文件恢复后再将他们删除alter rollback segment temp offline; drop rollback segment temp;注意当用这种方法使恢复的数据文件online之后所有的原有回滚段将处于offline状态必须手工使用alter rollback segment RBSxx online;使他们恢复联机状态这样才能被数据库正常使用如果在数据库mount状态下完成所有恢复则不需要上述步骤
如果丢失数