在写前面那篇文章的时候,做了一些测试,在启动或关闭数据库的情况下删除了控制文件,由于这个数据库只是我自己使用的测试数据库,当时也没有在意去恢复。
今天想启动这个数据库的时候就碰到了问题:
[oracle@bjtest ~]$ sqlplus "/ as sysdba"
SQL*Plus: Release9.2.0.4.0 - Production on星期三6月3 01:47:42 2009
Copyright (c) 1982, 2002, Oracle Corporation. All rights reserved.
已连接到空闲例程。
SQL> startup
ORACLE例程已经启动。
Total System Global Area 9432971568 bytes
Fixed Size 756016 bytes
Variable Size 838860800 bytes
Database Buffers 8589934592 bytes
Redo Buffers 3420160 bytes
ORA-00214: ???? '/data/oradata/bjtest/control01.ctl' ?? 6178246 ???
'/data/oradata/bjtest/control02.ctl' ?? 6178204 ???
看到这个错误,马上想到了前两天做的那个测试。不过当时具体的测试细节已经记不清了,只是记得删除过控制文件。
这个错误显然就是两个控制文件不一致,那么只需要覆盖错误的控制文件就可以了。
SQL> host
[oracle@bjtest ~]$ cd /data/oradata/bjtest/
[oracle@bjtest bjtest]$ cp control01.ctl control02.ctl
[oracle@bjtest bjtest]$ exit
exit
SQL> alter database mount;
alter database mount
*
ERROR位于第1行:
ORA-00214: ???? '/data/oradata/bjtest/control01.ctl' ?? 6178246 ???
'/data/oradata/bjtest/control03.ctl' ?? 6178204 ???
覆盖了控制文件control02.ctl后,发现控制文件1和控制文件3也是不一致的,莫非出问题的控制文件是control01.ctl。刚才是凭印象觉得control02.ctl有问题,这次不能再凭印象了,为了避免丢失真正的控制文件,先对控制文件进行备份:
SQL> exit
从Oracle9i Enterprise Edition Release9.2.0.4.0 - 64bit Production
With the Partitioning, OLAP and Oracle Data Mining options
JServer Release 9.2.0.4.0 - Production中断开
[oracle@bjtest ~]$ cd /data/oradata/bjtest/
[oracle@bjtest bjtest]$ cp control03.ctl control03.bak
[oracle@bjtest bjtest]$ cp control01.ctl control01.bak
[oracle@bjtest bjtest]$ cp control03.ctl control01.ctl
再次尝试加载控制文件:
[oracle@bjtest ~]$ sqlplus "/ as sysdba"
SQL*Plus: Release9.2.0.4.0 - Production on星期三6月3 01:49:45 2009
Copyright (c) 1982, 2002, Oracle Corporation. All rights reserved.
连接到:
Oracle9i Enterprise Edition Release9.2.0.4.0 - 64bit Production
With the Partitioning, OLAP and Oracle Data Mining options
JServer Release 9.2.0.4.0 - Production
SQL> alter database mount;
alter database mount
*
ERROR位于第1行:
ORA-00214: ???? '/data/oradata/bjtest/control02.ctl' ?? 6178246 ???
'/data/oradata/bjtest/control01.ctl' ?? 6178204 ???
仍然报错,想想也是,由于控制文件control02.ctl已经被控制文件control01.ctl覆盖过,因此刚才的拷贝并不彻底。
SQL> exit
从Oracle9i Enterprise Edition Release9.2.0.4.0 - 64bit Production
With the Partitioning, OLAP and Oracle Data Mining options
JServer Release 9.2.0.4.0 - Production中断开
[oracle@bjtest ~]$ cd /data/oradata/bjtest/
[oracle@bjtest bjtest]$ cp control01.ctl control02.ctl
[oracle@bjtest bjtest]$ sqlplus "/ as sysdba"
SQL*Plus: Release9.2.0.4.0 - Production on星期三6月3 01:50:32 2009
Copyright (c) 1982, 2002, Oracle Corporation. All rights reserved.
连接到:
Oracle9i Enterprise Edition Release9.2.0.4.0 - 64bit Production
With the Partitioning, OLAP and Oracle Data Mining options
JServer Release 9.2.0.4.0 - Production
SQL> alter database mount;
数据库已更改。
SQL> alter database open;
alter database open
*
ERROR位于第1行:
ORA-01122: ????? 1 ????
ORA-01110: ???? 1: '/data/oradata/bjtest/system01.dbf'
ORA-01207: ????????? - ??????
SQL> shutdown immediate
ORA-01109: ??????
已经卸载数据库。
ORACLE例程已经关闭。
这次可以到MOUNT阶段,说明3个控制文件终于一致了,不过数据库打不开。而且错误信息是乱码。
由于刚才的操作有点混乱,重复一次刚才的操作,利用控制文件control03.bak作为控制文件覆盖当前的所有控制文件,并尝试打开数据库:
SQL> host
[oracle@bjtest bjtest]$ cd /data/oradata/bjtest
[oracle@bjtest bjtest]$ cp control03.bak control01.ctl
[oracle@bjtest bjtest]$ cp control03.bak control02.ctl
[oracle@bjtest bjtest]$ cp control03.bak control03.ctl
[oracle@bjtest bjtest]$ exit
exit
SQL> startup
ORACLE例程已经启动。
Total System Global Area 9432971568 bytes
Fixed Size 756016 bytes
Variable Size 838860800 bytes
Database Buffers 8589934592 bytes
Redo Buffers 3420160 bytes
数据库装载完毕。
ORA-01122:数据库文件1验证失败
ORA-01110:数据文件1: '/data/oradata/bjtest/system01.dbf'
ORA-01207:文件比控制文件更新-旧的控制文件
错误依旧,不过这次显示了中文的错误信息。根据这个信息不难判断,control03.ctl这个控制文件不是数据库中最新的控制文件,看来应该使用control01.ctl来作为数据库的控制文件,幸好在覆盖之前做了备份。
SQL> shutdown immediate
ORA-01109:数据库未打开
已经卸载数据库。
ORACLE例程已经关闭。
SQL> host
[oracle@bjtest ~]$ cd /data/oradata/bjtest/
[oracle@bjtest bjtest]$ cp control01.bak control01.ctl
[oracle@bjtest bjtest]$ cp control01.bak control02.ctl
[oracle@bjtest bjtest]$ cp control01.bak control03.ctl
[oracle@bjtest bjtest]$ exit
exit
SQL> startup
ORACLE例程已经启动。
Total System Global Area 9432971568 bytes
Fixed Size 756016 bytes
Variable Size 838860800 bytes
Database Buffers 8589934592 bytes
Redo Buffers 3420160 bytes
数据库装载完毕。
数据库已经打开。
数据库成功打开。恢复过程本身没有什么技术含量,不过想说明几个问题。
首先不要用正式环境进行测试,一旦出现问题后果会很严重,对于测试环境大不了重建,而对于正式环境,影响对外提供服务都是很严重的事情,更不要说数据库损坏甚至是丢失数据了。
为了便于恢复,对数据库进行结构修改应该记录下来,对于这个例子,如果有详细的修改记录,就会知道到底那个控制文件是最新的。
备份的重要性。这个例子中在覆盖control01.ctl文件前进行了备份,使得数据库最终可以顺利的打开。当然,即使没有控制文件的备份,数据库也可以通过重建控制文件或RECOVER等方式打开,但是毕竟要比恢复控制文件的备份要麻烦。何况并不是所有的情况缺少备份都是可以恢复的,因此除了数据库的常规备份外,在删除、修改、覆盖等操作进行之前,应该提前做好备份。
oracle视频教程请关注:http://u.youku.com/user_video/id_UMzAzMjkxMjE2.html