写上一篇日志的时候,在转储数据文件头看详细信息的时候遇到一些问题,下面简单的说一下这个过程。
上次说到open阶段,数据库在这个阶段会做两个校验,主要是:
1,checkpoint cnt
2,scn
在这两个都相同的情况下,就能open数据库了。
那么怎么来得到这两个数据的详细信息呢?简单的做个试验给大家看下:
一、先说下能顺利打开数据库的情况
SQL> startup mount --为了验证open阶段的过程,启动数据库到mount状态
ORACLE instance started.
上次说到open阶段,数据库在这个阶段会做两个校验,主要是:
1,checkpoint cnt
2,scn
在这两个都相同的情况下,就能open数据库了。
那么怎么来得到这两个数据的详细信息呢?简单的做个试验给大家看下:
一、先说下能顺利打开数据库的情况
SQL> startup mount --为了验证open阶段的过程,启动数据库到mount状态
ORACLE instance started.
Total System Global Area 285212672 bytes
Fixed Size 1218992 bytes
Variable Size 83887696 bytes
Database Buffers 197132288 bytes
Redo Buffers 2973696 bytes
Database mounted.
Fixed Size 1218992 bytes
Variable Size 83887696 bytes
Database Buffers 197132288 bytes
Redo Buffers 2973696 bytes
Database mounted.
转储控制文件:
SQL> alter session set events 'immediate trace name CONTROLF level 8';
SQL> alter session set events 'immediate trace name CONTROLF level 8';
Session altered.
选取datafile 1作为参考:
DATA FILE #1:
(name #4) /oracle/ora10/oradata/orcl/system01.dbf
creation size=38400 block size=8192 status=0xe head=4 tail=4 dup=1
tablespace 0, index=1 krfil=1 prev_file=0
unrecoverable scn: 0x0000.00000000 01/01/1988 00:00:00
Checkpoint cnt:91 scn: 0x0000.0006e7aa 12/07/2011 18:12:34
Stop scn: 0x0000.0006e7aa 12/07/2011 18:12:34
Creation Checkpointed at scn: 0x0000.00000005 04/11/2011 21:45:10
thread:1 rba:(0x1.3.10)
这里记录了数据文件的checkpoint cnt和start scn以及stop scn
DATA FILE #1:
(name #4) /oracle/ora10/oradata/orcl/system01.dbf
creation size=38400 block size=8192 status=0xe head=4 tail=4 dup=1
tablespace 0, index=1 krfil=1 prev_file=0
unrecoverable scn: 0x0000.00000000 01/01/1988 00:00:00
Checkpoint cnt:91 scn: 0x0000.0006e7aa 12/07/2011 18:12:34
Stop scn: 0x0000.0006e7aa 12/07/2011 18:12:34
Creation Checkpointed at scn: 0x0000.00000005 04/11/2011 21:45:10
thread:1 rba:(0x1.3.10)
这里记录了数据文件的checkpoint cnt和start scn以及stop scn
转储数据文件: ----注意换一个session,要不trace文件不会变的
SQL> alter session set events 'immediate trace name file_hdrs level 10';
SQL> alter session set events 'immediate trace name file_hdrs level 10';
Session altered.
同样选取datafile 1作为参考:
DATA FILE #1:
(name #4) /oracle/ora10/oradata/orcl/system01.dbf
creation size=38400 block size=8192 status=0xe head=4 tail=4 dup=1
tablespace 0, index=1 krfil=1 prev_file=0
unrecoverable scn: 0x0000.00000000 01/01/1988 00:00:00
Checkpoint cnt:91 scn: 0x0000.0006e7aa 12/07/2011 18:12:34
Stop scn: 0x0000.0006e7aa 12/07/2011 18:12:34
Creation Checkpointed at scn: 0x0000.00000005 04/11/2011 21:45:10
thread:1 rba:(0x1.3.10)
这部分数据与控制文件中的都一致!接下来trace文件中还有一部分信息如下:
FILE HEADER:
Compatibility Vsn = 169869568=0xa200100
Db ID=1275996639=0x4c0e29df, Db Name='ORCL'
Activation ID=0=0x0
Control Seq=468=0x1d4, File size=61440=0xf000
File Number=1, Blksiz=8192, File Type=3 DATA
Tablespace #0 - SYSTEM rel_fn:1
Creation at scn: 0x0000.00000005 04/11/2011 21:45:10
Backup taken at scn: 0x0000.00000000 01/01/1988 00:00:00 thread:0
reset logs count:0x2c98de5f scn: 0x0000.00000001 reset logs terminal rcv data:0x0 scn: 0x0000.00000000
prev reset logs count:0x0 scn: 0x0000.00000000 prev reset logs terminal rcv data:0x0 scn: 0x0000.00000000
recovered at 12/06/2011 21:58:48
status:0x2000 root dba:0x00400179 chkpt cnt: 91 ctl cnt:90
begin-hot-backup file size: 0
Checkpointed at scn: 0x0000.0006e7aa 12/07/2011 18:12:34
thread:1 rba:(0x20.6d45.10)
上面这段信息发现有chkpt cnt: 91 ctl cnt:90和Checkpointed at scn: 0x0000.0006e7aa 这3个信息?跟第一部分信息和控制文件中的信息有什么关系呢?
这里cnt还有两个值,chkpt cnt: 91和ctl cnt:90,为什么chkpt cnt比ctl cnt大1呢?这是因为更新控制文件的checkpoint cnt的时候不能保证成功,所以记下上一次成功的cnt,确保上一次是成功的。
看了上面3部分信息都是一致的,那么数据库是能顺利启动的,具体他们之间的联系和区别,在下面一部分再介绍,先看下还能启动数据库:
SQL> alter database open;
DATA FILE #1:
(name #4) /oracle/ora10/oradata/orcl/system01.dbf
creation size=38400 block size=8192 status=0xe head=4 tail=4 dup=1
tablespace 0, index=1 krfil=1 prev_file=0
unrecoverable scn: 0x0000.00000000 01/01/1988 00:00:00
Checkpoint cnt:91 scn: 0x0000.0006e7aa 12/07/2011 18:12:34
Stop scn: 0x0000.0006e7aa 12/07/2011 18:12:34
Creation Checkpointed at scn: 0x0000.00000005 04/11/2011 21:45:10
thread:1 rba:(0x1.3.10)
这部分数据与控制文件中的都一致!接下来trace文件中还有一部分信息如下:
FILE HEADER:
Compatibility Vsn = 169869568=0xa200100
Db ID=1275996639=0x4c0e29df, Db Name='ORCL'
Activation ID=0=0x0
Control Seq=468=0x1d4, File size=61440=0xf000
File Number=1, Blksiz=8192, File Type=3 DATA
Tablespace #0 - SYSTEM rel_fn:1
Creation at scn: 0x0000.00000005 04/11/2011 21:45:10
Backup taken at scn: 0x0000.00000000 01/01/1988 00:00:00 thread:0
reset logs count:0x2c98de5f scn: 0x0000.00000001 reset logs terminal rcv data:0x0 scn: 0x0000.00000000
prev reset logs count:0x0 scn: 0x0000.00000000 prev reset logs terminal rcv data:0x0 scn: 0x0000.00000000
recovered at 12/06/2011 21:58:48
status:0x2000 root dba:0x00400179 chkpt cnt: 91 ctl cnt:90
begin-hot-backup file size: 0
Checkpointed at scn: 0x0000.0006e7aa 12/07/2011 18:12:34
thread:1 rba:(0x20.6d45.10)
上面这段信息发现有chkpt cnt: 91 ctl cnt:90和Checkpointed at scn: 0x0000.0006e7aa 这3个信息?跟第一部分信息和控制文件中的信息有什么关系呢?
这里cnt还有两个值,chkpt cnt: 91和ctl cnt:90,为什么chkpt cnt比ctl cnt大1呢?这是因为更新控制文件的checkpoint cnt的时候不能保证成功,所以记下上一次成功的cnt,确保上一次是成功的。
看了上面3部分信息都是一致的,那么数据库是能顺利启动的,具体他们之间的联系和区别,在下面一部分再介绍,先看下还能启动数据库:
SQL> alter database open;
Database altered.
可以看到数据库是能顺利启动的,没有问题!
可以看到数据库是能顺利启动的,没有问题!
二、用旧的控制文件启动数据库
先备份下控制文件,用以前旧的控制文件来启动
[oracle@LOCALHOST orcl]$ mv control02.ctl control02.ctl_n
[oracle@LOCALHOST orcl]$ mv control02.ctl_o control02.ctl
SQL> startup mount
ORACLE instance started.
先备份下控制文件,用以前旧的控制文件来启动
[oracle@LOCALHOST orcl]$ mv control02.ctl control02.ctl_n
[oracle@LOCALHOST orcl]$ mv control02.ctl_o control02.ctl
SQL> startup mount
ORACLE instance started.
Total System Global Area 285212672 bytes
Fixed Size 1218992 bytes
Variable Size 67110480 bytes
Database Buffers 213909504 bytes
Redo Buffers 2973696 bytes
Database mounted.
顺利启动到mount状态,接下来转储控制文件和数据文件来看一下:
转储控制文件:
SQL> alter session set events 'immediate trace name CONTROLF level 8';
Fixed Size 1218992 bytes
Variable Size 67110480 bytes
Database Buffers 213909504 bytes
Redo Buffers 2973696 bytes
Database mounted.
顺利启动到mount状态,接下来转储控制文件和数据文件来看一下:
转储控制文件:
SQL> alter session set events 'immediate trace name CONTROLF level 8';
Session altered.
选取datafile 1来看下:
DATA FILE #1:
(name #4) /oracle/ora10/oradata/orcl/system01.dbf
creation size=38400 block size=8192 status=0xe head=4 tail=4 dup=1
tablespace 0, index=1 krfil=1 prev_file=0
unrecoverable scn: 0x0000.00000000 01/01/1988 00:00:00
Checkpoint cnt:87 scn: 0x0000.0006e6ca 12/07/2011 18:10:32
Stop scn: 0x0000.0006e6ca 12/07/2011 18:10:32
Creation Checkpointed at scn: 0x0000.00000005 04/11/2011 21:45:10
thread:1 rba:(0x1.3.10)
看到这里的checkpoint cnt是87,scn是0x0000.0006e6ca 是旧的控制文件中的!
选取datafile 1来看下:
DATA FILE #1:
(name #4) /oracle/ora10/oradata/orcl/system01.dbf
creation size=38400 block size=8192 status=0xe head=4 tail=4 dup=1
tablespace 0, index=1 krfil=1 prev_file=0
unrecoverable scn: 0x0000.00000000 01/01/1988 00:00:00
Checkpoint cnt:87 scn: 0x0000.0006e6ca 12/07/2011 18:10:32
Stop scn: 0x0000.0006e6ca 12/07/2011 18:10:32
Creation Checkpointed at scn: 0x0000.00000005 04/11/2011 21:45:10
thread:1 rba:(0x1.3.10)
看到这里的checkpoint cnt是87,scn是0x0000.0006e6ca 是旧的控制文件中的!
转储数据文件头:
同样选取datafile 1来看:
第一部分:
DATA FILE #1:
(name #4) /oracle/ora10/oradata/orcl/system01.dbf
creation size=38400 block size=8192 status=0xe head=4 tail=4 dup=1
tablespace 0, index=1 krfil=1 prev_file=0
unrecoverable scn: 0x0000.00000000 01/01/1988 00:00:00
Checkpoint cnt:87 scn: 0x0000.0006e6ca 12/07/2011 18:10:32
Stop scn: 0x0000.0006e6ca 12/07/2011 18:10:32
Creation Checkpointed at scn: 0x0000.00000005 04/11/2011 21:45:10
thread:1 rba:(0x1.3.10)
这里的现象大家发现了吗?这里的checkpoint cnt和scn竟然与老的控制文件是一样的!
开始我也不能理解,这样的话岂不是通过旧的控制文件也能启动了?这个逻辑是肯定不通的!后来继续往下看file header,如下:
FILE HEADER:
Compatibility Vsn = 169869568=0xa200100
Db ID=1275996639=0x4c0e29df, Db Name='ORCL'
Activation ID=0=0x0
Control Seq=487=0x1e7, File size=61440=0xf000
File Number=1, Blksiz=8192, File Type=3 DATA
Tablespace #0 - SYSTEM rel_fn:1
Creation at scn: 0x0000.00000005 04/11/2011 21:45:10
Backup taken at scn: 0x0000.00000000 01/01/1988 00:00:00 thread:0
reset logs count:0x2c98de5f scn: 0x0000.00000001 reset logs terminal rcv data:0x0 scn: 0x0000.00000000
prev reset logs count:0x0 scn: 0x0000.00000000 prev reset logs terminal rcv data:0x0 scn: 0x0000.00000000
recovered at 12/06/2011 21:58:48
status:0x2000 root dba:0x00400179 chkpt cnt: 93 ctl cnt:92
begin-hot-backup file size: 0
Checkpointed at scn: 0x0000.0006f41e 12/07/2011 23:26:27
thread:1 rba:(0x20.c06b.10)
这里的chkpt cnt: 93和Checkpointed at scn(0x0000.0006f41e即455710)的值与上面第一部分是不一样的!FILE HEADER的这部分信息与v$datafile_header是一样的,如下:
SQL> select name,CHECKPOINT_CHANGE#,CHECKPOINT_COUNT from v$datafile_header where FILE#=1;
同样选取datafile 1来看:
第一部分:
DATA FILE #1:
(name #4) /oracle/ora10/oradata/orcl/system01.dbf
creation size=38400 block size=8192 status=0xe head=4 tail=4 dup=1
tablespace 0, index=1 krfil=1 prev_file=0
unrecoverable scn: 0x0000.00000000 01/01/1988 00:00:00
Checkpoint cnt:87 scn: 0x0000.0006e6ca 12/07/2011 18:10:32
Stop scn: 0x0000.0006e6ca 12/07/2011 18:10:32
Creation Checkpointed at scn: 0x0000.00000005 04/11/2011 21:45:10
thread:1 rba:(0x1.3.10)
这里的现象大家发现了吗?这里的checkpoint cnt和scn竟然与老的控制文件是一样的!
开始我也不能理解,这样的话岂不是通过旧的控制文件也能启动了?这个逻辑是肯定不通的!后来继续往下看file header,如下:
FILE HEADER:
Compatibility Vsn = 169869568=0xa200100
Db ID=1275996639=0x4c0e29df, Db Name='ORCL'
Activation ID=0=0x0
Control Seq=487=0x1e7, File size=61440=0xf000
File Number=1, Blksiz=8192, File Type=3 DATA
Tablespace #0 - SYSTEM rel_fn:1
Creation at scn: 0x0000.00000005 04/11/2011 21:45:10
Backup taken at scn: 0x0000.00000000 01/01/1988 00:00:00 thread:0
reset logs count:0x2c98de5f scn: 0x0000.00000001 reset logs terminal rcv data:0x0 scn: 0x0000.00000000
prev reset logs count:0x0 scn: 0x0000.00000000 prev reset logs terminal rcv data:0x0 scn: 0x0000.00000000
recovered at 12/06/2011 21:58:48
status:0x2000 root dba:0x00400179 chkpt cnt: 93 ctl cnt:92
begin-hot-backup file size: 0
Checkpointed at scn: 0x0000.0006f41e 12/07/2011 23:26:27
thread:1 rba:(0x20.c06b.10)
这里的chkpt cnt: 93和Checkpointed at scn(0x0000.0006f41e即455710)的值与上面第一部分是不一样的!FILE HEADER的这部分信息与v$datafile_header是一样的,如下:
SQL> select name,CHECKPOINT_CHANGE#,CHECKPOINT_COUNT from v$datafile_header where FILE#=1;
NAME CHECKPOINT_CHANGE# CHECKPOINT_COUNT
-------------------------------------------------- ------------------ ----------------
/oracle/ora10/oradata/orcl/system01.dbf 455710 93
这两个值与file header找到的信息是一样的!
-------------------------------------------------- ------------------ ----------------
/oracle/ora10/oradata/orcl/system01.dbf 455710 93
这两个值与file header找到的信息是一样的!
综合上面的试验情况,可以得出第一部分的信息其实是来自于控制文件的,FILE HEADER部分的信息才是当前文件的信息!
上面这种情况,checkpoint cnt和scn都不一样,所以数据库是不能启动的,控制文件过旧,这时候可以使用备份的控制文件或者重建控制文件。
SQL> alter database open;
alter database open
*
ERROR at line 1:
ORA-01122: database file 1 failed verification check
ORA-01110: data file 1: '/oracle/ora10/oradata/orcl/system01.dbf'
ORA-01207: file is more recent than control file - old control file
可以看到,这时候数据库是不能open的!
上面这种情况,checkpoint cnt和scn都不一样,所以数据库是不能启动的,控制文件过旧,这时候可以使用备份的控制文件或者重建控制文件。
SQL> alter database open;
alter database open
*
ERROR at line 1:
ORA-01122: database file 1 failed verification check
ORA-01110: data file 1: '/oracle/ora10/oradata/orcl/system01.dbf'
ORA-01207: file is more recent than control file - old control file
可以看到,这时候数据库是不能open的!
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/26463985/viewspace-712886/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/26463985/viewspace-712886/