损坏单个控制文件是比较容易恢复的,因为数据库系统,控制文件都不是一个,而且所有的控制文件都互为镜像,只要拷贝一个好的控制文件替换坏的控制文件就可以。实验如下:
1) 查看系统的控制文件
SQL> select name from v$controlfile;
NAME
--------------------------------------------------------------------------------
F:\APP\YANG\ORADATA\ORACL\CONTROL01.CTL
F:\APP\YANG\ORADATA\ORACL\CONTROL02.CTL
F:\APP\YANG\ORADATA\ORACL\CONTROL03.CTL
SQL> shutdown immediate
2)关闭数据库,模拟单个控制文件损坏。
数据库已经关闭。
已经卸载数据库。
ORACLE 例程已经关闭。
SQL> host del f:\app\yang\oradata\oracl\control01.ctl
SQL> startup
ORA-32004: obsolete and/or deprecated parameter(s) specified
ORACLE 例程已经启动。
Total System Global Area 535662592 bytes
Fixed Size 1334380 bytes
Variable Size 138412948 bytes
Database Buffers 390070272 bytes
Redo Buffers 5844992 bytes
ORA-00205: ?????????, ??????, ???????
---设置编码后, set nls_lang=american_america.zhs16gbk
ORA-00205:error in identifying control file, check alert log for more info. 在这里,很明显,就是control文件缺失了.
SQL> shutdown immediate
ORA-01507: ??????
ORACLE 例程已经关闭。
SQL> startup
ORACLE 例程已经启动。
Total System Global Area 535662592 bytes
Fixed Size 1334380 bytes
Variable Size 138412948 bytes
Database Buffers 390070272 bytes
Redo Buffers 5844992 bytes
ORA-00214: control file ''F:\APP\YANG\ORADATA\ORACL\CONTROL02.CTL'' version 8271 inconsistent with file
''F:\APP\YANG\ORADATA\ORACL\CONTROL01.CTL'' version 8261
---这表示文件CONTROL01.CTL'版本比CONTROL02.CTL'版本低, 二者不同导致的.
3)拷贝一个好的控制文件替换坏的控制文件或修改spfile中的控制文件参数。在这里我是可以以CONTROL03.CTL重建 。
SQL> alter system set control_files=
2 'f:\app\yang\oradata\oracl\control03.ctl' scope=spfile;
SQL> shutdown immediate
ORACLE 例程已经关闭
SQL> startup mount
ORACLE 例程已经启动。
Total System Global Area 535662592 bytes
Fixed Size 1334380 bytes
Variable Size 138412948 bytes
Database Buffers 390070272 bytes
Redo Buffers 5844992 bytes
数据库装载完毕。
SQL> alter database open;
数据库已更改
SQL> select name from v$controlfile;
NAME
--------------------------------------------------------------------------------
F:\APP\YANG\ORADATA\ORACL\CONTROL03.CTL
---此时该数据库只有一个控制文件,在生产环境中必须在空闲的时候应该增加新的控制文件
小结:
整个实验的详细步骤
1. 首先 关闭数据库库 shutdown immediate
2. 拷贝备份三个控制文件 CONTROL01.CTL, CONTROL02.CTL, CONTROL03.CTL
3. 删除CONTROL02.CTL
4. 装载数据库 startup mount, 出现ORA-00205:?????????,?????,???????错误
怎么会有乱码?
5. 退出sqlplus, 设置编码, set nls_lang=american_america.zhs16gbk
6. sqlplus 连入, startup mount, 这次没有乱码了,错误提示:ORA-00205:error in identifying control file, check alert log for more info. 在这里,很明显,就是control文件缺失了.
7. 拷贝原来的控制文件备份CONTROL02.CTL到数据库的ORADATA目录下
8. 如果直接再次startup mount, 会出现ORA-01081: cannot start already-running ORACLE - shut it down first.
9. 既然提示了,就关掉它. shutdown immediate
10. startup mount 结果出现ORA-00214: ORA-00214: control file ''F:\APP\YANG\ORADATA\ORACL\CONTROL02.CTL'' version 8271 inconsistent with file
''F:\APP\YANG\ORADATA\ORACL\CONTROL01.CTL'' version 8261 , 这表示文件CONTROL02.CTL'版本比CONTROL01.CTL'版本低, 二者不同导致的.
11. a) 以CONTROL01.CTL重建,
alter system set control_files=
2 'f:\app\yang\oradata\oracl\control03.ctl' scope=spfile;
b) 备份所有文件,根据Step10 提示把版本低的删掉, 复制版本高的,然后粘贴重命名也可以,其实后面我写的关于为数据库添加控制文件就是按照这个方法。
12. shutdown immediate
13. startup mount, 提示Database mounted,表示装载成功
14. ALTER DATABASE OPEN; 出现Database altered, 成功.