天天看點

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