Oracle数据库的文件有哪些种类呢?这些文件在什么情况下容易被损坏呢?损坏以后又该怎么样去修复呢?本文就介绍了这些内容,包括了10中Oracle文件的损坏与修复的过程,这10种文件几乎涵盖了Oracle数据库中所有类型的文件,接下来就让我们一起来了解一下这10种文件的损坏与修复的过程吧。
一、数据库服务器基本情况
OS:RHEL 3
CPU:4个Intel(R) Xeon(TM) MP CPU 2.70GHz
Mem:8G
Swap:16G
Disk:120G
Oracle Database 10g Enterprise Edition Release 10.1.0.3.0
二、备份方式
数据库以archive模式运行,RMAN多级增量备份。策略如下:
设置控制文件自动备份。
每三个月做一个数据库的全备份(包括所有得数据库和只读表空间),并备份归档日志。
每一个月做一次零级备份(不包含只读表空间),并备份归档日志。
每周做一次一级备份,并备份归档日志。
每天做一次二级备份,并备份归档日志。
三、恢复案例
所有恢复的前提:已经做过数据库全备份(包括归档日志),控制文件和spfile自动备份。
1.损坏一个数据文件
(1)故障模拟
删除数据文件:rm /u02/oradata/dbnms/users01.dbf
关闭数据库:shutdown immediate;
ORA-01116:errorinopeningdatabasefile4 ORA-01110:datafile4:'/u02/oradata/dbnms/users01.dbf' ORA-27041:unabletoopenfile LinuxError:2:Nosuchfileordirectory Additionalinformation:3
强行关闭:sutdown abort;
启动数据库:startup;
ORA-01157:cannotidentify/lockdatafile4-seeDBWRtracefile ORA-01110:datafile4:'/u02/oradata/dbnms/users01.dbf'
(2)恢复步骤
rmantargetsys@dbnmscatalogrmanuser@cata run{ allocatechannelc1typedisk; restoredatafile4; recoverdatafile4; sql'alterdatabasedatafile4online'; sql'alterdatabaseopen'; releasechannelc1; } sqlplussysassysdba selectinstance_name,statusfromv$instance; INSTANCE_NAMESTATUS ---------------------------- dbnmsOPEN
恢复成功。
2.损坏全部数据文件
(1)故障模拟
删除数据文件:rm /u02/oradata/dbnms/*.dbf
强行关闭:sutdown abort;
启动数据库:startup;
ORA-01157:cannotidentify/lockdatafile1-seeDBWRtracefile ORA-01110:datafile1:'/u02/oradata/dbnms/system01.dbf'
(2)恢复步骤
rmantargetsys@dbnmscatalogrmanuser@cata run{ allocatechannelc1typedisk; restoredatabase; recoverdatabase; sql'alterdatabaseopen'; releasechannelc1; } sqlplussysassysdba selectinstance_name,statusfromv$instance; INSTANCE_NAMESTATUS ---------------------------- dbnmsOPEN
恢复临时文件:
alterdatabasetempfile'/u02/oradata/dbnms/temp01.dbf'drop; altertablespacetempaddtempfile'/u02/oradata/dbnms/temp01.dbf'size50Mautoextendonnext5Mmaxsizeunlimited;
恢复成功。
3.损坏非当前联机日志成员
(1)故障模拟
删除日志文件:rm /u02/oradata/dbnms/redo01.log
关闭数据库:shutdown immediate;
启动数据库:startup;
select*fromv$logfile; GROUP#STATUSTYPEMEMBERIS_ --------------------------------------------------------- 3ONLINE/u02/oradata/dbnms/redo03.logNO 2STALEONLINE/u02/oradata/dbnms/redo02.logNO 1INVALIDONLINE/u02/oradata/dbnms/redo01.logNO 1STALEONLINE/u02/oradata/dbnms/redo11.logNO 1STALEONLINE/u02/oradata/dbnms/redo21.logNO 2STALEONLINE/u02/oradata/dbnms/redo12.logNO 3ONLINE/u02/oradata/dbnms/redo13.logNO 2STALEONLINE/u02/oradata/dbnms/redo22.logNO 3ONLINE/u02/oradata/dbnms/redo23.logNO 4ONLINE/u02/oradata/dbnms/redo31.logNO 4ONLINE/u02/oradata/dbnms/redo32.logNO GROUP#STATUSTYPEMEMBERIS_ --------------------------------------------------------- 4ONLINE/u02/oradata/dbnms/redo33.logNO
(2)恢复步骤
alterdatabasedroplogfilemember'/u02/oradata/dbnms/redo01.log'; alterdatabaseaddlogfilemember'/u02/oradata/dbnms/redo01.log'togroup1;
恢复成功.
4.损坏非当前联机日志组
(1)故障模拟
删除日志文件组1的所有文件:
rm/u02/oradata/dbnms/redo01.log rm/u02/oradata/dbnms/redo11.log rm/u02/oradata/dbnms/redo21.log
关闭数据库:shutdown immediate;
启动数据库:startup;
Databasemounted. ORA-00313:openfailedformembersofloggroup1ofthread1 ORA-00312:onlinelog1thread1:'/u02/oradata/dbnms/redo11.log' ORA-00312:onlinelog1thread1:'/u02/oradata/dbnms/redo21.log' ORA-00312:onlinelog1thread1:'/u02/oradata/dbnms/redo01.log'
(2)恢复步骤
alterdatabaseclearlogfilegroup1;
如果该日志组还没有归档,则用:
alterdatabaseclearunarchivedlogfilegroup1;
打开数据库:
alterdatabaseopen;
恢复成功。
#p#
5.损坏全部联机日志
(1)故障模拟
删除日志文件:rm /u02/oradata/dbnms/*.log
关闭数据库:shutdown immediate;
启动数据库:startup;
Databasemounted. ORA-00313:openfailedformembersofloggroup1ofthread1 ORA-00312:onlinelog1thread1:'/u02/oradata/dbnms/redo11.log' ORA-00312:onlinelog1thread1:'/u02/oradata/dbnms/redo21.log' ORA-00312:onlinelog1thread1:'/u02/oradata/dbnms/redo01.log'
(2)恢复步骤
shutdownimmediate; createpfilefromspfile; cd$ORACLE_HOME/dbs viinitdbnms.ora
加一个参数:_allow_resetlogs_corruption=true
createspfilefrompfile; startup; Databasemounted. ORA-00313:openfailedformembersofloggroup1ofthread1 ORA-00312:onlinelog1thread1:'/u02/oradata/dbnms/redo11.log' ORA-00312:onlinelog1thread1:'/u02/oradata/dbnms/redo21.log' ORA-00312:onlinelog1thread1:'/u02/oradata/dbnms/redo01.log' recoverdatabaseuntilcancel; alterdatabaseopenresetlogs;
同步catalog:
rmantargetsys@dbnmscatalogrmanuser@cata resetdatabase; newincarnationofdatabaseregisteredinrecoverycatalog startingfullresyncofrecoverycatalog fullresynccomplete
做一个full备份:
/home/oracle/dbbat/backup_full.sh
恢复成功
6.损坏一个控制文件
(1)故障模拟
删除控制文件:rm /u02/oradata/dbnms/control01.ctl
关闭数据库:shutdown immediate;
ORA-00210:cannotopenthespecifiedcontrolfile ORA-00202:controlfile:'/u02/oradata/dbnms/control01.ctl' ORA-27041:unabletoopenfile LinuxError:2:Nosuchfileordirectory Additionalinformation:3
(2)恢复步骤
拷贝一个好的控制文件:
cpcontrol02.ctlcontrol01.ctl shutdownimmediate; startup; Databasemounted. ORA-01122:databasefile1failedverificationcheck ORA-01110:datafile1:'/u02/oradata/dbnms/system01.dbf' ORA-01207:fileismorerecentthancontrolfile-oldcontrolfile rmantargetsys@dbnmscatalogrmanuser@cata run{ allocatechannelc1typedisk; restoredatabase; recoverdatabase; sql'alterdatabaseopen'; releasechannelc1; } RMAN-00571:=========================================================== RMAN-00569:===============ERRORMESSAGESTACKFOLLOWS=============== RMAN-00571:=========================================================== RMAN-03009:failureofsqlcommandondefaultchannelat09/08/200517:29:04 RMAN-11003:failureduringparse/executionofSQLstatement:alterdatabaseopen ORA-00322:log3ofthread1isnotcurrentcopy ORA-00312:onlinelog3thread1:'/u02/oradata/dbnms/redo03.log' ORA-00312:onlinelog3thread1:'/u02/oradata/dbnms/redo13.log' ORA-00312:onlinelog3thread1:'/u02/oradata/dbnms/redo23.log' alterdatabaseclearunarchivedlogfilegroup3; alterdatabaseopen;
恢复成功。
7.损坏全部控制文件
(1)故障模拟
删除控制文件:rm /u02/oradata/dbnms/control01.ctl
关闭数据库:shutdown immediate;
ORA-00210:cannotopenthespecifiedcontrolfile ORA-00202:controlfile:'/u02/oradata/dbnms/control01.ctl' ORA-27041:unabletoopenfile LinuxError:2:Nosuchfileordirectory Additionalinformation:3
(2)恢复步骤
shutdownabort; startupnomount; rmantargetsyscatalogrmanuser@cata run{ allocatechannelc1typedisk; restorecontrolfile; restoredatabase; sql'alterdatabasemount'; recoverdatabase; sql'alterdatabaseopenresetlogs'; releasechannelc1; } RMAN-00571:=========================================================== RMAN-00569:===============ERRORMESSAGESTACKFOLLOWS=============== RMAN-00571:=========================================================== RMAN-03002:failureofrecovercommandat09/08/200517:43:31 RMAN-06054:mediarecoveryrequestingunknownlog:thread1seq9lowscn670233 alterdatabaseopenresetlogs;
做一个full备份:
/home/oracle/dbbat/backup_full.sh
恢复成功
8.损坏临时数据文件
(1)故障模拟
删除临时数据文件:rm /u02/oradata/dbnms/temp01.dbf
关闭数据库:shutdown immediate;
启动数据库:startup;
(2)恢复步骤
alterdatabasetempfile'/u02/oradata/dbnms/temp01.dbf'drop; ERRORatline1: ORA-01516:nonexistentlogfile,datafile,ortempfile "/u02/oradata/dbnms/temp01.dbf" altertablespacetempaddtempfile'/u02/oradata/dbnms/temp01.dbf'size50Mautoextendonnext5Mmaxsizeunlimited;
恢复成功
9.损坏spfile参数文件
(1)故障模拟
删除spfile文件:rm $ORACLE_HOME/dbs/spfiledbnms.ora
关闭数据库:shutdown immediate;
启动数据库:startup;
(2)恢复步骤
startupnomount; rmantargetsyscatalogrmanuser@cata restorespfile; shutdownimmediate; startup;
恢复成功
10.损坏全部文件(包括全部数据文件、控制文件、临时数据文件、联机日志文件)
(1)故障模拟
删除全部文件:rm /u02/oradata/dbnms/*
关闭数据库:shutdown immediate;
ORA-03113:end-of-fileoncommunicationchannel
(2)恢复步骤
sqlplussysassysdba startupnomount; rmantargetsyscatalogrmanuser@cata
还原控制文件:restore controlfile;
还原数据库:restore database;
mount 数据库:alter database mount;
恢复数据库:recover database;
RMAN-00571:=========================================================== RMAN-00569:===============ERRORMESSAGESTACKFOLLOWS=============== RMAN-00571:=========================================================== RMAN-03002:failureofrecovercommandat09/09/200510:33:13 RMAN-06054:mediarecoveryrequestingunknownlog:thread1seq19lowscn718284
用resetlogs方式打开数据库:alter database open resetlogs;
databaseopened newincarnationofdatabaseregisteredinrecoverycatalog startingfullresyncofrecoverycatalog fullresynccomplete
重建临时文件:
sqlplussysassysdba alterdatabasetempfile'/u02/oradata/dbnms/temp01.dbf'drop; ERRORatline1: ORA-01516:nonexistentlogfile,datafile,ortempfile "/u02/oradata/dbnms/temp01.dbf" altertablespacetempaddtempfile'/u02/oradata/dbnms/temp01.dbf'size50Mautoextendonnext5Mmaxsizeunlimited;
执行一次全库备份:/home/oracle/dbbat/backup_full.sh,恢复成功。
关于Oracle数据库损坏文件的修复方法就就介绍到这里了,希望本次的介绍能够带给您一些收获吧!
【编辑推荐】
- 浅析Oracle 10g isqlplus使用DBA账户的方法Oracle数据库中如何检查索引碎片并重建索引数据库优化技术之Oracle数据库动态绑定变量PL/SQL Developer导入导出数据库方法及说明关于在极高负荷下Oracle redolog搭配的一些建议