一 理解什么是数据库恢复
当我们使用一个数据库时总希望数据库的内容是可靠的正确的但由于计算机系统的故障(硬件故障软件故障网络故障进程故障和系统故障)影响数据库系统的操作影响数据库中数据的正确性甚至破坏数据库使数据库中全部或部分数据丢失因此当发生上述故障后希望能重构这个完整的数据库该处理称为数据库恢复恢复过程大致可以分为复原(Restore)与恢复(Recover)过程
数据库恢复可以分为以下两类
实例故障的一致性恢复
当实例意外地(如掉电后台进程故障等)或预料地(发出SHUTDOUM ABORT语句)中止时出现实例故障此时需要实例恢复实例恢复将数据库恢复到故障之前的事务一致状态如果在在线后备发现实例故障则需介质恢复在其它情况Oracle在下次数据库起动时(对新实例装配和打开)自动地执行实例恢复如果需要从装配状态变为打开状态自动地激发实例恢复由下列处理
() 为了解恢复数据文件中没有记录的数据进行向前滚该数据记录在在线日志
包括对回滚段的内容恢复
() 回滚未提交的事务按步重新生成回滚段所指定的操作
() 释放在故障时正在处理事务所持有的资源
() 解决在故障时正经历一阶段提交的任何悬而未决的分布事务
介质故障或文件错误的不一致恢复
介质故障是当一个文件一个文件的部分或磁盘不能读或不能写时出现的故障文件错误一般指意外的错误导致文件被删除或意外事故导致文件的不一致这种状态下的数据库都是不一致的需要DBA手工来进行数据库的恢复这种恢复有两种形式决定于数据库运行的归档方式和备份方式
() 完全介质恢复可恢复全部丢失的修改一般情况下需要有数据库的备份且数据库运行在归档状态下并且有可用归档日志时才可能对于不同类型的错误有不同类型的完全恢复可使用其决定于毁坏文件和数据库的可用性
() 不完全介质恢复是在完全介质恢复不可能或不要求时进行的介质恢复重构受损的数据库使其恢复介质故障前或用户出错之前的一个事务一致性状态不完全介质恢复有不同类型的使用决定于需要不完全介质恢复的情况有下列类型基于撤消基于时间和基于修改的不完全恢复
基于撤消(CANCEL)恢复在某种情况不完全介质恢复必须被控制DBA可撤消在指定点的操作基于撤消的恢复地在一个或多个日志组(在线的或归档的)已被介质故障所破坏不能用于恢复过程时使用所以介质恢复必须控制以致在使用最近的未损的日志组于数据文件后中止恢复操作
基于时间(TIME)和基于修改(SCN)的恢复如果DBA希望恢复到过去的某个指定点是一种理想的不完全介质恢复一般发生在恢复到某个特定操作之前恢复到如意外删除某个数据表之前
第二章 数据库恢复案例测试环境
数据库环境
以下的所有案例都是通过测试经过环境为
OSWindows Server
DBOracle
DBNAMETEST
数据文件
SQL> select file#statusenabledname from v$datafile;
FILE# STATUSENABLEDNAME
SYSTEMREAD WRITE D:\Oracle\ORADATA\TEST\SYSTEMDBF
ONLINEREAD WRITE D:\Oracle\ORADATA\TEST\RBSDBF
ONLINEREAD WRITE D:\Oracle\ORADATA\TEST\USERSDBF
ONLINEREAD WRITE D:\Oracle\ORADATA\TEST\TEMPDBF
ONLINEREAD WRITE D:\Oracle\ORADATA\TEST\TOOLSDBF
ONLINEREAD WRITE D:\Oracle\ORADATA\TEST\INDXDBF
控制文件
SQL> select * from v$controlfile;
STATUSNAME
D:\Oracle\ORADATA\TEST\CONTROLCTL
D:\Oracle\ORADATA\TEST\CONTROLCTL
D:\Oracle\ORADATA\TEST\CONTROLCTL
联机日志
SQL> select * from v$logfile;
GROUP# STATUSMEMBER
STALED:\Oracle\ORADATA\TEST\REDOLOG
D:\Oracle\ORADATA\TEST\REDOLOG
STALED:\Oracle\ORADATA\TEST\REDOLOG
数据库备份脚本
冷备份脚本:
rem script:coldbaksql
rem creater:chenjiping
rem date:
rem desc:offline full backup database
connect database
connect internal/password;
shutdown database
shutdown immediate;
Copy Data file
!xcopy d:\Oracle\oradata\test\*dbf d:\database/H/R;
Copy Control file
!xcopy d:\Oracle\oradata\test\*ctl d:\database/H/R;
Copy Log file
!xcopy d:\Oracle\oradata\test\*log d:\database/H/R;
startup database
startup;
说明
以上脚本在数据库关闭状态下备份数据库所有的数据文件联机日志控制文件(在一个目
录下)如果成功备份所有文件是一致的;
没有备份参数文件参数文件可以另外备份没有必要每次都备份只需要在改变设置后备份一次;
如果以上命令没有成功依次执行那么备份将是无效的如连接数据库不成功那么肯定关闭数据库也不成功那么备份则无效;
冷备份建议下人工干预下执行
数据库OS热全备份脚本
rem script:hotbaksql
rem creater:chenjiping
rem date:
rem desc:backup all database datafile in archive
connect database
connect internal/password;
archive
alter system archive log current;
start
alter tablespace system begin backup;
!xcopy d:\Oracle\oradata\test\systemdbf d:\databak/H/R;
alter tablespace system end backup;
alter tablespace rbs begin backup;
!xcopy d:\Oracle\oradata\test\rbsdbf d:\databak/H/R;
alter tablespace rbs end backup;
alter tablespace users begin backup;
!xcopy d:\Oracle\oradata\test\usersdbf d:\databak/H/R;
alter tablespace users end backup;
alter tablespace tools begin backup;
!xcopy d:\Oracle\oradata\test\toolsdbf d:\databak/H/R;
alter tablespace tools end backup;
alter tablespace indx begin backup;
!xcopy d:\Oracle\oradata\test\indxdbf d:\databak/H/R;
alter tablespace indx end backup;
end
bak control file
binary
alter database backup controlfile to d:\databak\controlbinbak;
ascii
alter database backup controlfile to trace;
alter system archive log current;
说明
热备份必须在数据库归档方式下才可以运行
以上脚本可以在数据库运行状态下备份数据库所有的数据文件(除了临时数据文件)没有必要备份联机日志
归档日志至少需要一次完整备份之后的所有日志
如果以上命令没有成功依次执行那么备份也是无效的如连接数据库不成功那么备份则无效
RMAN备份只讲叙有恢复目录的情况如果没有恢复目录情形大致相似以下是RMAN的热备份全备份的脚本
# script:bakuprcv
# creater:chenjiping
# date:
# desc:backup all database datafile in archive with rman
# connect database
connect rcvcat rman/rman@back;
connect target internal/virpure;
# start backup database
run{
allocate channel c type disk;
backup full tag dbfull format d:\backup\full%u_%s_%p database
include current controlfile;
sql alter system archive log current;
release channel c;
}
# end