数据库控制文件问题

来源:互联网 发布:大数据性能 编辑:程序博客网 时间:2024/04/30 11:37
我在为控制文件修改路径的时候遇见一个这样的问题。
本来三个控制文件的位置是:
E:\ORACLE\ORADATA\ORA10\CONTROL01.CTL,
E:\ORACLE\ORADATA\ORA10\CONTROL02.CTL,
E:\ORACLE\ORADATA\ORA10\CONTROL03.CTL'
我现在将控制文件的路径修改为:
E:\CONTROL01.CTL,
E:\ORACLE\ORADATA\ORA10\CONTROL02.CTL,
E:\ORACLE\ORADATA\ORA10\CONTROL03.CTL'

我开始做的时候是这样的
SQL> alter system set control_files='E:\CONTROL01.CTL, E:\ORACLE\ORADATA\ORA10\CONTROL02.CTL, E:\ORACLE\ORADATA\ORA10\CONTROL03.CTL' scope=spfile;

系统已更改。
修改spfile文件中的control_files参数,然后重启数据块。问题出现了。
SQL> startup mount
ORACLE 例程已经启动。

Total System Global Area  159383552 bytes
Fixed Size                  1247876 bytes
Variable Size              79693180 bytes
Database Buffers           75497472 bytes
Redo Buffers                2945024 bytes
ORA-00205: ?????????, ??????, ???????
alert文件的错误是:
ALTER DATABASE   MOUNT
Wed May 09 08:07:44 2007
ORA-00202: control file: 'E:\CONTROL01.CTL, E:\ORACLE\ORADATA\ORA10\CONTROL02.CTL, E:\ORACLE\ORADATA\ORA10\CONTROL03.CTL'
ORA-27041: unable to open file
OSD-04002: 无法打开文件
O/S-Error: (OS 123) 文件名、目录名或卷标语法不正确。

无法找到控制文件,这时候,我的控制文件已经在自己的目录上。spfile不行,我就使用pfile文件。
SQL> create pfile from spfile;

文件已创建。
看看pfile文件中的control_files的内容:
*.control_files=’E:\CONTROL01.CTL, E:\ORACLE\ORADATA\ORA10\CONTROL02.CTL, E:\ORACLE\ORADATA\ORA10\CONTROL03.CTL’
正确的,启动数据库:
SQL> shutdown immediate
ORA-01109: 数据库未打开


已经卸载数据库。
ORACLE 例程已经关闭。
SQL> startup mount pfile=e:\oracle\ora10\database\initora10.ora
ORACLE 例程已经启动。

Total System Global Area  159383552 bytes
Fixed Size                  1247876 bytes
Variable Size              79693180 bytes
Database Buffers           75497472 bytes
Redo Buffers                2945024 bytes
ORA-00205: ?????????, ??????, ???????
还是有问题。
查看一下Oracle的文档,文档上说:
To Multiplex or Move Additional Copies of the Current Control Files
1)        Shut down the database.
2)        Copy an existing control file to a different location, using operating system commands.
3)        Edit the CONTROL_FILES parameter in the database's initialization parameter file to add the new control file's name, or to change the existing control filename.
4)        Restart the database.

文档上说是修改修改参数文件中的CONTROL_FILES参数,我就是这样做的啊?问题出在哪里啊?很是郁闷。后来看到文档上有这样的格式。
CONTROL_FILES = (/u01/oracle/prod/control01.ctl,
                 /u02/oracle/prod/control02.ctl,
                 /u03/oracle/prod/control03.ctl)
我抱着试试看的态度,将pfile文件上的control_files修改为:
*.control_files=(E:\CONTROL01.CTL, E:\ORACLE\ORADATA\ORA10\CONTROL02.CTL, E:\ORACLE\ORADATA\ORA10\CONTROL03.CTL)
重新启动一下:更郁闷的事情发生了,数据库居然起来了。(重装操作系统后,用备份的oracle相关文件替换后,打不开数据库,按修改后就可以了)
SQL> startup mount pfile=e:\oracle\ora10\database\initora10.ora
ORACLE 例程已经启动。

Total System Global Area  159383552 bytes
Fixed Size                  1247876 bytes
Variable Size              79693180 bytes
Database Buffers           75497472 bytes
Redo Buffers                2945024 bytes
数据库装载完毕。
SQL>
SQL> show parameter control

NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
control_file_record_keep_time        integer     7
control_files                        string      E:\CONTROL01.CTL, E:\ORACLE\OR
                                                 ADATA\ORA10\CONTROL02.CTL, E:\
                                                 ORACLE\ORADATA\ORA10\CONTROL03
                                                 .CTL
SQL>
那么从pfile生成spfile看看:
SQL> create spfile from pfile;

文件已创建。

SQL> shutdown immediate
ORA-01109: 数据库未打开


已经卸载数据库。
ORACLE 例程已经关闭。
SQL> startup mount
ORACLE 例程已经启动。

Total System Global Area  159383552 bytes
Fixed Size                  1247876 bytes
Variable Size              79693180 bytes
Database Buffers           75497472 bytes
Redo Buffers                2945024 bytes
数据库装载完毕。
SQL>
郁闷,居然没有问题。

总结一下:
为了更改控制文件的目录,使用alter system修改参数control_files到spfile中。然后将spfile生成pfile文件,关闭数据库,这时候无论使用spfile还是pfile都无法启动数据库,错误是指定的控制文件的路径不正确。这时候pfile文件的写法是:
*.control_files=’E:\CONTROL01.CTL, E:\ORACLE\ORADATA\ORA10\CONTROL02.CTL, E:\ORACLE\ORADATA\ORA10\CONTROL03.CTL’
修改这个参数的写法:
*.control_files=(E:\CONTROL01.CTL, E:\ORACLE\ORADATA\ORA10\CONTROL02.CTL, E:\ORACLE\ORADATA\ORA10\CONTROL03.CTL)
这样就没有问题了。

问题出来了,我这个参数使用的是oracle的命令修改的spfile文件,而且使用的是oracle命令生成的pfile文件。为什么oracle自己生成的东西会有问题那?还需要手工修改他的格式?

在深入一下:
我将正常运行的数据库的参数文件spfile生成为pfile。这时候pfile文件中的control_files参数的格式还是为:
*.control_files='E:\ORACLE\ORADATA\ORA10\CONTROL01.CTL','E:\ORACLE\ORADATA\ORA10\CONTROL02.CTL','E:\ORACLE\ORADATA\ORA10\CONTROL03.CTL'
但是这时候,使用这个文件还是能够正常启动:
SQL> shutdown immediate
ORA-01109: 数据库未打开


已经卸载数据库。
ORACLE 例程已经关闭。
SQL> startup mount pfile=e:\oracle\ora10\database\initora10.ora
ORACLE 例程已经启动。

Total System Global Area  159383552 bytes
Fixed Size                  1247876 bytes
Variable Size              79693180 bytes
Database Buffers           75497472 bytes
Redo Buffers                2945024 bytes
数据库装载完毕。
SQL>

大家说说这是为什么,难道我有什么做错的地方吗?

我的数据库版本是:
SQL> select * from v$version;

BANNER
----------------------------------------------------------------
Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - Prod
PL/SQL Release 10.2.0.1.0 - Production
CORE    10.2.0.1.0      Production
TNS for 32-bit Windows: Version 10.2.0.1.0 - Production
NLSRTL Version 10.2.0.1.0 - Production
原创粉丝点击