第一部分:
介绍下 重建控制文件后,有两种方式打开数据库: resetlog 和 noresetlog:
alter database open resetlog
指定RESETLOGS将重设当前LOG sequence number为1,抛弃所有日志信息。
以下条件需要使用resetlog(说白了,如果你的redo不完整那就resetlog -如果完整,仅仅是控制文件丢了,那就noresetlog,这样不会丢数据):
1)在不完全恢复(介质恢复)
2)使用备份控制文件
举个例子:
重建控制文件适用于所有控制文件都丢失的情况下,流程分为以下几步:
我就这位仁兄的实验简单说说原理吧 :
控制文件的损坏:
法一。使用新的控制文件覆盖旧的控制文件:
法二.a。日志完好,控制文件重建:
1. 插入一个新数据,以看数据是否会受影响
SYS@bj> drop table scott.t3;
drop table scott.t3
*
ERROR at line 1:
ORA-00942: table or view does not exist
SYS@bj> create table scott.t3 as select * from scott.salgrade;
Table created.
SYS@bj> select count(*) from scott.t3;
COUNT(*)
----------
5
2. 破坏控制文件
SYS@bj> select 'host echo 111 > ' || name from v$controlfile;
'HOSTECHO111>'||NAME
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
host echo 111 > /u01/app/oracle/oradata/beijing/control01.ctl
host echo 111 > /u01/app/oracle/oradata/beijing/control02.ctl
执行破坏,破坏后,切换日志:
SYS@bj> alter system switch logfile;
alter system switch logfile
*
ERROR at line 1:
ORA-03113: end-of-file on communication channel
报错,不在连接到通信终止。:因为控制文件丢了,没法将scn等变化写入到控制文件了。
Oracle实例崩溃
SYS@bj> ho ps -ef | grep ora_
oracle 5764 5465 0 20:37 pts/8 00:00:00 /bin/bash -c ps -ef | grep ora_
oracle 5766 5764 0 20:37 pts/8 00:00:00 grep ora_
3.显示连接到空闲实例:
SYS@bj> conn / as sysdba
Connected to an idle instance.
SYS@bj> startup
ORACLE instance started.
Total System Global Area 293601280 bytes
Fixed Size 1219016 bytes
Variable Size 234882616 bytes
Database Buffers 50331648 bytes
Redo Buffers 7168000 bytes
ORA-00205: error in identifying control file, check alert log for more info
alert log中有如下一段描述:
ALTER DATABASE MOUNT
Mon Mar 14 20:38:54 2011
ORA-00202: control file: '/u01/app/oracle/oradata/beijing/control01.ctl'
ORA-27047: unable to read the header block of file : 看见没赤裸裸的提示:找不到文件头-- 控制文件头都找不到怎么读取啊!!
Additional information: 2
Mon Mar 14 20:38:54 2011
ORA-205 signalled during: ALTER DATABASE MOUNT...
说明不能读取到文件头!悲剧发生,重建控制文件!
4. 万幸由于,日志,数据均健在,所以,套模板格式,重建控制文件:
create controlfile reuse database "BEIJING" noresetlogs archivelog : 这位仁兄采用的是 noresetlog方式:因为redo健全,当然采用这种方式,而且不会丢失数据:
maxlogfiles 16
maxlogmembers 3
maxdatafiles 100
maxinstances 8
maxloghistory 292
datafile
'/u01/app/oracle/oradata/beijing/system01.dbf',
'/u01/app/oracle/oradata/beijing/sysaux01.dbf',
'/u01/app/oracle/oradata/beijing/undotbs01.dbf',
'/u01/app/oracle/oradata/beijing/user01.dbf',
'/u01/app/oracle/oradata/beijing/user02.dbf',
'/u01/app/oracle/oradata/beijing/xx.dbf',
'/u01/app/oracle/oradata/beijing/yy.dbf'
logfile
group 1 '/u01/app/oracle/oradata/beijing/redo01.log',
group 2 '/u01/app/oracle/oradata/beijing/redo02.log',
group 3 '/u01/app/oracle/oradata/beijing/redo03.log'
character set we8iso8859p1
/
重建完控制文件后,数据库已经自动mount
SYS@bj> select status from v$instance;
STATUS
------------
MOUNTED
5. 但是,此时打开数据文件却需要恢复:
SYS@bj> alter database open;
alter database open
*
ERROR at line 1:
ORA-01113: file 1 needs media recovery
ORA-01110: data file 1: '/u01/app/oracle/oradata/beijing/system01.dbf' :从第一个数据文件开始检查,发现需要进行恢复,因为数据头的scn号和最早的那个redo log scn号不匹配。
可以采用一个一个恢复的方式:
SYS@bj> recover datafile 1;
Media recovery complete.
更好的方法是:
SYS@bj> recover database; // 恢复全部的数据文件----
Media recovery complete.
我们来比较下没有被破坏前和恢复之后,控制文件的大小:
没被破坏之前:
[oracle@milo beijing]$ ll control0*
-rw-r----- 1 oracle oinstall 7389184 Mar 14 20:35 control01.ctl
-rw-r----- 1 oracle oinstall 7389184 Mar 14 20:35 control02.ctl
恢复之后:
[oracle@milo beijing]$ ll control0*