love wife love life —Roger的Oracle/MySQL/PostgreSQL数据恢复博客

Phone:18180207355 提供专业Oracle/MySQL/PostgreSQL数据恢复、性能优化、迁移升级、紧急救援等服务

About Controlfile Structure

本站文章除注明转载外,均为本站原创: 转载自love wife love life —Roger的Oracle/MySQL/PostgreSQL数据恢复博客

本文链接地址: About Controlfile Structure

controlfile就类似oracle的大脑,其重要程度就不言而喻了,在数据库恢复中,我们经常遇到关于controlfile的问题。
但是网上似乎没有关于controlfile的详细文章。今天花点时间来大概描述下,由于controlfile中的内容过多,所以对
照起来是相当麻烦的,所以我这里仅仅是列出我认为相对比较重要的内容。

那么controlfile中究竟包含哪些内容? 你可以通过试图去查询或通过dump 去观察,我这里直接查试图,如下:

毫无疑问,前面的几项对我们来讲是最为重要的,下面我通过bbed来dump controlfile(当然你可以直接dd+od).
+++++controlfile header block

这里的7d7c7b7a 是表示magic number。不同平台是不一样的。
这里的controlfile header block,其实有点类似datafile header block,其block号为0. 其他信息不需要关注。
下面来看block 1的内容,类似你dump controlfile看到的STYLE FILE HEADER信息:

offset 从0~361结束。 这部分内容是controlfile header 内容,如下进行详细描述:

offset 25~29,0005200a 表示Compatibility Vsn,即使版本号,转换后即为10.2.0.5.0.
offset 29~32,294d0a93 表示DB id,转换后为2466925865
offset 32~37,524f4745 52 表示db name。我这里是ROGER.
offset 41~42,bc21 表示Control Seq number,由于我这里是x86平台,字节序是反的,所以应该是21bc,转换后是8636.
offset 44~45,c201 表示file size,即使controlfile大小,转换后为450.
offset 49~50,0040 表示blocksize
offset 55 ,01 表示file type,01表示controlfile,关于该值的属性描述如下:

KCCTYPCF 1 /* Control File */
KCCTYPRL 2 /* Redo Log file */
KCCTYPDF 3 /* Vanilla Db File */
KCCTYPBC 4 /* Backup Controlfile */
KCCTYPBP 5 /* Backup Piece */
KCCTYPTF 6 /* Temporary db File */

我们先来看下DATABASE ENTRY信息(对应controlfile dump的database entry信息):

这里针对上面关键性的offset进行描述:
offset 29~32, 2bbafc2f 表示controlfile create timestamp.
offset 17~20, 524f4745 52 这部分内容描述DB NAME
offset 49~52, 01404000 表示database flags.
offset 61~64, d4a75c00 表示Resetlogs scn值.
offset 69~72, 8ebafc2f 表示Resetlogs Timestamp.
offset 73~76, f1a65c00 表示Prior resetlogs scn.
offset 81~84, e8b8fc2f 表示Prior resetlogs Timestamp.
offset 89~92, 0005200a 表示Redo Version compatible,转换后为10.2.0.5.0
offset 93~96, 06000000 表示datafile 数量.
offset 97~100, 06000000 表示datafile online的数量.
offset 101~104,01000000 表示thread number。为1表示只有1个线程,即单实例.
offset 105~108,70b95c00 表示database checkpoint scn.
offset 113~116,01000000 表示处于enable状态的thread编号.
后面还有一些其他内容,不描述,不是重点。 这部分内容里面我们关注的地方也就是resetlogs scn和time以及database checkpoint scn.

下面继续dump,来看下controlfile中另外一个重要的地方:CHECKPOINT PROGRESS RECORDS

这是controlfile的第3个block,这部分信息是CHECKPOINT PROGRESS RECORDS。

offset 21, 01 表示thread status ,1表示线程关闭,2表示线程处于open状态.
offset 33~42,即0xffffffff.ffffffff.ffff 表示low cache rba
offset 43~52,即0000 01000000 392a0000 表示on disk rba转换后为0x1.2a39.0
offset 57~60,即5bb95c00 表示on disk scn 转换后为6076763
offset 73~76,即d4a75c00 表示resetlogs scn 转换后为6072276
offset 81~84,即9092fd2f 表示hearbeat值,ckpt进程每3s会递增该值,这个无实际意义
offset 85~88,即09e69195 表示mount id,转换后为2509366793,这个也无什么实际意义

我这里是单机环境,如果你是rac环境,那么你会看到thread 2的信息。

下面我们接着来看redo thread records:
dd if=/home/ora10g/oradata/roger/control01.ctl bs=16384 count=450 |od -xv > control1.txt

搜索control1.txt,字符串为2a56,定位到redo thread records信息在block 19中,如下:

这里仍然只描述关键的部分内容:

offset 21 ,0e 表示redo thread status。
offset 25~28,70b95c00 表示checkpoint scn。
offset 41~50,共10个offset,01000000 562a0000 1000 表示thread rba,转换后即为0x1.2a56.10
offset 201~204,共计4个offset,d4a75c00 表示thread enable scn.转换后为6072276

最后来看下data file records。
同理,定位到data file record记录在第23个block中,如下:

offset 17, 08 表示name #号,即datafile名编号,通常第一个就是我们的system.
offset 29,0e 表示datafile status。 针对该属性,有如下几种:
KCCFEFDB 0x0001 /* File read-only, plugged from foreign DB */
KCCFEONL 0x0002 /* File is ONLine */
KCCFERDE 0x0004 /* ReaDing is Enabled */
KCCFECGE 0x0008 /* ChanGing is Enabled */
KCCFEMRR 0x0010 /* Media Recovery Required */
KCCFEGEM 0x0020 /* Generate End hot backup Marker at next open */
KCCFECKD 0x0040 /* File record generated by ChecK Dictionary */
KCCFESOR 0x0080 /* Save Offline scn Range at next checkpoint */
KCCFERMF 0x0100 /* Renamed Missing File */
KCCFEGOI 0x0200 /* Generate Off-line Immediate marker */
KCCFECUV 0x0400 /* Checkpoint by instance where UnVerified */
KCCFEDRP 0x0800 /* Offline to be DRoPped */
KCCFEWCC 0x1000 /* Was at Clean Chkpt: clean up to ctrlfile chkpt */
KCCFEODC 0x2000 /* Online at Dictionary Check if read/only tblspc */
KCCFEDBR 0x4000 /* Entry created by DBMS_BACKUP_RESTORE */
KCCFETRO 0x8000 /* Transition Read Only */

offset 193~196,70b95c00 表示checkpoint scn。转换后为6076784
offset 205~206,4086 表示checkpoint count值,即使检查点次数. 转换后为1158.
offset 209~212,70b95c00 表示stop scn. 转换后为6076784。 可见正常停库,stop scn是等于datafile checkpoint scn的。
offset 225~234,00000000 0800 表示Creation Checkpoint scn。
offset 249~252,d3a75c00 表示offline scn. 转换后为6072275.
offset 257~260,d4a75c00 表示offline checkpoint scn. 转换后为6072276
offset 273~282, 01000000 02000000 0000 表示 thread rba. 转换后为0x1.2.0 (这里的offset对应不一定准确)
后面的内容就是我们的file 2,file 3 …..。

controlfile中还存在做其他的内容,非常之多,但是其他内容通常来讲我们需要怎么去关注,而上面的这部分内容
对我们来讲非常重要,特别是针对数据库的恢复。

最后简单总结一下:

上述内容,可能存在错误,如发现,请跟帖指出,我好及时更正,谢谢!

2 Responses to “About Controlfile Structure”

  1. Dong_2 Says:
  2. chales675 Says:

    赞很好的文章

Leave a Reply

You must be logged in to post a comment.