在看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
至此完成,来来回回的折腾了几次:(