13.3无备份恢复控制文件
没有备份恢复控制文件其实就是在nomount状态,create control创建一个新的控制文件。
dba必须知道4个信息才能正确的创建:数据库名、在线日志路径及其大小、在线的可读/写数据文件路径、数据库字符集
其中指定数据库字符集是为了在打开数据库之前执行recover tablespace ..或restore tablespace时可以正确解析表空间名称
--之前在dsi系列介绍了使用bbed查看数据文件头的方式来确定字符集,数据库名等方法。
--maxlogfiles 在线重做日志组数量上限的初始值,能够自动增长 --maxlogmembers日志组内在线日志数量上限的初始值,能够自动增长 --maxloghistory 记录最近产生的日志历史数量上限的初始值,能够自动增长 --maxdatafiles 数据文件数量上限的初始值,能够自动增长,但不能超过data_files的值。 --maxinstances 能够同时打开数据库的实例数,针对RAC环境必须确保该值大于或等于集群中的节点数
--在线日志无损情况下的重建
SQL>STARTUP NOMOUNT CREATE CONTROLFILE REUSE DATABASE "ORCL" NORESETLOGS ARCHIVELOG SQL> recover database; SQL> alter database open; SQL> select * from v$tempfile; 添加临时表空间 ##添加临时表空间 SQL> ALTER TABLESPACE TEMP ADD TEMPFILE '/u01/app/oracle/oradata/orcl/temp01.dbf' SIZE 61865984 REUSE AUTOEXTEND ON NEXT 655360 MAXSIZE 32767M; 如果没有使用catalog,在重建控制文件后,原先保留在控制文件的备份、归档日志信息全部丢失 RMAN> list bakcup; RMAN> catalog db_recovery_file_des; ##使用catalog命令将他们寻回 RMAN> report need backup;
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
SQL>CREATE CONTROLFILE REUSE DATABASE "ORCL" NORESETLOGS ARCHIVELOG MAXLOGFILES 16 MAXLOGMEMBERS 3 MAXDATAFILES 100 MAXINSTANCES 8 MAXLOGHISTORY 292 LOGFILE GROUP 1 '/u01/app/oracle/oradata/orcl/redo01.log' SIZE 50M BLOCKSIZE 512, GROUP 2 '/u01/app/oracle/oradata/orcl/redo02.log' SIZE 50M BLOCKSIZE 512, GROUP 3 '/u01/app/oracle/oradata/orcl/redo03.log' SIZE 50M BLOCKSIZE 512 -- STANDBY LOGFILE DATAFILE '/u01/app/oracle/oradata/orcl/system01.dbf', '/u01/app/oracle/oradata/orcl/sysaux01.dbf', '/u01/app/oracle/oradata/orcl/undotbs01.dbf', '/u01/app/oracle/oradata/orcl/users01.dbf', '/u01/app/oracle/oradata/orcl/test01.dbf' CHARACTER SET AL32UTF8 ;
--在线日志损坏情况下的重建
控制文件损坏且没有备份,同时损坏的还有在线日志(current),分别采用重建控制文件和不完全恢复解决
SQL> STARTUP NOMOUNT
CREATE CONTROLFILE REUSE DATABASE "ORCL" RESETLOGS ARCHIVELOG
因为控制文件是新建的,此时v$logv$log_history不能提供任何与检查点进度有关的信息。
明知道是不完全恢复,但可以让rman首先尝试一次完全恢复,看看它能走多远,在没有使用catalog的情况下,使用catalog将备份和归档日志重新录入新的控制文件内
RMAN> catalog db_recovery_file_dest; RMAN> run { restore database; recover database; } ... RMAN-06054:media recovery requesting unknown archived log for thead 1 with sequence 22 and starting SCN of 1082040 会看到到22号日志就无法进行了,不完全恢复可以登场了 RMAN> recover database until sequence 22; RMAN> alter database open resetlogs; 最后添加临时表空间
--具有只读数据文件情况下的重建
“create database”命令datafile子句中不可以声明只读表空间的数据文件,它必须“缺席”,否则控制文件会将只读数据文件当成可读/写的在线数据文件处理
因为只读的数据文件没有任何更新,头部的SCN可能很低,低到库存的归档日志不够而无法恢复该文件,所以,在重建控制文件前,需要确认数据库有没有只读数据文件,如果有,必须特殊处理
--1 启动到nomount --2 create controlfile创建新的控制文件,其中datafile子句不包含只读数据文件 --3 在mount执行recover database恢复数据库。若RMAN-06504错误继续执行SQLPLUS的recover database using backup controlfile命令,在Specify log提示符出现后输入正确的日志路径 --4 尝试用noresetlogs打开数据库,若不行用resetlogs打开 --5 修正只读数据文件的路径 --6执行alter tablespace ... online将只读表空间上线 --7 添加临时表空间
--SQL> create controlfile --RMAN> catalog db_recovery_file_dest --RMAN> recover database(rman-06054) --SQL> select sequence# from v$archived_Log order by 1; --SQL>v$Log,v$logfile --SQL> recover database using backup controfile; Specify log: {<RET>=suggested | filename | AUTO | CANCEL} --SQL> alter database open resetlogs; --SQL> alter tablespace test1 online; --SQL> alter tablepsace temp add tempfile ‘’;
--使用控制文件快照恢复
实际上,控制文件还可能有一个“隐藏”的备份,那就是控制文件快照(control file snapshot),它相当于控制文件的镜像复制,默认路径
[oracle@DSI trace]$ cd $ORACLE_HOME/dbs
-rw-r----- 1 oracle oinstall 10043392 Jul 29 09:57 snapcf_orcl.f
只要曾经备份过控制文件或catalog发生过同步操作,快照就存在
使用快照恢复的一般步骤和使用控制文件镜像复制恢复是一致的
--1 将快照cp到控制文件的路径上 --2 启动到mount --3 使用RMAN的recover database或者sqlplus的recover database using backup controlfile恢复数据库 --4 打开数据库
或者使用快照生成create controlfile命令
SQL> alter database backup controlfile to trace;
13.4 恢复数据文件
没有备份,数据文件可以在控制文件和数据字典的帮助下通过重做日志恢复,当然不是所有的数据文件都可以在没有备份的情况下恢复,若没有备份,普通数据文件可以在控制文件和数据字典的帮助下通过重做日志恢复。
无备份数据文件的恢复的主要步骤
--1 使用alter database create datafile创建新的空白数据文件 --2 使用recover datafile利用空白数据文件创建以来的所有重做日志恢复该文件
场景:test的数据文件test01.dbf丢失,数据库启动到mount状态报错,但是test自创建以来没有备份
SQL> startup ORA-01157 : cannot identify/lock data file 6 - see DBWR trace file ORA-01110: data file 6 ... SQL> alter database datafile 6 offline; SQL> alter database open; SQL> alter database create datafile 6; RMAN> recover datafile 6; SQL> alter database datafile 6 online;