首先说下故障是如何发生的

Oracle的控制文件(controlfiles)的存放路径,默认情况下是位于:$ORACLE_HOME\oradata\<oracleSID>\目录下;在该目录下存在3个控制文件:CONTROL01.CTL、CONTROL02.CTL、CONTROL03.CTL.

当然这3个控制文件放在同一目录是不安全的,比较安全的方法是将这3个控制文件分别放在不同的路径下,万一控制文件所在的目录损坏,就可以通过位于其他路径的控制文件来进行数据库的重建工作。

因此我打算在测试Oracle服务器上进行一次控制文件移动到其他目录的测试

我犯下的第一个错误:没有备份控制文件就开始测试,正确的做法是

sqlplus /nolog

conn /as sysdba

alter database backup controlfile to trace;

其次我在oracle服务器的不同目录建立了3个文件夹分别是:

D:\oracle_db_lab\controlfiles\disk1

D:\oracle_db_lab\controlfiles\disk3

D:\oracle_db_lab\controlfiles\disk6

然后从dos窗口登陆SQLplus

sqlplu /nolog

conn /as sysdba

host copy D:\oracle\product\oradata\phoenix\control01.ctl D:\oracle_db_lab\controlfiles\disk1\control01.ctl

host copy D:\oracle\product\oradata\phoenix\control02.ctl D:\oracle_db_lab\controlfiles\disk3\control02.ctl

host copy D:\oracle\product\oradata\phoenix\control03.ctl D:\oracle_db_lab\controlfiles\disk6\control03.ctl

这一步提示操作成功

接下来执行

alter system set control_files
=
D:\oracle_db_lab\controlfiles\disk1\control01.ctl',
D:\oracle_db_lab\controlfiles\disk3\control02.ctl',
D:\oracle_db_lab\controlfiles\disk6\control03.ctl'

系统照样提示操作成功。

最后关闭数据库,再启动数据库

shutdown immediate

startup

报错了报错

ORA-01122: 数据库文件 1 验证失败
ORA-01110: 数据文件 1:
'D:\oracle\product\oradata\phoenix\SYSTEM01.DBF'
ORA-01207: 文件比控制文件更新 - 旧的控制文件

悲剧了,咋办呢?

网上google了很久,很多人都说了方法,但是并没有完全说完,当然也有完全说完的,应该是我没google到

重建控制文件

1.关闭数据库:shutdown immediate

2.删除控制文件(不删也行)

3.准备控制文件重建语句:

CREATE CONTROLFILE REUSE DATABASE "PHOENIX" NORESETLOGS ARCHIVELOG
MAXLOGFILES 16
MAXLOGMEMBERS 3
MAXDATAFILES 100
MAXINSTANCES 8
MAXLOGHISTORY 292
LOGFILE
GROUP 1 'D:\ORACLE\PRODUCT\ORADATA\PHOENIX\REDO01.LOG' SIZE 50M,
GROUP 2 'D:\ORACLE\PRODUCT\ORADATA\PHOENIX\REDO02.LOG' SIZE 50M,
GROUP 3 'D:\ORACLE\PRODUCT\ORADATA\PHOENIX\REDO03.LOG' SIZE 50M
DATAFILE
'D:\oracle\product\oradata\phoenix\EXAMPLE01.DBF',
'D:\oracle\product\oradata\phoenix\SYSAUX01.DBF',
'D:\oracle\product\oradata\phoenix\SYSTEM01.DBF',
'D:\oracle\product\oradata\phoenix\UNDOTBS01.DBF',
'D:\oracle\product\oradata\phoenix\USERS01.DBF'
CHARACTER SET ZHS16GBK ;

RECOVER DATABASE

ALTER SYSTEM ARCHIVE LOG ALL;

ALTER DATABASE OPEN;

ALTER TABLESPACE TEMP ADD TEMPFILE 'D:\ORACLE\PRODUCT\ORADATA\PHOENIX\TEMP01.DBF'
SIZE 1024M REUSE AUTOEXTEND ON NEXT 655360 MAXSIZE 3276M;

这个语句怎样才是最符合你自己数据库的要求的呢?就是在最开始的时候备份控制文件后的*.trc文件中获取的,但是我在做这些操作之前,都没有备份控制文件!!

最后这个语句是公司生产数据库控制文件备份后的.trc文件的来的

执行完这个语句后,会在'D:\ORACLE\PRODUCT\ORADATA\PHOENIX'生产一个控制文件'control01.ctl',并且数据库处于正常打开状态;

通过sqlplus查询控制文件:select * from v$controlfile;

发现有且只有这一个控制文件,咋办?Oracle默认的都是3个控制文件,缺一不可,所以如果现在你shutdown数据库,一会你就哭吧,数据库是启不来的!

另外2个控制文件怎样创建了,手工复制可以吗?当然,host copy行吗?必须的!

关键的一部是,在进行手工复制或host copy这些文件之前进行alter system set controlfiles ='','','';不然,就重复本文的错误了;

所以下面的工作是:

1.alter system set control_files
=
'D:\oracle\product\oradata\phoenix\CONTROL01.CTL',
'D:\oracle\product\oradata\phoenix\CONTROL02.CTL',
'D:\oracle\product\oradata\phoenix\CONTROL03.CTL'
scope=SPFILE;

2.host copy D:\oracle\product\oradata\phoenix\CONTROL01.CTL D:\oracle\product\oradata\phoenix\CONTROL02.CTL

host copy D:\oracle\product\oradata\phoenix\CONTROL01.CTL D:\oracle\product\oradata\phoenix\CONTROL03.CTL

3.重启数据库

shutdown immediate

startup

4.数据库能正常打开了。

god save me!

整个错误的原因是,应该是先alter system...然后再host copy...