2020年(Oracle管理)ORACLE数据文件和控制文件头部
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
(Oracle管理)ORACLE 数据文件和控制文件头部
为了回答关于《深入浅出Oracle》中的一些疑问,引出本系列文章,讨论链接参考:
http:///609499.html
在上一讲中,我们说过:当我们使用file_hdrs事件来转储数据文件头信息时,Oracle会转储两部分信息,一部分来自控制文件,一部分来自数据文件,在数据库启动过程中,这两部分信息要用来进行启动验证。
在数据库open的过程中,Oracle要进行检查中包含以下两个过程:
第一次检查数据文件头中的Checkpointcnt是否与对应控制文件中的Checkpointcnt一致.
如果相等,进行第二次检查.
第二次检查数据文件头的开始SCN和对应控制文件中的结束SCN是否一致如果结束SCN等于开始SCN,则不需要对那个文件进行恢复.
对每个数据文件都完成检查后,打开数据库.同时将每个数据文件的结束SCN设置为无穷大.
通过以下过程我们来进一步说明一下这个内容。
我们来看以下来自控制文件部分(选取一个文件测试):
DATAFILE#4:
(name#4)/opt/oracle/oradata/eygle/eygle01.dbf
creationsize=0blocksize=8192status=0xehead=4tail=4dup=1
tablespace4,index=4krfil=4prev_file=0
unrecoverablescn:0x0000.0000000001/01/198800:00:00
Checkpointcnt:58scn:0x0000.002ac8ee08/11/200609:48:29
Stopscn:0x0000.002ac8ee08/11/200609:48:29
CreationCheckpointedatscn:0x0000.0015078d06/06/200609:41:54
thread:0rba:(0x0.0.0)
................
aux_fileisNOTDEFINED
这部分中包含的重要信息有:
检查点计数:Checkpointcnt:58
检查点SCN:scn:0x0000.002ac8ee08/11/200609:48:29
数据文件StopSCN:Stopscn:0x0000.002ac8ee08/11/200609:48:29
我们再看来自数据文件头的信息:
FILEHEADER:
Softwarevsn=153092096=0x9200000,CompatibilityVsn=134217728=0x8000000
DbID=1407686520=0x53e79778,DbName='EYGLE'
ActivationID=0=0x0
ControlSeq=979=0x3d3,Filesize=1280=0x500
FileNumber=4,Blksiz=8192,FileType=3DATA
Tablespace#4-EYGLErel_fn:4
Creationatscn:0x0000.0015078d06/06/200609:41:54
Backuptakenatscn:0x0000.0000000001/01/198800:00:00thread:0
resetlogscount:0x232bee1fscn:0x0000.0007c781recoveredat08/10/200620:57:53
status:0x0rootdba:0x00000000chkptcnt:58ctlcnt:57
begin-hot-backupfilesize:0
Checkpointedatscn:0x0000.002ac8ee08/11/200609:48:29 .......................
这部分中包含的重要信息有:
检查点SCN:Checkpointedatscn:0x0000.002ac8ee08/11/200609:48:29
检查点计数:chkptcnt:58ctlcnt:57
这两者都和控制文件中所记录的一致。
如果这两者一致,数据库启动时就能通过验证,启动数据库。
那么如果不一致呢?
Oracle则请求进行恢复。
我们看,从备份中恢复eygle01.dbf文件.
首先第一部分从控制文件中获得的信息是相同的:
DATAFILE#4:
(name#4)/opt/oracle/oradata/eygle/eygle01.dbf
creationsize=0blocksize=8192status=0xehead=4tail=4dup=1
tablespace4,index=4krfil=4prev_file=0
unrecoverablescn:0x0000.0000000001/01/198800:00:00
Checkpointcnt:58scn:0x0000.002ac8ee08/11/200609:48:29
Stopscn:0x0000.002ac8ee08/11/200609:48:29
CreationCheckpointedatscn:0x0000.0015078d06/06/200609:41:54 ...................
aux_fileisNOTDEFINED
检查点计数:Checkpointcnt:58
检查点SCN:scn:0x0000.002ac8ee08/11/200609:48:29
数据文件StopSCN:Stopscn:0x0000.002ac8ee08/11/200609:48:29
而从文件头中获得的备份文件信息则是:
FILEHEADER:
Softwarevsn=153092096=0x9200000,CompatibilityVsn=134217728=0x8000000
DbID=1407686520=0x53e79778,DbName='EYGLE'
ActivationID=0=0x0
ControlSeq=973=0x3cd,Filesize=1280=0x500
FileNumber=4,Blksiz=8192,FileType=3DATA
Tablespace#4-EYGLErel_fn:4
Creationatscn:0x0000.0015078d06/06/200609:41:54
Backuptakenatscn:0x0000.0000000001/01/198800:00:00thread:0
resetlogscount:0x232bee1fscn:0x0000.0007c781recoveredat08/10/200620:57:53
status:0x0rootdba:0x00000000chkptcnt:53ctlcnt:52
begin-hot-backupfilesize:0
Checkpointedatscn:0x0000.002ac5f908/10/200620:58:21 ...................................
我们看到此时备份文件的信息:
检查点是:Checkpointedatscn:0x0000.002ac5f908/10/200620:58:21
检查点计数为:chkptcnt:53ctlcnt:52
这两者不再一致,首先是检查点技术不一致,当前文件的chkptcnt为53,小于控制文件中记录的58,Oracle可以判断文件是从备份中恢复的,或者文件故障,需要进行介质恢复。
我们看如果此时我们试图打开数据库,则Oracle提示文件需要介质恢复:
SQL>alterdatabaseopen;
alterdatabaseopen
*
ERRORatline1:
ORA-01113:file4needsmediarecovery
ORA-01110:datafile4:'/opt/oracle/oradata/eygle/eygle01.dbf'
执行恢复:
我们看看恢复完成之后,控制文件和数据文件的变化.
首先看控制文件的变化:
DATAFILE#4:
(name#4)/opt/oracle/oradata/eygle/eygle01.dbf
creationsize=0blocksize=8192status=0xehead=4tail=4dup=1
tablespace4,index=4krfil=4prev_file=0
unrecoverablescn:0x0000.0000000001/01/198800:00:00
Checkpointcnt:59scn:0x0000.002ac8ee08/11/200609:48:29
Stopscn:0x0000.002ac8ed08/11/200609:48:29 CreationCheckpointedatscn:0x0000.0015078d06/06/200609:41:54 ......................
检查点计数:Checkpointcnt:59
执行了恢复之后,检查点计数较前增加了1
检查点SCN:scn:0x0000.002ac8ee08/11/200609:48:29
数据文件Stopscn:0x0000.002ac8ed08/11/200609:48:29
数据文件Stopscn和数据文件进行了同步。
数据文件头信息:
FILEHEADER:
Softwarevsn=153092096=0x9200000,CompatibilityVsn=134217728=0x8000000 DbID=1407686520=0x53e79778,DbName='EYGLE'
ActivationID=0=0x0
ControlSeq=983=0x3d7,Filesize=1280=0x500
FileNumber=4,Blksiz=8192,FileType=3DATA
Tablespace#4-EYGLErel_fn:4
Creationatscn:0x0000.0015078d06/06/200609:41:54
Backuptakenatscn:0x0000.0000000001/01/198800:00:00thread:0 resetlogscount:0x232bee1fscn:0x0000.0007c781recoveredat08/11/200610:11:26 status:0x0rootdba:0x00000000chkptcnt:59ctlcnt:58
begin-hot-backupfilesize:0
Checkpointedatscn:0x0000.002ac8ed08/11/200609:48:29 ..........................
我们看到此时数据文件的信息:
检查点是:Checkpointedatscn:0x0000.002ac8ed08/11/200609:48:29
这个检查点和控制文件中记录的stopscn一致,数据库启动可以顺利进行。
检查点计数为:chkptcnt:59ctlcnt:58
我们打开数据库:
SQL>alterdatabaseopen;
Databasealtered.
SQL>altersessionsetevents'immediatetracenamefile_hdrslevel10'; Sessionaltered.
此时数据库恢复正常运行。
控制文件信息如下:
DATAFILE#4:
(name#4)/opt/oracle/oradata/eygle/eygle01.dbf
creationsize=0blocksize=8192status=0xehead=4tail=4dup=1
tablespace4,index=4krfil=4prev_file=0
unrecoverablescn:0x0000.0000000001/01/198800:00:00
Checkpointcnt:60scn:0x0000.002ac8ef08/11/200610:19:30
Stopscn:0xffff.ffffffff08/11/200609:48:29 CreationCheckpointedatscn:0x0000.0015078d06/06/200609:41:54
此时stopscn被置为无穷大。
数据文件头信息如下:
FILEHEADER:
Softwarevsn=153092096=0x9200000,CompatibilityVsn=134217728=0x8000000 DbID=1407686520=0x53e79778,DbName='EYGLE'
ActivationID=0=0x0
ControlSeq=984=0x3d8,Filesize=1280=0x500
FileNumber=4,Blksiz=8192,FileType=3DATA
Tablespace#4-EYGLErel_fn:4
Creationatscn:0x0000.0015078d06/06/200609:41:54
Backuptakenatscn:0x0000.0000000001/01/198800:00:00thread:0 resetlogscount:0x232bee1fscn:0x0000.0007c781recoveredat08/11/200610:11:26 status:0x4rootdba:0x00000000chkptcnt:60ctlcnt:59
begin-hot-backupfilesize:0
Checkpointedatscn:0x0000.002ac8ef08/11/200610:19:30
未完待续...
10.1.0~lgone@ONE.LG.OK>createtablea(vvarchar2(4000))TABLESPACEt; Tablecreated.
10.1.0~lgone@ONE.LG.OK>insertintoavalues('a');
1rowcreated.
Startdumpdatablockstsn:17file#:5minblk10maxblk10
buffertsn:17rdba:0x0140000a(5/10)
////buffertsn:
数据文件对应的tablespace的number这只是dump文件中记录的数据而已block中是没有记录tablespace的number的
scn:0x0000.0043890eseq:0x05flg:0x02tail:0x890e0605
frmt:0x02chkval:0x0000type:0x06=transdata
Blockheaderdump:0x0140000a
ObjectidonBlock?Y
seg/obj:0xd254csc:0x00.43890aitc:2flg:Otyp:1-DATA
fsl:0fnx:0x0ver:0x01
ItlXidUbaFlagLckScn/Fsc
0x010x0004.00c.000018500x00801496.07b9.01--U-1fsc0x0000.0043890e 0x020x0000.000.000000000x00000000.0000.00----0fsc0x0000.00000000 data_block_dump,dataheaderat0x87e125c
////data_block_dump,dataheaderat0x87e125c
其实这个block不是直接从databuffer中dump出来的这个表示真正dump时block的数据区的起始位置
也就是下面这部分开始的位置
===============////tsiz:hsiz:pbl:bdba:在数据文件都是没有存储的tsiz:0x1fa0////Totaldataareasize
8k的block:8192-20(blockhead)-24(TransactionHeader)-24*2(一个事务条)-4(blocktail)=8096(0x1fa0)
hsiz:0x14////Dataheadersize数据块头20个字节+数据块尾4个字节=24字节(0x14)
pbl:0x087e125c////Pointertobufferholdingtheblock
bdba:0x0140000a
76543210
flag=--------
ntab=1
nrow=1
frre=-1
fsbo=0x14
fseo=0x1f9b
avsp=0x1f83
tosp=0x1f83
0xe:pti[0]nrow=1offs=0
0x12:pri[0]offs=0x1f9b
block_row_dump:
tab0,row0,@0x1f9b
tl:5fb:--H-FL--lb:0x1cc:1
col0:[1]61
end_of_block_dump
Enddumpdatablockstsn:17file#:5minblk10maxblk10
block坏掉了还可以报:
ORA-600(4519)Cachelayerblocktypeisincorrect
ORA-600(4393)CheckforTypeforSegmentheaderwithfreelist
ORA-600(4136)CheckRollbacksegmentblock
ORA-600(4154)CheckRollbacksegmentblock
Ora-600[kcbzpb_1],[d],[kind],[chk]getssignaledwhentheblockgotcorrupte dinmemory. Theonlywayitshouldbebadisifastraystoreintomemorydestroyedtheheader ortail.
d=blocknumber,kind=kindofcorruptiondetected,chk=checksumflag
ora-600[3398]andora-600[3339]
ora-600[3398]isnotinoracle8.
ora-600[3398]meansitfailedaverificationcheckbeforewritingbacktodisk,so itmust
beanin-memorycorruption.
ora-600[3339]comeswithora-1578andmeanseitherdiskcorruptionorinme morycorruptionafterread.
ora-600[3339]hasbeenremovedfrom7.2+
From7.2+ora-600[3398]hasbecomeora-600[3374]withsomechecksadded. 2进制存储格式
ALTERSESSIONSETEVENTS'10289tracenamecontextforever,level1';
ALTERSESSIONSETEVENTS'10289tracenamecontextoff';
为了回答一些疑问,引出本系列文章,讨论链接参考:
http:///609499.html
当我们使用file_hdrs事件来转储数据文件头信息时,Oracle会转储两部分信息,一部分来自控制文件,一部分来自数据文件,在数据库启动过程中,这两部分信息要用来进行启动验证。
在数据库open的过程中,Oracle要进行检查中包含以下两个过程:
第一次检查数据文件头中的Checkpointcnt是否与对应控制文件中的Checkpointcnt一致.如果相等,进行第二次检查.
第二次检查数据文件头的开始SCN和对应控制文件中的结束SCN是否一致如果结束SCN等于开始SCN,则不需要对那个文件进行恢复.对每个数据文件都完成检查后,打开数据库.同时将每个数据文件的结束SCN 设置为无穷大.
通过以下过程我们来进一步说明一下这个内容。
我们来看以下来自控制文件部分(选取一个文件测试):
DATAFILE#4:
(name#4)/opt/oracle/oradata/eygle/eygle01.dbf
creationsize=0blocksize=8192status=0xehead=4tail=4dup=1
tablespace4,index=4krfil=4prev_file=0
unrecoverablescn:0x0000.0000000001/01/198800:00:00
Checkpointcnt:58scn:0x0000.002ac8ee08/11/200609:48:29
Stopscn:0x0000.002ac8ee08/11/200609:48:29
CreationCheckpointedatscn:0x0000.0015078d06/06/200609:41:54
thread:0rba:(0x0.0.0)
................
aux_fileisNOTDEFINED
这部分中包含的重要信息有:
检查点计数:Checkpointcnt:58
检查点SCN:scn:0x0000.002ac8ee08/11/200609:48:29
数据文件StopSCN:Stopscn:0x0000.002ac8ee08/11/200609:48:29
我们再看来自数据文件头的信息:
FILEHEADER:
Softwarevsn=153092096=0x9200000,CompatibilityVsn=134217728=0x8000000
DbID=1407686520=0x53e79778,DbName='EYGLE'
ActivationID=0=0x0
ControlSeq=979=0x3d3,Filesize=1280=0x500
FileNumber=4,Blksiz=8192,FileType=3DATA
T ablespace#4-EYGLErel_fn:4
Creationatscn:0x0000.0015078d06/06/200609:41:54
Backuptakenatscn:0x0000.0000000001/01/198800:00:00thread:0
resetlogscount:0x232bee1fscn:0x0000.0007c781recoveredat08/10/200620:57:53
status:0x0rootdba:0x00000000chkptcnt:58ctlcnt:57
begin-hot-backupfilesize:0
Checkpointedatscn:0x0000.002ac8ee08/11/200609:48:29 .......................
这部分中包含的重要信息有:
检查点SCN:Checkpointedatscn:0x0000.002ac8ee08/11/200609:48:29
检查点计数:chkptcnt:58ctlcnt:57
这两者都和控制文件中所记录的一致。
如果这两者一致,数据库启动时就能通过验证,启动数据库。
那么如果不一致呢?
Oracle则请求进行恢复。
我们看,从备份中恢复eygle01.dbf文件.
首先第一部分从控制文件中获得的信息是相同的:
DATAFILE#4:
(name#4)/opt/oracle/oradata/eygle/eygle01.dbf
creationsize=0blocksize=8192status=0xehead=4tail=4dup=1
tablespace4,index=4krfil=4prev_file=0
unrecoverablescn:0x0000.0000000001/01/198800:00:00
Checkpointcnt:58scn:0x0000.002ac8ee08/11/200609:48:29
Stopscn:0x0000.002ac8ee08/11/200609:48:29
CreationCheckpointedatscn:0x0000.0015078d06/06/200609:41:54 ...................
aux_fileisNOTDEFINED
检查点计数:Checkpointcnt:58
检查点SCN:scn:0x0000.002ac8ee08/11/200609:48:29
数据文件StopSCN:Stopscn:0x0000.002ac8ee08/11/200609:48:29
而从文件头中获得的备份文件信息则是:
FILEHEADER:
Softwarevsn=153092096=0x9200000,CompatibilityVsn=134217728=0x8000000
DbID=1407686520=0x53e79778,DbName='EYGLE'
ActivationID=0=0x0
ControlSeq=973=0x3cd,Filesize=1280=0x500
FileNumber=4,Blksiz=8192,FileType=3DATA
T ablespace#4-EYGLErel_fn:4
Creationatscn:0x0000.0015078d06/06/200609:41:54
Backuptakenatscn:0x0000.0000000001/01/198800:00:00thread:0
resetlogscount:0x232bee1fscn:0x0000.0007c781recoveredat08/10/200620:57:53
status:0x0rootdba:0x00000000chkptcnt:53ctlcnt:52
begin-hot-backupfilesize:0
Checkpointedatscn:0x0000.002ac5f908/10/200620:58:21 ...................................
我们看到此时备份文件的信息:
检查点是:Checkpointedatscn:0x0000.002ac5f908/10/200620:58:21
检查点计数为:chkptcnt:53ctlcnt:52
这两者不再一致,首先是检查点技术不一致,当前文件的chkptcnt为53,小于控制文件中记录的58,Oracle 可以判断文件是从备份中恢复的,或者文件故障,需要进行介质恢复。
我们看如果此时我们试图打开数据库,则Oracle提示文件需要介质恢复:
SQL>alterdatabaseopen;
alterdatabaseopen
*
ERRORatline1:
ORA-01113:file4needsmediarecovery
ORA-01110:datafile4:'/opt/oracle/oradata/eygle/eygle01.dbf'
执行恢复:
SQL>recoverdatafile4;
Mediarecoverycomplete.
我们看看恢复完成之后,控制文件和数据文件的变化.
首先看控制文件的变化:
DATAFILE#4:
(name#4)/opt/oracle/oradata/eygle/eygle01.dbf
creationsize=0blocksize=8192status=0xehead=4tail=4dup=1
tablespace4,index=4krfil=4prev_file=0
unrecoverablescn:0x0000.0000000001/01/198800:00:00
Checkpointcnt:59scn:0x0000.002ac8ee08/11/200609:48:29
Stopscn:0x0000.002ac8ed08/11/200609:48:29 CreationCheckpointedatscn:0x0000.0015078d06/06/200609:41:54 ......................
检查点计数:Checkpointcnt:59
执行了恢复之后,检查点计数较前增加了1
检查点SCN:scn:0x0000.002ac8ee08/11/200609:48:29
数据文件Stopscn:0x0000.002ac8ed08/11/200609:48:29
数据文件Stopscn和数据文件进行了同步。
数据文件头信息:
FILEHEADER:
Softwarevsn=153092096=0x9200000,CompatibilityVsn=134217728=0x8000000 DbID=1407686520=0x53e79778,DbName='EYGLE'
ActivationID=0=0x0
ControlSeq=983=0x3d7,Filesize=1280=0x500
FileNumber=4,Blksiz=8192,FileType=3DATA
Tablespace#4-EYGLErel_fn:4
Creationatscn:0x0000.0015078d06/06/200609:41:54
Backuptakenatscn:0x0000.0000000001/01/198800:00:00thread:0 resetlogscount:0x232bee1fscn:0x0000.0007c781recoveredat08/11/200610:11:26 status:0x0rootdba:0x00000000chkptcnt:59ctlcnt:58
begin-hot-backupfilesize:0
Checkpointedatscn:0x0000.002ac8ed08/11/200609:48:29 ..........................
我们看到此时数据文件的信息:
检查点是:Checkpointedatscn:0x0000.002ac8ed08/11/200609:48:29
这个检查点和控制文件中记录的stopscn一致,数据库启动可以顺利进行。
检查点计数为:chkptcnt:59ctlcnt:58
我们打开数据库:
SQL%26gt;alterdatabaseopen;
Databasealtered.
SQL%26gt;altersessionsetevents'immediatetracenamefile_hdrslevel10'; Sessionaltered.
此时数据库恢复正常运行。
控制文件信息如下:
DATAFILE#4:
(name#4)/opt/oracle/oradata/eygle/eygle01.dbf
creationsize=0blocksize=8192status=0xehead=4tail=4dup=1
tablespace4,index=4krfil=4prev_file=0
unrecoverablescn:0x0000.0000000001/01/198800:00:00
Checkpointcnt:60scn:0x0000.002ac8ef08/11/200610:19:30
Stopscn:0xffff.ffffffff08/11/200609:48:29 CreationCheckpointedatscn:0x0000.0015078d06/06/200609:41:54
此时stopscn被置为无穷大。
数据文件头信息如下:
FILEHEADER:
Softwarevsn=153092096=0x9200000,CompatibilityVsn=134217728=0x8000000 DbID=1407686520=0x53e79778,DbName='EYGLE'
ActivationID=0=0x0
ControlSeq=984=0x3d8,Filesize=1280=0x500
FileNumber=4,Blksiz=8192,FileType=3DATA
Tablespace#4-EYGLErel_fn:4
Creationatscn:0x0000.0015078d06/06/200609:41:54
Backuptakenatscn:0x0000.0000000001/01/198800:00:00thread:0 resetlogscount:0x232bee1fscn:0x0000.0007c781recoveredat08/11/200610:11:26 status:0x4rootdba:0x00000000chkptcnt:60ctlcnt:59
begin-hot-backupfilesize:0
Checkpointedatscn:0x0000.002ac8ef08/11/200610:19:30。