您的位置:首页 > 数据库 > Oracle

oracle技术之oracle一次控制文件损坏的恢复

2013-05-15 10:53 405 查看
在写前面那篇文章的时候,做了一些测试,在启动或关闭数据库的情况下删除了控制文件,由于这个数据库只是我自己使用的测试数据库,当时也没有在意去恢复。
今天想启动这个数据库的时候就碰到了问题:
[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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息