ITPUB论坛-中国最专业的IT技术社区

 找回密码
 注册
查看: 495|回复: 2

[讨论] 关于controlfile中数据文件名的存储规律

[复制链接]
认证徽章
论坛徽章:
0
发表于 2017-2-17 00:26 | 显示全部楼层 |阅读模式
本帖最后由 sysuljx 于 2017-2-17 00:23 编辑

最近需要写一个小工具,就是直接从控制文件中提取数据文件名,包括datafile, logfile, tempfile.
有一位网友也对这方面做了一些研究,链接:Oracle Control File Physical Structure主要用到命令:xxd, 主要查询的视图:v$controlfile_record_section
filename记录的起始block id:
10g: 0x1d
11g(aix): 0x1f
11g(linux): 0x1f
这次主要是研究11g(linux)中控制文件数据文件名的存储规律。以下是研究过程:
首先,关于这个起始的block id,我也不是很确定oracle是否将其固定写死,或许跟其block size有关,暂时没去验证。
$ xxd -a control01.ctl > control01.txt
先将控制文件转为txt,方便搜索。

0x1f数据块

0x1f数据块

图1 0x1f 数据块
对于红框中的数据:0300 0300
因为这次是在小端上进行的研究,故实际数据是:0003 0003
前2字节代表的是文件类型,具体对应关系是:0003(logfile), 0004(datafile), 0007(tempfile)
后2字节,对于logfile,记录的是log group#, 对于datafile和tempfile记录的是file#, 也就是绝对文件编号。
那么一条记录占多少字节呢?这可以从v$controlfile_record_section查询。
filename02.png
图2
从查询的结果可以看出,一条记录占524字节,共有2298条记录,其中用了9条。
经过研究发现,其实每一条记录都有10bytes是用于记录record header信息的,
剩下的514bytes用于记录数据文件名。
filename03.png
图3
查看表v$datafile,可以看到NAME这个字段最大长度为513字节,与前面的研究相符。
到这里了,就得说一下oracle控制文件的一个特点,就是每2个block是“成对”的,一个
记录历史记录或者即将提交的修改记录,另一个记录当前记录。
以图1为例,0x1f block 则与 0x20对应,0x20头部内容如下:
filename04.png
图4
可以看到,内容与图1几乎一模一样,除了块的头部信息不同。
那么怎么区分哪个块是当前记录的呢?这里主要是靠 controlfile sequence number ,
即图4红框部分,datafile的data block记录的是SCN,controlfile这里记录的是seq,
每当该block有变化,seq便增加,图1中seq为7395 0000,小端即00009573,
图4的为7895 0000,即00009578,故记录当前记录的是0x20块。
删除一个datafile,看看相应的记录是怎样变化的。
filename05.png
图5
看以看出这是datafile,file#为0007,filename为:/duni/orcl/oradata/orcl/bigts2.dbf
filename06.png
图6
删除该文件后,记录如图6,发现filename为:duni/orcl/oradata/orcl/bigts2.dbf,
一些标志位也发生了变化。
当再次添加一个文件时,这个位置又被重新利用。
这次研究的控制文件block size 为16384,那一个block最多能有多少条记录呢?
和datafile的data block一样,一个block有20字节的头部和4字节的尾部,
(16384-24)/524 = 31, 余数为116。
看来有116字节剩下,但是oracle也将这些剩下的字节用作记录。
filename07.png
图7
我们可以看到0x21块开始记录文件名的位置与0x20块不一样,
相差了阴影部分的字节,可以算出阴影部分字节数:
0x841ac - 0x84014 = 408
前面算出剩下116字节,408 + 116 = 524,可以看出刚好组成524字节,
这说明filename可能是跨block的,oracle倒是很省。
那么对于0x21块,可以算一下该块的记录:
(16384-24-408)/524=30, 余数为232,说明下一块还有524 - 232 = 292 字节
是上个block的filename记录。剩下也是以此类推。
回看图2,显示有2298条记录可用,那就是说明控制文件一开始就分配了一段
物理块用来记录filename。
经过研究发现,0x1f~0xb1正是已分配的物理块段,0xb3开始记录tablespace信息。
0xb1 - 0x1f + 2 = 148
由于是每2块用来成对记录信息,那么 148 / 2 = 74, 可以算一下74块数据块可以记录
多少filename:74 * (16384 - 24) / 524 = 2310, 余数为200
怎么和2298不一样?那就加2299个数据文件,看看变化。
filename08.png
图8
可以发现总记录数变为5430,并且controlfile增加了200 blocks, 但是实际0xb1还剩下5964bytes是可以
用以记录的,5964 / 524 = 11, 余数为200,  此时 2299 + 11 = 2310,也就是说只有文件数超过2310 filename
记录才会跳到下一段物理块中,只不过超过2298的时候,oracle便增加了这段物理块,并且块数为200,那么
可用记录块数即为100,则 100 * (16384 - 24) / 524 = 3122, 余数72,3122 + 2310 = 5432, 这与5430相近。
继续增加数据文件,看看变化。
filename10.png
开始块为0x345块,但是有8bytes是空的,这与0x1b剩下的200bytes加起来才208bytes,这就很奇怪了。
在另一个数据库添加2310个数据文件后发现,控制文件增加了198块,又与前面的200块不一样,并且
开始块为0x343,不过也有相同点,就是也是有8bytes是空的。

当文件数超过2310时,还没搞懂oracle是怎样存储这些filename的。
刚接触oracle不久,也是第一次发帖,希望各位多多指教,
也希望对这方面有兴趣或有所了解的朋友一起分享讨论。


打赏鼓励一下!
论坛徽章:
46
山治
日期:2017-02-24 09:50:552014年新春福章
日期:2014-02-18 16:41:11一汽
日期:2013-09-01 20:46:27复活蛋
日期:2013-03-13 07:55:232013年新春福章
日期:2013-02-25 14:51:24ITPUB 11周年纪念徽章
日期:2012-10-09 18:03:322012新春纪念徽章
日期:2012-02-13 15:13:202012新春纪念徽章
日期:2012-02-13 15:13:202012新春纪念徽章
日期:2012-02-13 15:13:202012新春纪念徽章
日期:2012-02-13 15:13:20
发表于 2017-2-17 23:53 | 显示全部楼层
Thanks for the great work. It would be nice if you could summarize the findings in a tabular format. Something like

block ID            byte offset                  content explanation
0x1f                 7c014-7c017               ......

That way, if anybody wants to reference it, he can quickly identify the part he wants.

使用道具 举报

回复
认证徽章
论坛徽章:
0
发表于 2017-2-18 09:38 | 显示全部楼层
Yong Huang 发表于 2017-2-17 23:53
Thanks for the great work. It would be nice if you could summarize the findings in a tabular format. ...

多谢你的建议,第一次发帖,没什么经验,以后慢慢改进。ps:这区真的好少人…
来自安卓客户端来自客户端

使用道具 举报

回复

您需要登录后才可以回帖 登录 | 注册

本版积分规则

TOP技术积分榜 社区积分榜 徽章 电子杂志 团队 统计 虎吧 老博客 知识索引树 读书频道 积分竞拍 文本模式 帮助
  ITPUB首页 | ITPUB论坛 | 数据库技术 | 企业信息化 | 开发技术 | 微软技术 | 软件工程与项目管理 | IBM技术园地 | 行业纵向讨论 | IT招聘 | IT文档 | IT博客
  ChinaUnix | ChinaUnix博客 | ChinaUnix论坛 | SAP ERP系统
CopyRight 1999-2011 itpub.net All Right Reserved. 北京皓辰网域网络信息技术有限公司版权所有 联系我们 网站律师 隐私政策 知识产权声明
京ICP证:060528号 北京市公安局海淀分局网监中心备案编号:1101082001 广播电视节目制作经营许可证:编号(京)字第1149号
  
快速回复 返回顶部 返回列表