首页 > Oracle > Oracle 控制文件,control file。
2013
09-03

Oracle 控制文件,control file。

control file在oracle数据库中担当很重要的角色,包含验证数据库完整性所需的信息,包括数据库中其它文件的名称,通常控制文件是映射的。由CKPT进程同步数据文件和控制文件,保证数据库同步。
SQL> select * from v$controlfile;
STATUS  NAME                                                                   IS_RECOVERY_DEST_FILE    BLOCK_SIZE    FILE_SIZE_BLKS
——- ————————————————–               —                                              ———-         ————–

        /opt/oracle/oradata/orcl/control01.ctl                       NO                                            16384            594
        /opt/oracle/flash_recovery_area/orcl/control02.ctl    NO                                            16384            594
了解控制文件的远离和结构,需要知道两个概念:SCN和检查点。
1. SCN:system change number,系统改变号,是数据库中非常重要的一个数据结构。用来标识数据库在某个时刻提交的版本,在事物提交的时候,它被赋予一个唯一的标识事物的SCN,每个数据库都有一个全局的SCN生成器。同时作为数据库内部时钟机制,在数据库中是唯一的,且随着时间的增加而增加,并不一定是连贯的。oracle通过SCN来维护数据库的一致性,并通过SCN实现oracle的恢复机制。SCN在数据库中随处可见:事务表,控制文件,日志文件,数据块头等都记录有SCN。这里只给大家介绍一下基础,至于具体的SCN值,请大家关注官方文档。
获取数据库当前的SCN:
SQL> select dbms_flashback.get_system_change_number from dual;
GET_SYSTEM_CHANGE_NUMBER
————————
                 1301761
2. 检查点:checkpoint,检查点可以看做是一个数据库事件,作用意义在于减少崩溃恢复的时间。当update的时候,首先会将数据读入内存buffer cache,同时oracle会记录重做redo信息用于恢复,有redo的存在,所以oracle不需要在提交的时候立即将数据写回磁盘,这样效率比较低,redo的存在也正是为了数据库崩溃之后可以恢复。如果数据库异常导致crash,那么内存中修改的数据还没有写入数据文件,在下一次启动数据库的时候,oracle通过redo日志进行前滚,将数据恢复在之前崩溃的状态,然后数据库正常打开使用,用户可以将未提交的事物回滚。但在这个过程中,检查点的作用就体现出来了,检查点的存在就是为了缩短这个恢复时间。
   当检查点发生时,oracle通知DBWR进程,把脏数据dirty data从buffer cache写入磁盘,完成之后,CKPT进程更新控制文件盒数据文件头,记录检查点信息,此时的SCN为checkpoint SCN,标识更新。
   关于检查点,是比较复杂的结构,这里就不作详细的介绍了。
下面演示一下数据库是怎样根据SCN和checkpoint来进行一致性判断及恢复控制的。
1. 首先shutdown数据库
SQL> shutdown immediate 
Database closed.
Database dismounted.
ORACLE instance shut down.
2. 在mount状态下转储,获取控制文件的内容
SQL> startup mount
ORACLE instance started.
Total System Global Area  630501376 bytes
Fixed Size                  2215984 bytes
Variable Size             427823056 bytes
Database Buffers          197132288 bytes
Redo Buffers                3330048 bytes
Database mounted.
SQL> alter session set events ‘immediate trace name CONTROLF level 12’;
Session altered.
SQL> SELECT    d.VALUE
  2  || ‘/’
  3  || LOWER (RTRIM (i.INSTANCE, CHR (0)))
  4  || ‘_ora_’
  5  || p.spid
  6  || ‘.trc’ trace_file_name
  7  FROM (SELECT p.spid
  8  FROM SYS.v$mystat m, SYS.v$session s, SYS.v$process p
  9  WHERE m.statistic# = 1 AND s.SID = m.SID AND p.addr = s.paddr) p,
 10  (SELECT t.INSTANCE
 11  FROM SYS.v$thread t, SYS.v$parameter v
 12  WHERE v.NAME = ‘thread’
 13  AND (v.VALUE = 0 OR t.thread# = TO_NUMBER (v.VALUE))) i,
 14  (SELECT VALUE
 15  FROM SYS.v$parameter
 16  WHERE NAME = ‘user_dump_dest’) d ;
 
TRACE_FILE_NAME
——————————————————————————————————————————————————————————————————–
/opt/oracle/diag/rdbms/orcl/ora11g/trace/ora11g_ora_12248.trc
然后我们来查看这个trace文件
***************************************************************************
DATABASE ENTRY
***************************************************************************
 (size = 316, compat size = 316, section max = 1, section in-use = 1,
  last-recid= 0, old-recno = 0, last-recno = 0)
 (extent = 1, blkno = 1, numrecs = 1)
 05/25/2013 07:58:51
 DB Name “ORCL”
 Database flags = 0x00404000 0x00001000
 Controlfile Creation Timestamp  05/25/2013 07:58:51
 Incmplt recovery scn: 0x0000.00000000
 Resetlogs scn: 0x0000.000e6c20 Resetlogs Timestamp  05/25/2013 07:58:51
 Prior resetlogs scn: 0x0000.00000001 Prior resetlogs Timestamp  08/15/2009 00:16:43
 Redo Version: compatible=0xb200000
 #Data files = 6, #Online files = 6
 Database checkpoint: Thread=1 scn:0x0000.0013dfeb  —–数据库检查点SCN
 Threads: #Enabled=1, #Open=0, Head=0, Tail=0
 enabled  threads:  01000000 00000000 00000000 00000000 00000000 00000000
  00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
  00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
  00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
  00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
  00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
  00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
  00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
  00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
  00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
  00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
  00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
  00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
  00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
  00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
  00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
  00000000 00000000 00000000 00000000 00000000 00000000
 Max log members = 3, Max data members = 1
 Arch list: Head=0, Tail=0, Force scn: 0x0000.0010572cscn: 0x0000.000e6c20
 Activation ID: 1344149179
 Controlfile Checkpointed at scn:  0x0000.0013c4ca 06/21/2013 08:30:20
***************************************************************************
REDO THREAD RECORDS
***************************************************************************
 (size = 256, compat size = 256, section max = 8, section in-use = 1,
  last-recid= 0, old-recno = 0, last-recno = 0)
 (extent = 1, blkno = 9, numrecs = 8)
THREAD #1 – status:0xe thread links forward:0 back:0
 #logs:3 first:1 last:3 current:3 last used seq#:0x30
 enabled at scn: 0x0000.000e6c20 05/25/2013 07:58:51
 disabled at scn: 0x0000.00000000 01/01/1988 00:00:00
 opened at 06/21/2013 08:30:20 by instance ora11g
Checkpointed at scn:  0x0000.0013dfeb 06/21/2013 13:05:07   —redo检查点信息
 thread:1 rba:(0x30.155f7.10)
 enabled  threads:  01000000 00000000 00000000 00000000 00000000 00000000
  00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
  00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
  00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
  00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
  00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
  00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
  00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
  00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
  00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
  00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
  00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
  00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
  00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
  00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
  00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
  00000000 00000000 00000000 00000000 00000000 00000000
 log history: 47
 restore point keep sequence: 0
 
***************************************************************************
DATA FILE RECORDS
***************************************************************************
 (size = 520, compat size = 520, section max = 100, section in-use = 6,
  last-recid= 115, old-recno = 0, last-recno = 0)
 (extent = 1, blkno = 11, numrecs = 100)
DATA FILE #1: 
  name #7: /opt/oracle/oradata/orcl/system01.dbf
creation size=0 block size=8192 status=0xe head=7 tail=7 dup=1
 tablespace 0, index=1 krfil=1 prev_file=0
 unrecoverable scn: 0x0000.00000000 01/01/1988 00:00:00
 Checkpoint cnt:180 scn: 0x0000.0013dfeb 06/21/2013 13:05:07    —数据文件检查点SCN
 Stop scn: 0x0000.0013dfeb 06/21/2013 13:05:07  —stop SCN
 Creation Checkpointed at scn:  0x0000.00000007 08/15/2009 00:16:48
 thread:0 rba:(0x0.0.0)
 enabled  threads:  00000000 00000000 00000000 00000000 00000000 00000000
  00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
  00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
  00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
  00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
  00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
  00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
  00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
  00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
  00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
  00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
  00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
  00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
  00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
  00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
  00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
  00000000 00000000 00000000 00000000 00000000 00000000
 Offline scn: 0x0000.000e6c1f prev_range: 0
 Online Checkpointed at scn:  0x0000.000e6c20 05/25/2013 07:58:51
 thread:1 rba:(0x1.2.0)
 Hot Backup end marker scn: 0x0000.00000000
 aux_file is NOT DEFINED 
这里数据库正常关闭后,因为执行了完全检查点,数据文件处于一致的状态,检查点SCN=stop SCN,下次启动oracle就能通过验证,正常启动。
以上是数据库正常关闭的情况,下面看一下数据库异常关闭的情况
1. 用shutdown abort模拟一次异常关闭,此方式关闭数据库,oracle会立即中断所有事物,关闭所有数据库链接,不执行检查点。此时oracle在下一次启动的时候必须执行实例恢复才能启动
SQL> shutdown abort
ORACLE instance shut down.
SQL> startup mount;
ORACLE instance started.
Total System Global Area  630501376 bytes
Fixed Size                  2215984 bytes
Variable Size             427823056 bytes
Database Buffers          197132288 bytes
Redo Buffers                3330048 bytes
Database mounted.
SQL> alter session set events ‘immediate trace name CONTROLF level 12’;
Session altered.
SQL> SELECT    d.VALUE
  2  || ‘/’
  3  || LOWER (RTRIM (i.INSTANCE, CHR (0)))
  4  || ‘_ora_’
  5  || p.spid
  6  || ‘.trc’ trace_file_name
  7  FROM (SELECT p.spid
  8  FROM SYS.v$mystat m, SYS.v$session s, SYS.v$process p
  9  WHERE m.statistic# = 1 AND s.SID = m.SID AND p.addr = s.paddr) p,
 10  (SELECT t.INSTANCE
 11  FROM SYS.v$thread t, SYS.v$parameter v
 12  WHERE v.NAME = ‘thread’
 13  AND (v.VALUE = 0 OR t.thread# = TO_NUMBER (v.VALUE))) i,
 14  (SELECT VALUE
 15  FROM SYS.v$parameter
 16  WHERE NAME = ‘user_dump_dest’) d ;
TRACE_FILE_NAME
——————————————————————————–
/opt/oracle/diag/rdbms/orcl/ora11g/trace/ora11g_ora_13223.trc
**************************************************************************
DATABASE ENTRY
***************************************************************************
 (size = 316, compat size = 316, section max = 1, section in-use = 1,
  last-recid= 0, old-recno = 0, last-recno = 0)
 (extent = 1, blkno = 1, numrecs = 1)
 05/25/2013 07:58:51
 DB Name “ORCL”
 Database flags = 0x00404000 0x00001000
 Controlfile Creation Timestamp  05/25/2013 07:58:51
 Incmplt recovery scn: 0x0000.00000000
 Resetlogs scn: 0x0000.000e6c20 Resetlogs Timestamp  05/25/2013 07:58:51
 Prior resetlogs scn: 0x0000.00000001 Prior resetlogs Timestamp  08/15/2009 00:16:43
 Redo Version: compatible=0xb200000
 #Data files = 6, #Online files = 6
 Database checkpoint: Thread=1 scn: 0x0000.0013dfee  –数据库检查点信息
 Threads: #Enabled=1, #Open=1, Head=1, Tail=1
 enabled  threads:  01000000 00000000 00000000 00000000 00000000 00000000
  00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
  00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
  00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
  00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
  00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
  00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
  00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
  00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
  00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
  00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
  00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
  00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
  00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
  00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
  00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
  00000000 00000000 00000000 00000000 00000000 00000000
 Max log members = 3, Max data members = 1
 Arch list: Head=0, Tail=0, Force scn: 0x0000.0010572cscn: 0x0000.000e6c20
 Activation ID: 1344149179
 Controlfile Checkpointed at scn:  0x0000.0013e049 06/21/2013 13:29:12
 ***************************************************************************
REDO THREAD RECORDS
***************************************************************************
 (size = 256, compat size = 256, section max = 8, section in-use = 1,
  last-recid= 0, old-recno = 0, last-recno = 0)
 (extent = 1, blkno = 9, numrecs = 8)
THREAD #1 – status:0xf thread links forward:0 back:0
 #logs:3 first:1 last:3 current:3 last used seq#:0x30
 enabled at scn: 0x0000.000e6c20 05/25/2013 07:58:51
 disabled at scn: 0x0000.00000000 01/01/1988 00:00:00
 opened at 06/21/2013 13:29:10 by instance ora11g
Checkpointed at scn:  0x0000.0013dfee 06/21/2013 13:29:10    –redo检查点信息
 thread:1 rba:(0x30.155f7.10)
 enabled  threads:  01000000 00000000 00000000 00000000 00000000 00000000
  00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
  00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
  00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
  00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
  00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
  00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
  00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
  00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
  00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
  00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
  00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
  00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
  00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
  00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
  00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
  00000000 00000000 00000000 00000000 00000000 00000000
 log history: 47
 restore point keep sequence: 0
***************************************************************************
DATA FILE RECORDS
***************************************************************************
 (size = 520, compat size = 520, section max = 100, section in-use = 6,
  last-recid= 115, old-recno = 0, last-recno = 0)
 (extent = 1, blkno = 11, numrecs = 100)
DATA FILE #1: 
  name #7: /opt/oracle/oradata/orcl/system01.dbf
creation size=0 block size=8192 status=0xe head=7 tail=7 dup=1
 tablespace 0, index=1 krfil=1 prev_file=0
 unrecoverable scn: 0x0000.00000000 01/01/1988 00:00:00
 Checkpoint cnt:181 scn: 0x0000.0013dfee 06/21/2013 13:29:10    —-数据文件检查点信息
 Stop scn: 0xffff.ffffffff 06/21/2013 13:05:07   —stop SCN
 Creation Checkpointed at scn:  0x0000.00000007 08/15/2009 00:16:48
 thread:0 rba:(0x0.0.0)
 enabled  threads:  00000000 00000000 00000000 00000000 00000000 00000000
  00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
  00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
  00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
  00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
  00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
  00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
  00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
  00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
  00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
  00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
  00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
  00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
  00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
  00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
  00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
  00000000 00000000 00000000 00000000 00000000 00000000
 Offline scn: 0x0000.000e6c1f prev_range: 0
 Online Checkpointed at scn:  0x0000.000e6c20 05/25/2013 07:58:51
 thread:1 rba:(0x1.2.0)
 Stop scn: 0xffff.ffffffff 06/21/2013 13:05:07  —这里由于数据库是异常关闭,数据库没有完成最后的检查点,所以此时数据文件的stop SCN为无穷大。
以上的所有checkpoint SCN都一致,只有stop SCN为无穷大,意味着数据库上一次没有正常关闭,导致没有执行完检查点,此时启动数据库就需要恢复。
聊到恢复,这里说一下,oracle在异常关闭后启动时,会自动执行实例恢复instance recovery,包含:cache recovery 和 transaction recovery,我们在启动后查看alert日志:
alter database open
Beginning crash recovery of 1 threads
Started redo scan
Completed redo scan
 read 55 KB redo, 41 data blocks need recovery
Started redo application at
 Thread 1: logseq 48, block 87544
Recovery of Online Redo Log: Thread 1 Group 3 Seq 48 Reading mem 0
  Mem# 0: /opt/oracle/oradata/orcl/redo03.log
Completed redo application of 0.04MB
Completed crash recovery at
 Thread 1: logseq 48, block 87654, scn 1322692
 41 data blocks read, 41 data blocks written, 55 redo k-bytes read
Fri Jun 21 13:40:27 2013
Thread 1 advanced to log sequence 49 (thread open)
Thread 1 opened at log sequence 49
  Current log# 1 seq# 49 mem# 0: /opt/oracle/oradata/orcl/redo01.log
Successful open of redo thread 1
MTTR advisory is disabled because FAST_START_MTTR_TARGET is not set
Fri Jun 21 13:40:27 2013
SMON: enabling cache recovery
Successfully onlined Undo Tablespace 2.
Verifying file header compatibility for 11g tablespace encryption..
Verifying 11g file header compatibility for tablespace encryption completed
SMON: enabling tx recovery
Database Characterset is WE8MSWIN1252
No Resource Manager plan active
replication_dependency_tracking turned off (no async multimaster replication found)
WARNING: AQ_TM_PROCESSES is set to 0. System operation                     might be adversely affected.
Completed: alter database open
Fri Jun 21 13:40:29 2013
db_recovery_file_dest_size of 3882 MB is 0.00% used. This is a
user-specified limit on the amount of space that will be used by this
database for recovery-related files, and does not reflect the amount of
space available in the underlying filesystem or ASM diskgroup.
oracle在恢复的过程中,首先读取日志,从最后完成的检查点开始,应用所有重做记录,这个过程叫做前滚rolling forward,也就是cache recovery过程,完成之后,数据库打开。
最后编辑:
作者:Jerry
一个积极向上的小青年,热衷于分享--Focus on DB,BI,ETL