control_file是oracle数据库中很重要的一部分,它存放了启动oracle数据库的必要信息,如:数据库名称、数据库创建信息、表空间信息、数据文件信息、日志文件信息、备份信息、检查点信息等......无论是启动数据库或者数据库在运行的时候这个文件都启着重要的作用,如果数据库找不到这个文件的位置,数据库将会报错,无法正常运行。
这里做一个简单的测试:
数据库环境如下:
图片
OS:
Redhat Enterprise Linux 6.3 x86_64
首先启动数据库
SQL> startup
ORACLE instance started.
Total System Global Area 557842432 bytes
Fixed Size 2085456 bytes
Variable Size 155192752 bytes
Database Buffers 394264576 bytes
Redo Buffers 6299648 bytes
Database mounted.
Database opened.
查看当前控制文件所在位置
SQL> show parameter control_files;
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
control_files string /oracle/app/oradata/orcl/contr
ol01.ctl, /oracle/app/oradata/
orcl/control02.ctl, /oracle/ap
p/flash_recovery_area/ORCL/con
trol03.ctl
可以发现我们现在有三个控制文件,分别是control01.ctl、control02.ctl、control03.ctl,其中01和02控制文件放在了同一个目录下,03放在快速恢复区,现在我来给02控制文件改个名字使数据库找不到它,看看数据库报什么错。
先来到02所在的目录下
[oracle@ww ~]$ cd /oracle/app/oradata/orcl/
[oracle@ww orcl]$ pwd
/oracle/app/oradata/orcl
[oracle@ww orcl]$ ls -l control0*
-rw-r----- 1 oracle dba 7061504 Jan 5 21:05 control01.ctl
-rw-r----- 1 oracle dba 7061504 Jan 5 21:05 control02.ctl
修改control02.ctl名字
[oracle@ww orcl]$ mv control02.ctl control02.ctl.bak
[oracle@ww orcl]$ ls -l control0*
-rw-r----- 1 oracle dba 7061504 Jan 5 21:05 control01.ctl
-rw-r----- 1 oracle dba 7061504 Jan 5 21:05 control02.ctl.bak
修改成功~!
然后看看数据库这边的情况
连接到sysdba,随便查一个视图
SQL> conn / as sysdba
Connected.
SQL> select name from v$datafile;
select name from v$datafile
*
ERROR at line 1:
ORA-00210: cannot open the specified control file
ORA-00202: control file: '/oracle/app/oradata/orcl/control02.ctl'
ORA-27041: unable to open file
Linux-x86_64 Error: 2: No such file or directory
Additional information: 3
报错了~!
它说无法打开'/oracle/app/oradata/orcl/control02.ctl'这个文件
没有找到这个文件或目录
说明control02.ctl这个文件已经不存在,刚才以改control02.ctl名字的方式来模拟控制文件丢失成功,当前数据库已无法正常使用。
现在马上把名字改回去然后重新连接数据库就好了
[oracle@ww orcl]$ mv control02.ctl.bak control02.ctl
[oracle@ww orcl]$ ls -l control0*
-rw-r----- 1 oracle dba 7061504 Jan 5 21:15 control01.ctl
-rw-r----- 1 oracle dba 7061504 Jan 5 21:15 control02.ctl
重新连接数据库
SQL> conn / as sysdba
Connected.
SQL> select name from v$datafile;
NAME
--------------------------------------------------------------------------------
/oracle/app/oradata/orcl/system01.dbf
/oracle/app/oradata/orcl/undotbs01.dbf
/oracle/app/oradata/orcl/sysaux01.dbf
/oracle/app/oradata/orcl/users01.dbf
/oracle/app/oradata/orcl/whj.dbf
控制文件是一个二进制文件,由oracle自行维护,一个Oracle数据库至少有一个控制文件,鉴于控制文件的重要性,在默认情况下,Oracle会有三份一模一样的控制文件进行冗余,三份文件的一致性由Oracle自行维护。建议控制文件至少有两份,分别放在不同磁盘下,以提高可用性。
下面我来模拟修改一下控制文件的路径:
先查看一下控制文件位置
SQL> show parameter control_files;
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
control_files string /oracle/app/oradata/orcl/contr
ol01.ctl, /oracle/app/oradata/
orcl/control02.ctl, /oracle/ap
p/flash_recovery_area/ORCL/con
trol03.ctl
发现control01.ctl和control02.ctl还在同一个位置,我把control02.ctl换个位置,放到/home/oracle下
[oracle@ww orcl]$ mv control02.ctl /home/oracle/control02.ctl
[oracle@ww orcl]$ cd /home/oracle
[oracle@ww ~]$ ls -l control02.ctl
-rw-r----- 1 oracle dba 7061504 Jan 5 22:03 control02.ctl
查看刚才那个目录control02.ctl已经不存在
[oracle@ww orcl]$ ls -l control*
-rw-r----- 1 oracle dba 7061504 Jan 5 22:05 control01.ctl
[oracle@ww orcl]$ pwd
/oracle/app/oradata/orcl
然后关闭数据库
SQL> shutdown immediate
Database closed.
Database dismounted.
ORACLE instance shut down.
现在启动数据库肯定会报错
SQL> startup
ORACLE instance started.
Total System Global Area 557842432 bytes
Fixed Size 2085456 bytes
Variable Size 155192752 bytes
Database Buffers 394264576 bytes
Redo Buffers 6299648 bytes
ORA-00205: error in identifying control file, check alert log for more info
检查到控制文件错误,让我们去检查报警日志文件信息
报警日志文件目录如下:
[oracle@ww bdump]$ pwd
/oracle/app/admin/orcl/bdump
跟踪一下报警日志文件
[oracle@ww bdump]$ tail -f alert_orcl.log
再次启动数据库报警日志显示以下错误
ORA-00202: control file: '/oracle/app/oradata/orcl/control02.ctl'
ORA-27037: unable to obtain file status
Linux-x86_64 Error: 2: No such file or directory
Additional information: 3
Sun Jan 5 22:18:41 2014
ORA-205 signalled during: ALTER DATABASE MOUNT...
无法获取文件 '/oracle/app/oradata/orcl/control02.ctl'
没有这个文件或目录
下面是解决方法:
[oracle@ww dbs]$ pwd
/oracle/app/product/10.2.0/db_1/dbs
[oracle@ww dbs]$ ll
total 6948
-rw-r----- 1 oracle dba 112 Dec 5 02:04 alert_orcl.log
-rw-rw---- 1 oracle dba 1552 Jan 5 22:18 hc_orcl.dat
-rw-r----- 1 oracle dba 8385 Sep 11 1998 init.ora
-rw-r--r-- 1 oracle dba 12920 May 3 2001 initdw.ora
-rw-r----- 1 oracle dba 2441 Jan 5 20:19 initorcl.ora
-rw-r----- 1 oracle dba 24 Nov 26 07:33 lkORCL
-rw-r----- 1 oracle dba 1536 Dec 5 02:37 orapworcl
-rw-r----- 1 oracle dba 7061504 Dec 6 07:31 snapcf_orcl.f
-rw-r----- 1 oracle dba 2560 Jan 5 20:57 spfileorcl.ora
/oracle/app/product/10.2.0/db_1/dbs目录下,有个spfile实例名.ora文件
将数据库启动到nomount状态
SQL> startup nomount;
ORACLE instance started.
Total System Global Area 557842432 bytes
Fixed Size 2085456 bytes
Variable Size 155192752 bytes
Database Buffers 394264576 bytes
Redo Buffers 6299648 bytes
以刚才的spfile生成一个pfile文件
SQL> create pfile='$ORACLE_HOME/dbs/pfileorcl.ora' from spfile='$ORACLE_HOME/dbs/spfileorcl.ora';
File created.
修改pfile
vi pfileorcl.ora
*.control_files='/oracle/app/oradata/orcl/control01.ctl','/oracle/app/oradata/orcl/control02.ctl','/oracle/app/flash_recovery_area/ORCL/control03.ctl'这项指定控制文件路径的参数,把第二个control02.ctl的路径改成/home/oracle/control02.ctl即可。
*.control_files='/oracle/app/oradata/orcl/control01.ctl','/home/oracle/control02.ctl','/oracle/app/flash_recovery_area/ORCL/control03.ctl'
保存退出~!
然后指定pfile文件路径启动数据库
SQL> startup pfile='$ORACLE_HOME/dbs/pfileorcl.ora'
ORACLE instance started.
Total System Global Area 557842432 bytes
Fixed Size 2085456 bytes
Variable Size 155192752 bytes
Database Buffers 394264576 bytes
Redo Buffers 6299648 bytes
Database mounted.
Database opened.
OK数据库启动完毕~!
最后再将这个pfile生成一个spfile文件将以前的spfile覆盖
SQL> create spfile='$ORACLE_HOME/dbs/spfileorcl.ora' from pfile='$ORACLE_HOME/dbs/pfileorcl.ora';
File created.
重启数据库
SQL> shutdown immediate
Database closed.
Database dismounted.
ORACLE instance shut down.
SQL> startup
ORACLE instance started.
Total System Global Area 557842432 bytes
Fixed Size 2085456 bytes
Variable Size 155192752 bytes
Database Buffers 394264576 bytes
Redo Buffers 6299648 bytes
Database mounted.
Database opened.
重启正常
再查看控制文件位置
SQL> show parameter control_files;
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
control_files string /oracle/app/oradata/orcl/contr
ol01.ctl, /home/oracle/control
02.ctl, /oracle/app/flash_reco
very_area/ORCL/control03.ctl
control02.ctl文件位置已经更换到/home/oracle下
测试成功~!
这里做一个简单的测试:
数据库环境如下:
图片
OS:
Redhat Enterprise Linux 6.3 x86_64
首先启动数据库
SQL> startup
ORACLE instance started.
Total System Global Area 557842432 bytes
Fixed Size 2085456 bytes
Variable Size 155192752 bytes
Database Buffers 394264576 bytes
Redo Buffers 6299648 bytes
Database mounted.
Database opened.
查看当前控制文件所在位置
SQL> show parameter control_files;
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
control_files string /oracle/app/oradata/orcl/contr
ol01.ctl, /oracle/app/oradata/
orcl/control02.ctl, /oracle/ap
p/flash_recovery_area/ORCL/con
trol03.ctl
可以发现我们现在有三个控制文件,分别是control01.ctl、control02.ctl、control03.ctl,其中01和02控制文件放在了同一个目录下,03放在快速恢复区,现在我来给02控制文件改个名字使数据库找不到它,看看数据库报什么错。
先来到02所在的目录下
[oracle@ww ~]$ cd /oracle/app/oradata/orcl/
[oracle@ww orcl]$ pwd
/oracle/app/oradata/orcl
[oracle@ww orcl]$ ls -l control0*
-rw-r----- 1 oracle dba 7061504 Jan 5 21:05 control01.ctl
-rw-r----- 1 oracle dba 7061504 Jan 5 21:05 control02.ctl
修改control02.ctl名字
[oracle@ww orcl]$ mv control02.ctl control02.ctl.bak
[oracle@ww orcl]$ ls -l control0*
-rw-r----- 1 oracle dba 7061504 Jan 5 21:05 control01.ctl
-rw-r----- 1 oracle dba 7061504 Jan 5 21:05 control02.ctl.bak
修改成功~!
然后看看数据库这边的情况
连接到sysdba,随便查一个视图
SQL> conn / as sysdba
Connected.
SQL> select name from v$datafile;
select name from v$datafile
*
ERROR at line 1:
ORA-00210: cannot open the specified control file
ORA-00202: control file: '/oracle/app/oradata/orcl/control02.ctl'
ORA-27041: unable to open file
Linux-x86_64 Error: 2: No such file or directory
Additional information: 3
报错了~!
它说无法打开'/oracle/app/oradata/orcl/control02.ctl'这个文件
没有找到这个文件或目录
说明control02.ctl这个文件已经不存在,刚才以改control02.ctl名字的方式来模拟控制文件丢失成功,当前数据库已无法正常使用。
现在马上把名字改回去然后重新连接数据库就好了
[oracle@ww orcl]$ mv control02.ctl.bak control02.ctl
[oracle@ww orcl]$ ls -l control0*
-rw-r----- 1 oracle dba 7061504 Jan 5 21:15 control01.ctl
-rw-r----- 1 oracle dba 7061504 Jan 5 21:15 control02.ctl
重新连接数据库
SQL> conn / as sysdba
Connected.
SQL> select name from v$datafile;
NAME
--------------------------------------------------------------------------------
/oracle/app/oradata/orcl/system01.dbf
/oracle/app/oradata/orcl/undotbs01.dbf
/oracle/app/oradata/orcl/sysaux01.dbf
/oracle/app/oradata/orcl/users01.dbf
/oracle/app/oradata/orcl/whj.dbf
控制文件是一个二进制文件,由oracle自行维护,一个Oracle数据库至少有一个控制文件,鉴于控制文件的重要性,在默认情况下,Oracle会有三份一模一样的控制文件进行冗余,三份文件的一致性由Oracle自行维护。建议控制文件至少有两份,分别放在不同磁盘下,以提高可用性。
下面我来模拟修改一下控制文件的路径:
先查看一下控制文件位置
SQL> show parameter control_files;
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
control_files string /oracle/app/oradata/orcl/contr
ol01.ctl, /oracle/app/oradata/
orcl/control02.ctl, /oracle/ap
p/flash_recovery_area/ORCL/con
trol03.ctl
发现control01.ctl和control02.ctl还在同一个位置,我把control02.ctl换个位置,放到/home/oracle下
[oracle@ww orcl]$ mv control02.ctl /home/oracle/control02.ctl
[oracle@ww orcl]$ cd /home/oracle
[oracle@ww ~]$ ls -l control02.ctl
-rw-r----- 1 oracle dba 7061504 Jan 5 22:03 control02.ctl
查看刚才那个目录control02.ctl已经不存在
[oracle@ww orcl]$ ls -l control*
-rw-r----- 1 oracle dba 7061504 Jan 5 22:05 control01.ctl
[oracle@ww orcl]$ pwd
/oracle/app/oradata/orcl
然后关闭数据库
SQL> shutdown immediate
Database closed.
Database dismounted.
ORACLE instance shut down.
现在启动数据库肯定会报错
SQL> startup
ORACLE instance started.
Total System Global Area 557842432 bytes
Fixed Size 2085456 bytes
Variable Size 155192752 bytes
Database Buffers 394264576 bytes
Redo Buffers 6299648 bytes
ORA-00205: error in identifying control file, check alert log for more info
检查到控制文件错误,让我们去检查报警日志文件信息
报警日志文件目录如下:
[oracle@ww bdump]$ pwd
/oracle/app/admin/orcl/bdump
跟踪一下报警日志文件
[oracle@ww bdump]$ tail -f alert_orcl.log
再次启动数据库报警日志显示以下错误
ORA-00202: control file: '/oracle/app/oradata/orcl/control02.ctl'
ORA-27037: unable to obtain file status
Linux-x86_64 Error: 2: No such file or directory
Additional information: 3
Sun Jan 5 22:18:41 2014
ORA-205 signalled during: ALTER DATABASE MOUNT...
无法获取文件 '/oracle/app/oradata/orcl/control02.ctl'
没有这个文件或目录
下面是解决方法:
[oracle@ww dbs]$ pwd
/oracle/app/product/10.2.0/db_1/dbs
[oracle@ww dbs]$ ll
total 6948
-rw-r----- 1 oracle dba 112 Dec 5 02:04 alert_orcl.log
-rw-rw---- 1 oracle dba 1552 Jan 5 22:18 hc_orcl.dat
-rw-r----- 1 oracle dba 8385 Sep 11 1998 init.ora
-rw-r--r-- 1 oracle dba 12920 May 3 2001 initdw.ora
-rw-r----- 1 oracle dba 2441 Jan 5 20:19 initorcl.ora
-rw-r----- 1 oracle dba 24 Nov 26 07:33 lkORCL
-rw-r----- 1 oracle dba 1536 Dec 5 02:37 orapworcl
-rw-r----- 1 oracle dba 7061504 Dec 6 07:31 snapcf_orcl.f
-rw-r----- 1 oracle dba 2560 Jan 5 20:57 spfileorcl.ora
/oracle/app/product/10.2.0/db_1/dbs目录下,有个spfile实例名.ora文件
将数据库启动到nomount状态
SQL> startup nomount;
ORACLE instance started.
Total System Global Area 557842432 bytes
Fixed Size 2085456 bytes
Variable Size 155192752 bytes
Database Buffers 394264576 bytes
Redo Buffers 6299648 bytes
以刚才的spfile生成一个pfile文件
SQL> create pfile='$ORACLE_HOME/dbs/pfileorcl.ora' from spfile='$ORACLE_HOME/dbs/spfileorcl.ora';
File created.
修改pfile
vi pfileorcl.ora
*.control_files='/oracle/app/oradata/orcl/control01.ctl','/oracle/app/oradata/orcl/control02.ctl','/oracle/app/flash_recovery_area/ORCL/control03.ctl'这项指定控制文件路径的参数,把第二个control02.ctl的路径改成/home/oracle/control02.ctl即可。
*.control_files='/oracle/app/oradata/orcl/control01.ctl','/home/oracle/control02.ctl','/oracle/app/flash_recovery_area/ORCL/control03.ctl'
保存退出~!
然后指定pfile文件路径启动数据库
SQL> startup pfile='$ORACLE_HOME/dbs/pfileorcl.ora'
ORACLE instance started.
Total System Global Area 557842432 bytes
Fixed Size 2085456 bytes
Variable Size 155192752 bytes
Database Buffers 394264576 bytes
Redo Buffers 6299648 bytes
Database mounted.
Database opened.
OK数据库启动完毕~!
最后再将这个pfile生成一个spfile文件将以前的spfile覆盖
SQL> create spfile='$ORACLE_HOME/dbs/spfileorcl.ora' from pfile='$ORACLE_HOME/dbs/pfileorcl.ora';
File created.
重启数据库
SQL> shutdown immediate
Database closed.
Database dismounted.
ORACLE instance shut down.
SQL> startup
ORACLE instance started.
Total System Global Area 557842432 bytes
Fixed Size 2085456 bytes
Variable Size 155192752 bytes
Database Buffers 394264576 bytes
Redo Buffers 6299648 bytes
Database mounted.
Database opened.
重启正常
再查看控制文件位置
SQL> show parameter control_files;
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
control_files string /oracle/app/oradata/orcl/contr
ol01.ctl, /home/oracle/control
02.ctl, /oracle/app/flash_reco
very_area/ORCL/control03.ctl
control02.ctl文件位置已经更换到/home/oracle下
测试成功~!
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/28834607/viewspace-1295266/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/28834607/viewspace-1295266/