Oracle重建控制文件的问题
首先说下故障是如何发生的
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...