首页 > 代码库 > ORACLE控制文件一致性【weber出品】

ORACLE控制文件一致性【weber出品】

一、首先控制文件有什么作用呢?

控制文件记录了如下信息:
1、数据库的创建时间
2、数据文件的位置
3、日志文件的位置

作用是指导数据库 找到数据文件,日志文件并将数据库启动到 open 状态。

与其用文字来描述,不如我们来看看control_file里面有些什么好了。然后在一一分析:

SQL> show parameter control_fileNAME                     TYPE     VALUE------------------------------------ ----------- ------------------------------control_file_record_keep_time         integer     7control_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 -ltotal 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 292LOGFILE  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 LOGFILEDATAFILE  /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.dbfCHARACTER SET AL32UTF8

可以看到里面记录着数据文件和日志文件的存放位置。

 

二、控制文件有三个,三个控制文件都是一模一样的。这是用来冗余备份,如果其中一个坏了,可以用另外的一个给重新覆盖。我们接下来模拟一个环境。我们把其中一个控制文件给破干掉:

[oracle@oracle orcl]$ lscontrol01.ctl  control03.ctl  redo01.log  redo03.log    system01.dbf  undotbs01.dbfcontrol02.ctl  example01.dbf  redo02.log  sysaux01.dbf  temp01.dbf    users01.dbf[oracle@oracle orcl]$ mv control03.ctl ./control03.ctl.bak[oracle@oracle orcl]$ lscontrol01.ctl  control03.ctl.bak  redo01.log  redo03.log    system01.dbf  undotbs01.dbfcontrol02.ctl  example01.dbf      redo02.log  sysaux01.dbf  temp01.dbf    users01.dbf

然后我们登入启动一下:

SQL> startupORACLE instance started.Total System Global Area  608174080 bytesFixed Size            1275128 bytesVariable Size          222300936 bytesDatabase Buffers      381681664 bytesRedo Buffers            2916352 bytesORA-00205: error in identifying control file, check alert log for more info

我们打开报警文件看看:

[oracle@oracle bdump]$ pwd/u01/app/oracle/admin/orcl/bdumpvi 查看一下:alert_orcl.logWed Sep 17 20:34:18 CST 2014ORA-00210: cannot open the specified control fileORA-00202: control file: /u01/app/oracle/oradata/orcl/control03.ctlORA-27037: unable to obtain file statusLinux 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]$ lsoracle  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=176160768orcl.__java_pool_size=4194304orcl.__large_pool_size=4194304orcl.__shared_pool_size=92274688orcl.__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 bytesFixed Size                  2020192 bytesVariable Size             100666528 bytesDatabase Buffers          176160768 bytesRedo Buffers                2170880 bytesDatabase mounted.
Database opened.
--看到没有,数据库只用2个控制文件也是可以启动的。SQL
> show parameter controlNAME TYPE VALUE------------------------------------ ----------- ------------------------------control_file_record_keep_time integer 7control_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]$ lscontrol01.ctl  control03.ctl.bak  redo02.log    system01.dbf   users01.dbfcontrol02.ctl  example01.dbf      redo03.log    temp01.dbfcontrol03.ctl  redo01.log         sysaux01.dbf  undotbs01.dbf

启动一下:

SQL> show parameter control_fileNAME                     TYPE     VALUE------------------------------------ ----------- ------------------------------control_file_record_keep_time         integer     7control_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

  还是一样可以。

ORACLE控制文件一致性【weber出品】