ITPub博客

首页 > Linux操作系统 > Linux操作系统 > 关于学习oracle控制文件时遇到的问题总结

关于学习oracle控制文件时遇到的问题总结

原创 Linux操作系统 作者:阿日 时间:2009-03-08 14:25:34 0 删除 编辑

在看042题库中有几个对于控制文件丢失或设置出错后如何恢复的操作步骤:

1.关闭数据库 -> 2.copy正确的control.ctl文件(一般为3个)-> 3.startup nomount 修改control_files参数 4.启动即可。

我在实验过程中在一个移动硬盘中增加一个CONTOL04.CTL,然后手动将移动硬盘G拔掉,这时数据库会crash掉。

然后按如下步骤进行操作,出现错误:

控制文件错误

版本:
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
SQL> alter session set nls_language=american;

Session altered.

SQL> alter database mount;
alter database mount
*
ERROR at line 1:
ORA-00205: error in identifying control file, check alert log for more info

alertlog中:

Thu Mar 05 17:53:27 2009
ORA-205 signalled during: alter database mount...
Thu Mar 05 17:54:10 2009
alter database mount
Thu Mar 05 17:54:10 2009
ORA-00202: control file: 'G:\CONTROL04.CTL'
ORA-27041: unable to open file
OSD-04002: 无法打开文件
O/S-Error: (OS 3) 系统找不到指定的路径。

Thu Mar 05 17:54:13 2009
ORA-205 signalled during: alter database mount...

我将control04.ctl存在移动硬盘G中,然后我手动断开G盘,所以出现如上错误,我的疑问是:
我在nomount状态下:
SQL> alter system set control_files='D:\oracle\oradata\orcl\CONTROL01.CTL','D:\oracle\oradata\orcl\C
ONTROL02.CTL','D:\oracle\oradata\orcl\CONTROL03.CTL' scope=spfile;

System altered.

然后我觉得重启后,就应该可以了,但仍报如下错误,不知为何
SQL> startup force;
ORA-32004: obsolete and/or deprecated parameter(s) specified
ORACLE instance started.

Total System Global Area   96468992 bytes
Fixed Size                  1247468 bytes
Variable Size              67110676 bytes
Database Buffers           20971520 bytes
Redo Buffers                7139328 bytes
ORA-00205: ?????????, ??????, ???????


于是我将G盘再连上,执行如下操作:
SQL> alter database mount;

数据库已更改。

SQL> alter database open;

数据库已更改。

SQL> select * from v$controlfile;
STATUS  NAME
------- ------------------------------------------------------------------------
        D:\ORACLE\ORADATA\ORCL\CONTROL01.CTL
        D:\ORACLE\ORADATA\ORCL\CONTROL02.CTL
        D:\ORACLE\ORADATA\ORCL\CONTROL03.CTL
        G:\CONTROL04.CTL

SQL> alter system set control_files='D:\oracle\oradata\orcl\CONTROL01.CTL','D:\oracle\oradata\orcl\C
ONTROL02.CTL','D:\oracle\oradata\orcl\CONTROL03.CTL' scope=spfile;

系统已更改。

SQL> startup force;
ORA-32004: obsolete and/or deprecated parameter(s) specified
ORACLE 例程已经启动。

Total System Global Area   96468992 bytes
Fixed Size                  1247468 bytes
Variable Size              67110676 bytes
Database Buffers           20971520 bytes
Redo Buffers                7139328 bytes
数据库装载完毕。
数据库已经打开。
SQL> select * from v$controlfile;
STATUS  NAME
------- ------------------------------------------------------------------------
        D:\ORACLE\ORADATA\ORCL\CONTROL01.CTL
        D:\ORACLE\ORADATA\ORCL\CONTROL02.CTL
        D:\ORACLE\ORADATA\ORCL\CONTROL03.CTL
        G:\CONTROL04.CTL

参数并未修改,控制文件仍包括control04,并不是我修改后的,为什么呢?
 
 
有网友回复说,貌似并未从spfile启动,或者有些参数不对,所以首先处理:
ORA-32004: obsolete and/or deprecated parameter(s) specified
这个错误。
处理:查看alert.log文件发现:
Deprecated system parameters with specified values:
  sql_trace               
End of deprecated system parameter listing

这说明sql_trace在这里是无效的或过时的参数
alter system reset sql_trace scope=spfile sid='*';
然后startup force则不会出现ORA-32004的信息。
 
然后startup nomount,这时没有出现如上错误。
 
下一步,我的想法是创建pfile,通过修改pfile来进行数据库的启动,然后再创建spfile,再从spfile进行数据库的启动:
于是第一步:
sql>create pfile from spfile;
sql>create pfile from spfile;生成的pfile文件如下:
orcl.__db_cache_size=20971520
orcl.__java_pool_size=4194304
orcl.__large_pool_size=4194304
orcl.__shared_pool_size=58720256
orcl.__streams_pool_size=0
*._awr_flush_threshold_metrics=TRUE
*.audit_trail='DB'
*.resource_limit=TRUE
*.control_files='D:\oracle\oradata\orcl\CONTROL01.CTL','D:\oracle\oradata\orcl\CONTROL02.CTL','D:\oracle\oradata\orcl\CONTROL03.CTL'
*.sga_target=92274688
*.SPFILE='E:\oracle\product\10.2.0\db_1/dbs/spfileorcl.ora'
 
查看此文件,我觉得pfile仍然是从spfile进行启动的,但只是control_files参数并未生效,所以将
control_files这一行移到最后,initorcl.ora变成如下:
sql>create pfile from spfile;生成的pfile文件如下:
orcl.__db_cache_size=20971520
orcl.__java_pool_size=4194304
orcl.__large_pool_size=4194304
orcl.__shared_pool_size=58720256
orcl.__streams_pool_size=0
*._awr_flush_threshold_metrics=TRUE
*.audit_trail='DB'
*.resource_limit=TRUE
*.sga_target=92274688
*.SPFILE='E:\oracle\product\10.2.0\db_1/dbs/spfileorcl.ora'
*.control_files='D:\oracle\oradata\orcl\CONTROL01.CTL','D:\oracle\oradata\orcl\CONTROL02.CTL','D:\oracle\oradata\orcl\CONTROL03.CTL'
 
这时再重新启动oracle,数据库正常启动。
SQL> shutdown immediate;
ORA-01507: database not mounted

ORACLE instance shut down.
SQL> startup pfile='E:\oracle\product\10.2.0\db_1\database\INITorcl.ORA';
ORACLE instance started.
Total System Global Area   96468992 bytes
Fixed Size                  1247468 bytes
Variable Size              67110676 bytes
Database Buffers           20971520 bytes
Redo Buffers                7139328 bytes
数据库装载完毕。
数据库已经打开。
 
然后根据最初的想法,重新创建pfile
SQL> create spfile from pfile;
文件已创建。
SQL> create pfile='E:\init.ora' from spfile;
文件已创建。
 
这次再查看新创建的pfile可以看到如下内容:
orcl.__db_cache_size=25165824
orcl.__java_pool_size=4194304
orcl.__large_pool_size=4194304
orcl.__shared_pool_size=54525952
orcl.__streams_pool_size=0
*.audit_file_dest='D:\oracle/admin/orcl/adump'
*.background_dump_dest='D:\oracle/admin/orcl/bdump'
*.compatible='10.2.0.1.0'
*.control_files='D:\ORACLE\ORADATA\ORCL\CONTROL01.CTL','D:\ORACLE\ORADATA\ORCL\CONTROL02.CTL','D:\ORACLE\ORADATA\ORCL\CONTROL03.CTL','G:\CONTROL04.CTL'
*.core_dump_dest='D:\oracle/admin/orcl/cdump'
*.db_block_size=8192
*.db_domain=''
*.db_file_multiblock_read_count=16
*.db_name='orcl'
*.db_recovery_file_dest='D:\oracle/flash_recovery_area'
*.db_recovery_file_dest_size=2147483648
*.dispatchers='(PROTOCOL=TCP) (SERVICE=orclXDB)'
*.job_queue_processes=10
*.local_listener='LISTENER_ORCL'
*.open_cursors=300
*.pga_aggregate_target=202375168
*.processes=150
*.remote_login_passwordfile='EXCLUSIVE'
*.sga_target=96468992
*.undo_management='AUTO'
*.undo_tablespace='UNDOTBS1'
*.user_dump_dest='D:\oracle/admin/orcl/udump'

这里显示的control文件包括“'G:\CONTROL04.CTL'
然后去掉这个,shutdown 数据库
令数据据从新修改的init.ora启动
SQL> startup pfile='E:\oracle\product\10.2.0\db_1\database\INITorcl.ora';
ORACLE instance started.
Total System Global Area   96468992 bytes
Fixed Size                  1247468 bytes
Variable Size              62916372 bytes
Database Buffers           25165824 bytes
Redo Buffers                7139328 bytes
数据库装载完毕。
数据库已经打开。

然后再重新创新spfile文件
SQL> create spfile from pfile;

文件已创建。

SQL> create pfile='E:\initorcl.ora' from spfile;

文件已创建。

SQL> startup force;
ORACLE 例程已经启动。

Total System Global Area   96468992 bytes
Fixed Size                  1247468 bytes
Variable Size              62916372 bytes
Database Buffers           25165824 bytes
Redo Buffers                7139328 bytes
数据库装载完毕。
数据库已经打开。

至此数据库从spfile也正常启动
SQL> show parameter control_files;

NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
control_files                        string      D:\ORACLE\ORADATA\ORCL\CONTROL
                                                 01.CTL, D:\ORACLE\ORADATA\ORCL
                                                 \CONTROL02.CTL, D:\ORACLE\ORAD
                                                 ATA\ORCL\CONTROL03.CTL

至此完成,来来回回的折腾了几次:(


 

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/67668/viewspace-563243/,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2007-12-26

  • 博文量
    35
  • 访问量
    144600