前些日子遇到一个issue,一个job跑的时候报告无法获取data set information:
Command ===> Scroll ===> CSR
001080 0ADR497E (001)-CATLG(09), A CATALOG ERROR OCCURRED WHILE OBTAINING INFORMATION FOR DATA SET
001081 PFME.W.PE.SK52863.Y0.C724.OSSM.BUECSM.M12. RETURN CODE IS 050, REASON CODE IS E0-006
从3.4 检查的时候能查找到该data set PFME.W.PE.SK52863.Y0.C724.OSSM.BUECSM.M12,但是无法用E/B/V/I等编辑查看。
同时根据3.4中给出的data set所在volume,直接查询volume上的所有文件的时候,没有返回此文件。当时初步怀疑是只有一个catalog的entry而文件实际不存在。
查询了两天相关文档,这里把资料sum一下。
首先先回顾一下MF上面的文件存储。
1. VTOC & DSCB
大机上面DASD的一个卷(volume)和PC上面一个磁盘分区的概念感觉比较类似。
磁盘上存储的数据在PC里面叫文件(file),在mainframe上面叫数据集(data set)。
PC上面访问一个文件/文件夹需要给出包括分区在内的完整路径,比如C:/Documents and Settings/Administrator
而mainframe上面在引入catalog的概念之前,使用data set的时候也是要给出volume的, 比如:
//DIAGDD DD UNIT=3390,VOL=SER=FUSR06,DISP=SHR,
// DSN=SYS1.VVDS.VFUSR06,AMP='AMORG'
在这个时候(引入catalog之前),MF实际上已经建立了一套自己的区别于NTFS和FAT的文件系统。
在FAT文件系统下面,每个分区上面都有一张 File Allocation Table来记录磁盘使用情况和定位文件物理存储位置。
MF在这个时候也在每一个volume上面维护了一个VTOC(volume table of content)。
VTOC由DSCB(Data Set Control Block)组成,每个DSCB的记录长度为140字节,它对应于:
一个数据集,
或者驻留于该卷上的VSAM数据集的定位信息,
或者未分配的磁道。
DSCB的格式(或者说是类型吧)也因此分为6种
FMT0:未使用的DSCB,全字段为0. FMT0的个数记录在FMT4的DS4DSREC字段中
FMT1:最关键的类型,对应于该volume上的一个data set, 关键字为data set name,并记录了data set的一些其他信息
如果该data set扩展超过了三次,则FMT1中有一个指针指向一个FMT3,FMT3中有该data set关于扩展的更多信息
如果该data set是一个ISAM文件,则FMT1中还有一个指针指向一个FMT2,该FMT2中描述了此data set index的信息
FMT2:描述ISAM文件的index信息
FMT3:描述data set的4-16次 extend的信息。
PDSE、顺序扩展格式的数据集以及在ICF 编目中编目的VSAM 数据集可以有123 个extent,
如果是这种情况,则数据集的所有FMT3 连接在一起形成一个链。
其它数据集则在每个卷上至多有16 个extent。
FMT4:可以算是一种特殊的FMT1,描述的data set是vtoc自己。它是VTOC中的第一个DSCB
描述卷所在的设备,卷的属性,当前情况下FMT0 的个数以及VTOC 数据集的大小等内容。
FMT5:描述volume上的可用空间。
对于未索引的VTOC,每个FMT5可记载26个空白块, 所有FMT5形成一个链表
对于indexed的VTOC, Volume 上的free space由index描述,VTOC中只有一个FMT5
下面是一个典型的VTOC的结构:
VTOC的内部结构如下: