一、首先控制文件有什么作用呢?
控制文件记录了如下信息:
1、数据库的创建时间
2、数据文件的位置
3、日志文件的位置
等
作用是指导数据库 找到数据文件,日志文件并将数据库启动到 open 状态。
与其用文字来描述,不如我们来看看control_file里面有些什么好了。然后在一一分析:
SQL> show parameter control_file NAME TYPE VALUE ------------------------------------ ----------- ------------------------------ control_file_record_keep_time integer 7 control_files string /u01/app/oracle/oradata/orcl/c ontrol01.ctl, /u01/app/oracle/ oradata/orcl/control02.ctl, /u 01/app/oracle/oradata/orcl/con trol03.ctl
可以看出来control_file的位置在 /u01/app/oracle/oradata/orcl/这目录下。
SQL> alter database backup controlfile to trace;
我们到这个目录去:/u01/app/oracle/admin/orcl/udump
[oracle@oracle udump]$ ls -l total 192 -rw-r----- 1 oracle oinstall 854 Sep 15 11:46 orcl_ora_10453.trc -rw-r----- 1 oracle oinstall 12332 Sep 17 20:02 orcl_ora_14205.trc -rw-r----- 1 oracle oinstall 705 Sep 16 14:59 orcl_ora_21120.trc -rw-r----- 1 oracle oinstall 726 Sep 16 14:59 orcl_ora_21124.trc -rw-r----- 1 oracle oinstall 855 Sep 15 11:49 orcl_ora_23699.trc -rw-r----- 1 oracle oinstall 855 Sep 16 21:38 orcl_ora_23743.trc
找到一个时间是今天的以.trc结尾的文件。用vi来打开它。
CREATE CONTROLFILE REUSE DATABASE "ORCL" RESETLOGS NOARCHIVELOG MAXLOGFILES 16 MAXLOGMEMBERS 3 MAXDATAFILES 100 MAXINSTANCES 8 MAXLOGHISTORY 292 LOGFILE GROUP 1 ‘/u01/app/oracle/oradata/orcl/redo01.log‘ SIZE 50M, GROUP 2 ‘/u01/app/oracle/oradata/orcl/redo02.log‘ SIZE 50M, GROUP 3 ‘/u01/app/oracle/oradata/orcl/redo03.log‘ SIZE 50M -- STANDBY LOGFILE DATAFILE ‘/u01/app/oracle/oradata/orcl/system01.dbf‘, ‘/u01/app/oracle/oradata/orcl/undotbs01.dbf‘, ‘/u01/app/oracle/oradata/orcl/sysaux01.dbf‘, ‘/u01/app/oracle/oradata/orcl/users01.dbf‘, ‘/u01/app/oracle/oradata/orcl/example01.dbf‘ CHARACTER SET AL32UTF8
可以看到里面记录着数据文件和日志文件的存放位置。
二、控制文件有三个,三个控制文件都是一模一样的。这是用来冗余备份,如果其中一个坏了,可以用另外的一个给重新覆盖。我们接下来模拟一个环境。我们把其中一个控制文件给破干掉:
[oracle@oracle orcl]$ ls control01.ctl control03.ctl redo01.log redo03.log system01.dbf undotbs01.dbf control02.ctl example01.dbf redo02.log sysaux01.dbf temp01.dbf users01.dbf [oracle@oracle orcl]$ mv control03.ctl ./control03.ctl.bak [oracle@oracle orcl]$ ls control01.ctl control03.ctl.bak redo01.log redo03.log system01.dbf undotbs01.dbf control02.ctl example01.dbf redo02.log sysaux01.dbf temp01.dbf users01.dbf
然后我们登入启动一下:
SQL> startup ORACLE instance started. Total System Global Area 608174080 bytes Fixed Size 1275128 bytes Variable Size 222300936 bytes Database Buffers 381681664 bytes Redo Buffers 2916352 bytes ORA-00205: error in identifying control file, check alert log for more info
我们打开报警文件看看:
[oracle@oracle bdump]$ pwd /u01/app/oracle/admin/orcl/bdump vi 查看一下:alert_orcl.log Wed Sep 17 20:34:18 CST 2014 ORA-00210: cannot open the specified control file ORA-00202: control file: ‘/u01/app/oracle/oradata/orcl/control03.ctl‘ ORA-27037: unable to obtain file status Linux Error: 2: No such file or directory
很明显的说是打不开,废话,肯定打不开,我都给干掉了你找得到才怪了。
这个是有我给大家指出两条解决思路:
方法一:修改spfile,不是说spfile里面记录着参数文件的位置嘛,而且肯定是记录着3条位置,那么我们就把其中第三个控制文件干掉
过程:
创建一个pfile,因为spfile是二进制文件,不可以修改
SQL> create pfile=‘/u01/pfile.ora‘ from spfile; File created.
然后编辑一下参数文件pfile:
[ora10g@first-oracle dbs]$ cd /u01 [ora10g@first-oracle u01]$ ls oracle pfile.ora [ora10g@first-oracle u01]$ vi pfile.ora *.control_files=tl‘,‘/u01/oracle/oradata/orcl/control02.ctl‘,‘/u01/oracle/oradata/orcl/control03.ctlorcl.__db_cache_size=176160768 orcl.__java_pool_size=4194304 orcl.__large_pool_size=4194304 orcl.__shared_pool_size=92274688 orcl.__streams_pool_size=0 *.audit_file_dest=‘/u01/oracle/admin/orcl/adump‘ *.background_dump_dest=‘/u01/oracle/admin/orcl/bdump‘ *.compatible=‘10.2.0.1.0‘ *.control_files=‘/u01/oracle/oradata/orcl/control02.ctl‘,‘/u01/oracle/oradata/orcl/control01.ctl‘ ----亮点在这里,原先是有01,02,03个控制文件,我给删了就可以让数据库启动的时候不去找第三个,丢了就丢了吧。 *.core_dump_dest=‘/u01/oracle/admin/orcl/cdump‘ *.db_block_size=8192 *.db_domain=‘‘ *.db_file_multiblock_read_count=16 *.db_name=‘orcl‘ *.db_recovery_file_dest=‘/u01/oracle/flash_recovery_area‘ *.db_recovery_file_dest_size=2147483648 *.dispatchers=‘(PROTOCOL=TCP) (SERVICE=orclXDB)‘ *.job_queue_processes=10 *.open_cursors=300 *.pga_aggregate_target=93323264 *.processes=150 *.remote_login_passwordfile=‘EXCLUSIVE‘ *.sga_target=279969792 *.undo_management=‘AUTO‘ *.undo_tablespace=‘UNDOTBS1‘ *.user_dump_dest=‘/u01/oracle/admin/orcl/udump‘
重新创建一下就好spfile了:
SQL> create spfile from pfile=‘/u01/pfile.ora‘; File created. SQL> startup; ORACLE instance started. Total System Global Area 281018368 bytes Fixed Size 2020192 bytes Variable Size 100666528 bytes Database Buffers 176160768 bytes Redo Buffers 2170880 bytes Database mounted.
Database opened.
--看到没有,数据库只用2个控制文件也是可以启动的。 SQL> show parameter control NAME TYPE VALUE ------------------------------------ ----------- ------------------------------ control_file_record_keep_time integer 7 control_files string /u01/oracle/oradata/orcl/contr ol02.ctl, /u01/oracle/oradata/ orcl/control01.ctl
方法二:不是说3个控制文件都一模一样的嘛,那为何不拷贝后重命名不就可以了呢
过程:
[oracle@oracle orcl]$ cp control01.ctl control03.ctl
[oracle@oracle orcl]$ ls
control01.ctl control03.ctl.bak redo02.log system01.dbf users01.dbf
control02.ctl example01.dbf redo03.log temp01.dbf
control03.ctl redo01.log sysaux01.dbf undotbs01.dbf
启动一下:
SQL> show parameter control_file NAME TYPE VALUE ------------------------------------ ----------- ------------------------------ control_file_record_keep_time integer 7 control_files string /u01/app/oracle/oradata/orcl/c ontrol01.ctl, /u01/app/oracle/ oradata/orcl/control02.ctl, /u 01/app/oracle/oradata/orcl/con trol03.ctl
还是一样可以。