天天看点

Oracle控制文件详解

一、Oracle 控制文件

        为二进制文件,初始化大小由CREATE DATABASE指定,可以使用RMAN备份

        记录了当前数据库的结构信息,同时也包含数据文件及日志文件的信息以及相关的状态,归档信息等等

        在参数文件中描述其位置,个数等等。通常采用分散放开,多路复用的原则。在mount阶段被读取,open阶段一直被使用

        维护数据库一致性(数据库启动时会比较控制文件与联机日志文件中的ckpt,即起始scn号,如相等则正常启动,否则需要介质恢复)

        一个控制文件只能属于一个数据库

        控制文件的任意修改将写入到初始化参数中指定的所有控制文件中,读取时则仅读取第一个控制文件

        控制文件只能连接一个数据库,控制文件的大小一般不要超过MB,最多为个,最少一个,互为镜像

        控制文件中包含的内容

            数据库的名字、ID、创建的时间戳

            表空间的名字

            联机日志文件、数据文件的位置、个数、名字

            联机日志的Sequence号码

            检查点的信息

            撤销段的开始或结束

            归档信息

            备份信息

二、查看控制文件的相关信息

    1.使用相关视图来查看

        V$CONTROLFILE                   --列出实例中所有控制文件的名字及状态信息

        V$PARAMETER                     --列出所有参数的位置及状态信息

        V$CONTROLFILE_RECORD_SECTION    --列出控制文件中记录的部分信息

        SHOW PARAMETER CONTROL_FILES    --列出控制文件的名字、状态、位置等

2.使用STRINGS命令来查看控制文件中的具体内容

3.备份控制文件到平面文件(然后查看控制文件中的具体内容)

        SQL> alter database backup controlfile  to trace as '/u01/app/oracle/ctl.txt';

        Database altered.

 4.转储控制文件内容(查看控制文件中的具体内容)

        alter session set events 'immediate trace name CONTROLF level 12'; level表示级别

        或                     --level1  块头的内容 --level2 数据文件内容 --levle 10 |12 所有内容

        oradebug setmypid

        oradebug dump controlf 12

        SQL> alter system set events 'immediate trace name controlf level 10';

        System altered.

        SQL> show parameter user_dump;

        NAME                                 TYPE        VALUE

        ------------------------------------ ----------- ------------------------------

        user_dump_dest                       string      /u01/app/oracle/admin/orcl/udu

                                                         mp

三、控制文件的管理 

    规划原则:多路复用,建议存放到不同的磁盘或同一磁盘不同的分区

    个数与位置及状态管理:

        查看控制文件的状态是否与参数定义中的相吻合,当数据库发生结构修改时,将修改内容同时写入控制文件

    备份管理

    恢复管理

    新建控制文件语句

    spfile或pfile都可以实现对控制文件的个数及位置管理

    spfile步骤

        修改spfile参数中的control_files   -- alter system ... scope = spfile | both |memory

        一致性关闭数据库

        增加或减少控制文件(cp or mv)

        启动数据库使用spfile

        验证结果

    pfile步骤

        修改pfile参数(vi或vim)   修改*.control_files=......这一段

        启动数据库使用pfile

    --演示spfile修改控制文件

        SQL> show parameter control_file

        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

        --将控制文件减少到一个

        SQL> alter system set control_files = '/u01/app/oracle/oradata/orcl/control01.ctl' scope =spfile;

        SQL> shutdown immediate;

        Database closed.

        Database dismounted.

        ORACLE instance shut down.

        SQL> startup mount

        ORACLE instance started.

        Total System Global Area  251658240 bytes

        Fixed Size                  1218796 bytes

        Variable Size              88082196 bytes

        Database Buffers          159383552 bytes

        Redo Buffers                2973696 bytes

        Database mounted.

        --再次查看参数文件,已显示为一个

                                                         ontrol01.ctl

        --增加控制文件(在nomount状态下即可修改)

        SQL> alter system set control_files = '/u01/app/oracle/oradata/orcl/control01.ctl',

          2  '/u01/app/oracle/oradata/orcl/control02.ctl',

          3  '/u01/app/oracle/oradata/orcl/control03.ctl'

          4  scope = spfile;

        --启动时可以看到在实例阶段出现了版本号不一致的问题

        SQL> startup force

        ORA-00214: control file '/u01/app/oracle/oradata/orcl/control01.ctl' version

        1051 inconsistent with file '/u01/app/oracle/oradata/orcl/control02.ctl'

        version 1049

        --处理办法,用版本号高的控制文件覆盖版本号低的控制文件

        SQL> host cp /u01/app/oracle/oradata/orcl/control01.ctl/u01/app/oracle/oradata/orcl/control02.ctl;

        SQL> host cp /u01/app/oracle/oradata/orcl/control01.ctl/u01/app/oracle/oradata/orcl/control03.ctl;

        SQL> alter database mount;

        SQL> alter database open;

        Database altered.  

    对于控制文件丢失的情况下,通过查看参数文件中设置,使用操作系统命令逐个查看这些文件是否存在

        SQL> host ls /u01/app/oracle/oradata/orcl/control01.ctl

        /u01/app/oracle/oradata/orcl/control01.ctl

        SQL> host ls /u01/app/oracle/oradata/orcl/control02.ctl

        /u01/app/oracle/oradata/orcl/control02.ctl

    查看控制文件所在的目录可用空间及控制文件的大小,建议不要超过100MB

        SQL> host ls /u01/app/oracle/oradata/orcl/c*.ctl -lh

        -rw-r----- 1 oracle oinstall 6.8M May 23 10:55 /u01/app/oracle/oradata/orcl/control01.ctl

        -rw-r----- 1 oracle oinstall 6.8M May 23 10:55 /u01/app/oracle/oradata/orcl/control02.ctl

        -rw-r----- 1 oracle oinstall 6.8M May 23 10:55 /u01/app/oracle/oradata/orcl/control03.ctl

        SQL> ! df -h

        Filesystem            Size  Used Avail Use% Mounted on

        /dev/sda2             6.4G  3.9G  2.2G  64% /

        /dev/sdd1             6.8G  3.7G  2.8G  58% /u01

        /dev/sdc2             1.2G   34M  1.1G   3% /home

        /dev/sdc1             760M   17M  704M   3% /tmp

        /dev/sda1             456M   18M  415M   5% /boot

        tmpfs                 450M     0  450M   0% /dev/shm

        none                  450M  104K  450M   1% /var/lib/xenstored

    控制文件的备份

        热备:

            alter database backup controlfile to '<dir>';  --热备份控制文件

            alter database backup controlfile to trace as '<dir>' ;--得到建立控制文件的脚本

        RMAN:

            backup current controlfile;

            backup database include current controlfile;

            -- 或者设置RMAN 为自动备份

            RMAN > configure controlfile autobackup on;

        --演示备份

        --用于归档模式下的恢复,直接覆盖到控制文件

        SQL> alter database backup controlfile to '/u01/app/oracle/control.bak';

        --用于重建控制文件

        SQL> alter database backup controlfile to trace as'/u01/app/oracle/recreate_controlfile.txt';

        --使用RMAN备份

        RMAN> connect target /;

        connected to target database: ORCL (DBID=1242732291)

        RMAN> backup current controlfile;   --handle为备份文件的路径

        Starting backup at 23-MAY-10

        using target database control file instead of recovery catalog

        allocated channel: ORA_DISK_1

        channel ORA_DISK_1: sid=148 devtype=DISK

        channel ORA_DISK_1: starting full datafile backupset

        channel ORA_DISK_1: specifying datafile(s) in backupset

        including current control file in backupset

        channel ORA_DISK_1: starting piece 1 at 23-MAY-10

        channel ORA_DISK_1: finished piece 1 at 23-MAY-10

        piece handle=/u01/app/oracle/flash_recovery_area/ORCL/backupset/

              2010_05_23/o1_mf_ncnnf_TAG20100523T131841_5zkgon2l_.bkp tag=TAG20100523T131841 comment=NONE

        channel ORA_DISK_1: backup set complete, elapsed time: 00:00:05

        Finished backup at 23-MAY-10

        RMAN> backup database include current controlfile;

        channel ORA_DISK_1: sid=141 devtype=DISK

        input datafile fno=00001 name=/u01/app/oracle/oradata/orcl/system01.dbf

        input datafile fno=00003 name=/u01/app/oracle/oradata/orcl/sysaux01.dbf

        input datafile fno=00005 name=/u01/app/oracle/oradata/orcl/example01.dbf

        input datafile fno=00006 name=/u01/app/oracle/oradata/orcl/tbs1_1.dbf

        input datafile fno=00007 name=/u01/app/oracle/oradata/orcl/tbs1_2.dbf

        input datafile fno=00002 name=/u01/app/oracle/oradata/orcl/undotbs01.dbf

        input datafile fno=00004 name=/u01/app/oracle/oradata/orcl/users01.dbf

              2010_05_23/o1_mf_nnndf_TAG20100523T132647_5zkh4sk2_.bkp tag=TAG20100523T132647 comment=NONE

        channel ORA_DISK_1: backup set complete, elapsed time: 00:05:25

        including current SPFILE in backupset

              2010_05_23/o1_mf_ncsnf_TAG20100523T132647_5zkhh5st_.bkp tag=TAG20100523T132647 comment=NONE

        channel ORA_DISK_1: backup set complete, elapsed time: 00:00:14

        RMAN> show all; 

        RMAN configuration parameters are:

        CONFIGURE RETENTION POLICY TO REDUNDANCY 1; # default

        CONFIGURE BACKUP OPTIMIZATION OFF; # default

        CONFIGURE DEFAULT DEVICE TYPE TO DISK; # default

        CONFIGURE CONTROLFILE AUTOBACKUP OFF; # default

        CONFIGURE CONTROLFILE AUTOBACKUP FORMAT FOR DEVICE TYPE DISK TO '%F'; # default

        CONFIGURE DEVICE TYPE DISK PARALLELISM 1 BACKUP TYPE TO BACKUPSET; # default

        CONFIGURE DATAFILE BACKUP COPIES FOR DEVICE TYPE DISK TO 1; # default

        CONFIGURE ARCHIVELOG BACKUP COPIES FOR DEVICE TYPE DISK TO 1; # default

        CONFIGURE MAXSETSIZE TO UNLIMITED; # default

        CONFIGURE ENCRYPTION FOR DATABASE OFF; # default

        CONFIGURE ENCRYPTION ALGORITHM 'AES128'; # default

        CONFIGURE ARCHIVELOG DELETION POLICY TO NONE; # default

        CONFIGURE SNAPSHOT CONTROLFILE NAME TO '/u01/app/oracle/10g/dbs/snapcf_orcl.f'; # default

        RMAN> configure controlfile autobackup on;   --将控制文件自动备份功能置为on;

        new RMAN configuration parameters:

        CONFIGURE CONTROLFILE AUTOBACKUP ON;

        new RMAN configuration parameters are successfully stored

    控制文件的恢复管理

        控制文件版本不一致的问题

            用较新版本的控制文件覆盖旧版本的控制文件

            直接修改参数control_file

        丢失问题

            归档模式下

                当归档日志全的时候,先做全备,然后使用备份的控制文件恢复即可

                当归档日志不全的时候,先做全备,然后建立新的控制文件即可

            非归档模式下

                先做全备,然后建立新的控制文件即可

        新建控制文件语句

            数据库处于mount及open状态

            执行alter database backup controlfile to trace as '<dir>';得到建立语句

            注意[no]archievelog [no]resetlogs 两个参数的区别

    版本不一致演示 

        SQL> startup

        --控制文件部分丢失的演示,原本有两个控制文件,丢失一个

        --处理办法:

            1.将存在的控制文件复制到目的路径并更改控制文件名字为正确的控制文件名称

            2.修改控控文件参数将丢失的控制文件去掉(一般不建议使用)

        SQL> alter system set control_files = ' /u01/app/oracle/oradata/orcl/c ontrol01.ctl',

          2  '/u01/app/oracle/oradata/orcl/control02.ctl' scope = spfile;

        Variable Size              75499284 bytes

        Database Buffers          171966464 bytes

        ORA-00205: error in identifying control file, check alert log for more info

        [oracle@robinson ~]$ tail -n 100 /u01/app/oracle/admin/orcl/bdump/alert_orcl.log

        ..........................     

        Tue Jun  8 19:03:42 2010

        starting up 1 shared server(s) ...

        MMON started with pid=11, OS id=4557

        CJQ0 started with pid=10, OS id=4555

        Tue Jun  8 19:03:44 2010

        ALTER DATABASE   MOUNT

        ORA-00202: control file: '/u01/app/oracle/10g/dbs/ /u01/app/oracle/oradata/orcl/c ontrol01.ctl'

        ORA-27037: unable to obtain file status

        Linux Error: 2: No such file or directory

        Additional information: 3

        Tue Jun  8 19:03:47 2010

        ORA-205 signalled during: ALTER DATABASE   MOUNT...

        --从警告日志中得知,文件名为c ontrol01.ctl的文件不存在,故将其改为正确的文件名

        SQL> alter system set control_files='/u01/app/oracle/oradata/orcl/control01.ctl',

        Variable Size              83887892 bytes

        Database Buffers          163577856 bytes

        Database opened.

    非归档模式下,当所有的控制文件都丢失,只能重建控制文件来解决

        Variable Size              79693588 bytes

        Database Buffers          167772160 bytes

        [oracle@robinson ~]$tail -n 100 /u01/app/oracle/admin/orcl/bdump/alert_orcl.log

        Thu Jul 15 12:13:15 2010

        ORA-00202: control file: '/u01/app/oracle/oradata/orcl/control01.ctl'

        --重建控制文件主要有三个需要考虑的是

        --搞清各个日志文件的大小及位置

        --搞清各个数据文件的位置

        --设置正确的字符集     

        SQL> CREATE CONTROLFILE REUSE DATABASE "orcl" NOARCHIVELOG NORESTLOGS

          2  MAXLOGFILES 16

          3  MAXLOGMEMBER 3

          4  MAXDATAFILES 20

          5  MAXINSTANCES 8

          6  MAXLOGHISTORY 3

          7  LOGFILE

          8    GROUP 1(

          9      'u01/app/oracle/oradata/orcl/redo1.log',

         10      '/u01/app/oracle/oradata/orcl/redo01.log'

         11       ) SIZE 50M,

         12    GROUP 2(

         13      '/u01/app/oracle/oradata/orcl/redo2.log',  

         14      '/u01/app/oracle/oradata/orcl/redo02.log'      

         15       ) SIZE 50M,

         16    GROUP 3(

         17      '/u01/app/oracle/oradata/orcl/redo3.log',      

         18      '/u01/app/oracle/oradata/orcl/redo03.log'    

         19       ) SIZE 100M 

         20  DATAFILE

         21    '/u01/app/oracle/oradata/orcl/tbs1_2.dbf',

         22    '/u01/app/oracle/oradata/orcl/tbs1_1.dbf',     

         23    '/u01/app/oracle/oradata/orcl/example01.dbf',

         24    '/u01/app/oracle/oradata/orcl/users01.dbf',

         25    '/u01/app/oracle/oradata/orcl/sysaux01.dbf',

         26    '/u01/app/oracle/oradata/orcl/system01.dbf',

         27    '/u01/app/oracle/oradata/orcl/undotbs01.dbf'

         28  CHARACTER SET WE8ISO8859P1;

        CREATE CONTROLFILE REUSE DATABASE "orcl" NOARCHIVELOG NORESTLOGS

                                                              *

        ERROR at line 1:

        ORA-01967: invalid option for CREATE CONTROLFILE

        SQL> save /u01/app/oracle/oradata/rectl.sql;

        Created file /u01/app/oracle/oradata/rectl.sql

        SQL> ho vim /u01/app/oracle/oradata/rectl.sql

        SQL> @/u01/app/oracle/oradata/rectl.sql

        Control file created.

        --下面给出正确执行后的语句内容

        SQL> host cat /u01/app/oracle/oradata/rectl.sql

        CREATE CONTROLFILE REUSE DATABASE "orcl" NOARCHIVELOG NORESETLOGS

        MAXLOGFILES 16

        MAXLOGMEMBERS 3

        MAXDATAFILES 20

        MAXINSTANCES 8

        MAXLOGHISTORY 3

        LOGFILE

          GROUP 1(

            '/u01/app/oracle/oradata/orcl/redo01.log'

             ) SIZE 50M,

          GROUP 2(

            '/u01/app/oracle/oradata/orcl/redo2.log',

            '/u01/app/oracle/oradata/orcl/redo02.log'

          GROUP 3(

            '/u01/app/oracle/oradata/orcl/redo3.log',

            '/u01/app/oracle/oradata/orcl/redo03.log'

             ) SIZE 100M

        DATAFILE

          '/u01/app/oracle/oradata/orcl/tbs1_2.dbf',

          '/u01/app/oracle/oradata/orcl/tbs1_1.dbf',

          '/u01/app/oracle/oradata/orcl/example01.dbf',

          '/u01/app/oracle/oradata/orcl/users01.dbf',

          '/u01/app/oracle/oradata/orcl/sysaux01.dbf',

          '/u01/app/oracle/oradata/orcl/system01.dbf',

          '/u01/app/oracle/oradata/orcl/undotbs01.dbf'

        CHARACTER SET WE8ISO8859P1

        /

        --将数据库切换到open 状态

        SQL> select * from dual;

        D

        -

        X

        --查看已经新产生了控制文件

        SQL> host ls $ORACLE_BASE/oradata/orcl/control* -l  --可以看到新增了控制文件control01.ctl和control02.ctl

        -rw-r----- 1 oracle oinstall 6012928 Jul 15 12:58 /u01/app/oracle/oradata/orcl/control01.ctl

        -rw------- 1 oracle oinstall 7389184 Jul 15 12:04 /u01/app/oracle/oradata/orcl/control01.ctl.bak

        -rw-r----- 1 oracle oinstall 6012928 Jul 15 12:58 /u01/app/oracle/oradata/orcl/control02.ctl

    归档模式下控制文件全部丢失的处理

        --首先将数据库切换到归档模式

        SQL> startup mount;

        SQL> alter database archivelog;

        SQL> alter database open  ;

        --查看归档的状态

        SQL> archive log list;

        Database log mode              Archive Mode

        Automatic archival             Enabled

        Archive destination            USE_DB_RECOVERY_FILE_DEST

        Oldest online log sequence     1

        Next log sequence to archive   3

        Current log sequence           3

        --备份控制文件

        SQL> alter database backup controlfile to '/u01/app/oracle/oradata/orcl/rectl.bak';

        SQL> create table tb_temp(id int,col1 varchar2(20));

        Table created.

        SQL> insert into tb_temp select 1,'Robinson' from dual;

        1 row created.

        SQL> commit;

        Commit complete.

        SQL> alter system switch logfile;   --切换日志

        SQL> archive log list; --日志切换后sequence由变成

        Oldest online log sequence     2

        Next log sequence to archive   4

        Current log sequence           4

        --模拟控制文件全部丢失

        SQL> show parameter control

                                                         oradata/orcl/control02.ctl

        --查看物理控制文件是否存在                                             

        SQL> ho ls /u01/app/oracle/oradata/orcl/contr*

        ls: /u01/app/oracle/oradata/orcl/contr*: No such file or directory

        --建议先对数据库作备份再将备份的控制文件复制到参数文件中指定的位置

        SQL> ho cp /u01/app/oracle/oradata/orcl/rectl.bak/u01/app/oracle/oradata/orcl/control01.ctl

        SQL> ho cp /u01/app/oracle/oradata/orcl/rectl.bak/u01/app/oracle/oradata/orcl/control02.ctl

        alter database open

        *

        ORA-01589: must use RESETLOGS or NORESETLOGS option for database open

        ORA-01109: database not open

        SQL> alter database open resetlogs;

        SQL> select * from tb_temp;  --表成功被恢复

                ID COL1

        ---------- --------------------

                 1 Robinson

        SQL> drop table tb_temp purge;

        Table dropped.

        SQL> archive log list;   --日志的sequence号被置为

        Next log sequence to archive   1

        Current log sequence           1