Oracle重建控制文件的实例教程
前言
控制文件(controlfile)是一个相当小的文件(最多能增长到64M左右),其中包含Oracle需要的其他文件的一个目录。参数文件告知实例控制文件的位置,控制文件则告知示例数据库和在线重做日志文件的位置。控制文件还告知了Oracle其他一些事情,如已发生检查点的有关信息、数据库名(必须和db_name参数匹配)、创建数据库的时间戳、归档重做日志的历史(有时这会让控制文件变大)、RMAN信息等。
环境:OEL5.7+Oracle10.2.0.5
背景:在Oracle的运维过程中,时常会遇到一些场景是需要重建控制文件才可以解决的。本文的场景可以通过复制控制文件到新路径,运行一段时间后,再用老的控制文件启动数据库重现。
1.当前故障现象
在使用旧的控制文件启动数据库时,报错ORA-01122、ORA-01110、ORA-01207:
SQL>shutdownabort ORACLEinstanceshutdown. SQL>startup ORACLEinstancestarted. TotalSystemGlobalArea599785472bytes FixedSize2098112bytes VariableSize218106944bytes DatabaseBuffers373293056bytes RedoBuffers6287360bytes Databasemounted. ORA-01122:databasefile1failedverificationcheck ORA-01110:datafile1:'/oradata/cxywdb/system01.dbf' ORA-01207:fileismorerecentthancontrolfile-oldcontrolfile
2.分析故障原因
根据报错信息查找MOS文档:
ORA-1122,ORA-1110,ORA-1207whileopenthedatabaseaftercrash(文档ID283927.1)
延伸思考一下,为什么会这样?
主要错误是ORA-01207,利用oerr工具看到Oralce对这个错误的详细描述是:
01207,00000,"fileismorerecentthancontrolfile-oldcontrolfile"
//*Cause: Thecontrolfilechangesequencenumberinthedatafileis
// greaterthanthenumberinthecontrolfile.Thisimpliesthat
// thewrongcontrolfileisbeingused.Notethatrepeatedlycausing
// thiserrorcanmakeitstophappeningwithoutcorrectingthereal
// problem.Everyattempttoopenthedatabasewilladvancethe
// controlfilechangesequencenumberuntilitisgreatenough.
//*Action:Usethecurrentcontrolfileordobackupcontrolfilerecoveryto
// makethecontrolfilecurrent.Besuretofollowallrestrictions
// ondoingabackupcontrolfilerecovery.
一般遇到这种情况,当前的控制文件肯定是找不到了。那么就得考虑重建控制文件来解决,MOS给出的建议也是重建控制文件。
3.重建控制文件
重建控制文件的核心步骤:
3.1备份控制文件到trace
startupmount alterdatabasebackupcontrolfiletotrace; oradebugsetmypid oradebugtracefile_name
3.2启动数据库到nomount状态
shutdownabort startupnomount;
3.3确认重建控制文件的语句
vicontrol.sql CREATECONTROLFILEREUSEDATABASE"CXYWDB"NORESETLOGSFORCELOGGINGARCHIVELOG MAXLOGFILES16 MAXLOGMEMBERS3 MAXDATAFILES100 MAXINSTANCES8 MAXLOGHISTORY292 LOGFILE GROUP5'/oradata2/cxywdb/redo11.log'SIZE50M, GROUP6'/oradata2/cxywdb/redo12.log'SIZE50M, GROUP7'/oradata2/cxywdb/redo13.log'SIZE50M --STANDBYLOGFILE DATAFILE '/oradata/cxywdb/system01.dbf', '/oradata/cxywdb/undotbs01.dbf', '/oradata/cxywdb/sysaux01.dbf', '/oradata/cxywdb/users01.dbf', '/oradata/cxywdb/alfred01.dbf', '/oradata/cxywdb/alfred02.dbf', '/oradata/cxywdb/alfred03.dbf', '/oradata/cxywdb/alfred04.dbf', '/oradata/cxywdb/alfred05.dbf', '/oradata/cxywdb/dbs_i_alfred01.dbf' CHARACTERSETZHS16GBK ;
3.4恢复并打开数据库
SQL>recoverdatabase; Mediarecoverycomplete. SQL>alterdatabaseopen; Databasealtered.
附:实际解决过程如下:
SQL>shutdownabort ORACLEinstanceshutdown. SQL>startupmount ORACLEinstancestarted. TotalSystemGlobalArea599785472bytes FixedSize2098112bytes VariableSize218106944bytes DatabaseBuffers373293056bytes RedoBuffers6287360bytes Databasemounted. SQL>alterdatabasebackupcontrolfiletotrace; Databasealtered. SQL>oradebugsetmypid Statementprocessed. SQL>oradebugtracefile_name /s01/oracle/admin/cxywdb/udump/cxywdb_ora_3983.trc SQL>shutdownabort ORACLEinstanceshutdown. SQL>startupnomount; ORACLEinstancestarted. TotalSystemGlobalArea599785472bytes FixedSize2098112bytes VariableSize218106944bytes DatabaseBuffers373293056bytes RedoBuffers6287360bytes SQL>@control Controlfilecreated. SQL>selectstatusfromv$instance; STATUS ------------ MOUNTED SQL>recoverdatabase; Mediarecoverycomplete. SQL>alterdatabaseopen; Databasealtered.
总结
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对毛票票的支持。