zoukankan      html  css  js  c++  java
  • ORACLE控制文件一致性【weber出品】

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

    控制文件记录了如下信息:
    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

      还是一样可以。

  • 相关阅读:
    新学期的合作
    软件工程问题及回答
    《程序猿的生命周期》阅读有感
    《构建之法》13~17章
    阅读《构建之法》十一、十二、十三章之感
    阅读《构建之法》十一、十二、十三章
    【.NET / C#】SubarrayUtils(查找子数组工具类)
    【Java】ComplexTimerTask (TimerTask 拓展封装)
    【Java】AesCbcCodec(AES_CBC加解密工具类)
    【Java】AesEcbCodec(AES_ECB加解密工具类)
  • 原文地址:https://www.cnblogs.com/yaoweber/p/3977964.html
Copyright © 2011-2022 走看看