前些日子遇到一个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的内部结构如下:
由于VTOC 是一个顺序的数据集,当卷上数据集很多时,查找速度非常慢,在MVS 中可建立其索引以提高其访问性能。 SMS 管理的卷一定需要建立VTOC 的索引,非SMS 卷可以不使用VTOC 的索引。但最好使用以提高其性能。
VTOC 的索引是一个与VTOC 在同一个卷上的单独的物理顺序数据集,其名称为: SYS1.VTOCIX.volser, 其中volser 是卷标号。 它包含有数据集名字的索引和卷中自由空间的信息。
ICKDSF 将VTOC 索引初始化为2048 字节的物理块,称为VTOC 索引记录(VIR)。
Command ===> Data Set Name . . . . : SYS1.VTOCIX.FUSR06 General Data Current Allocation Management class . . : Allocated tracks . : 15 Storage class . . . : Allocated extents . : 1 Volume serial . . . : FUSR06 Device type . . . . : 3390 Data class . . . . . : Current Utilization Organization . . . : PS Used tracks . . . . : 15 Record format . . . : F Used extents . . . : 1 Record length . . . : 2048 Block size . . . . : 2048 1st extent tracks . : 15 Secondary tracks . : 0 Data set name type : SMS Compressible . : NO Creation date . . . : 2008/09/27 Referenced date . . : 2011/02/28 Expiration date . . : ***None***
VTOC 含有以下几种VIR: VTOC index entry record(VIER):指示FMT1 和FMT4 DSCB 的位置。 VTOC pack space map(VPSM):指示卷中自由的和已分配的空间。 VTOC index map(VIXM):指示VTOC 索引中已分配的索引记录(VIR)。 VTOC map of DSCB(VMDS):指示VTOC 中已分配的DSCB。 VTOC 索引的第一个记录是VIXM(VTOC index map),用于定位可用的索引记录 。 第二个记录是VPSM(VTOC Pack Space Map),用于定位卷中可用的空间 . 第三个记录是VMDS(VTOC Mapof DSCB),用于定位自由的DSCB 。 其余记录则为索引记录VTOC index entry record(VIER),每一项含有一个数据集名和指向FMT1 的指针。索引按字母顺序存放。
VIEW SYS1.VTOCIX.FUSR06 Columns 00001 00072 Command ===> Scroll ===> CSR ****** ***************************** Top of Data ****************************** 000001 VIXM è }æ { h / 000002 VPSM X z i 000003 VPSM i X z i 000004 VPSM Í X z i ' a 0 {Ü Ø 000005 VPSM ®º X z i - Ø 0 000006 VPSM ² X z i 000007 VPSM Ý X z i 000008 VPSM ¬ X z i 000009 VPSM ç r× X z i äó ò 000010 VPSM ç & Mç X z i ×Â Ø 000011 VPSM & ì J X z i 000012 VPSM ì ñ! n 000013 VMDS - w 000014 VIER Ç Ì 6 < âAC10002.YOGESH.PDS3 000015 VIER ø H 6 < MEME.JCL.CNTL 000016 VIER Ì ^ 6 < AHZANGE.ISPF.ISPPROF 000017 VIER Ø Y 6 < TSOID.ADMCFORM 000018 VIER h ° Ø 6 < MKTC067.REXX.OBJ 000019 VIER ° ½ 6 < SAILU04.SPUFI.OUTPUT 000020 VIER q ø 6 < ANDY620.ISPF.ISPPROF 000021 VIER µ Y 6 < C201823.ISPF.ISPPROF 000022 VIER y } Ø 6 < IBMCNR1.TEST.PS1
所有的索引组成若干个大小为2K 的块,称为VIER(VTOC Index Entry Record)。 每4 个VIER 对应高一级VIER 中的一项,这样形成一个最大3 级的树。
2. ICF Catalog
在上述的存储系统中,访问MVS的data set需要给出具体的卷标,而MVS中管理的DSAD又很多,导致的直接后果就是如果data set存储位置发生改变,则使用该data set的job基本上就崩掉了(因为data set已经不在code所给出的那个volume上)。
而且programer在coding/design的时候,需要确定大量data set存储位置的信息。这样在MVS中又引入了catalog的概念。
(个人感觉MVS上面的catalog有点类似windoes上面的注册表,虽然从功能上说是大相近庭滴,但都是为了程序对数据的访问而维护的一个数据结构。这个通过这个数据结构可以映射到不同盘卷上的文件)
Catalog描述了数据集的属性和数据集的位置,这样用户不需要指出数据集的位置就可以获得某个数据集。 多个user catalog包含了用户数据集的信息,和一个单一的master catalog包含了系统数据集和user catalog的入口。 在OS/390里,控制catalog的组件,也叫做Catalog Manager,嵌在DFSMSdfp中,支持3种类型的catalog,这3种类型可以共存在相同的操作系统中: ―ICF catalogs ―VSAM catalogs ―CVOLs
引入catalog前,
1. 一个MVS系统里面可以存在大量的同名文件,只要他们存储的volume不同即可。
2. 访问data set是要给出volume的
3. data set存储的volume发生变化之后,code需要修改滴,不然abend
引入catalog后,
1. 被catalog的文件是不可以重名的
2. 访问cataloged的data set不用给出volume
3. data set可以随意在不同volume上迁移而不用修改code
为了实现Catalog的管理, MVS为此引入了两个数据结构BCS(Basic catalog structure)和VVDS(VSAM volume data set)
BCS是一个VSAM KSDS数据集,它使用数据集的名字作为关键字。通常可以理解为BCS就是catalog.
(个人感觉随后讨论的master/user catalog,其实就是对BCS按逻辑结构的一个分类)
对于VSAM数据集,BCS含有卷、安全信息、拥有者及其它信息
对于非 VSAM数据集, BCS含有卷,拥有者及其它信息。 对于不由SMS管理的非VSAM数据集,所有它们的catalog信息都只保存在BCS中。
VVDS是一个VSAM ESDS数据集,其名字为:SYSI.VVDS.Vvolser。
和VTOC类似,system中可能有N多VVDS,每个VVDS对应一个卷上的数据维护. VVDS存放在每一个含有VSAM或SMS管理的数据集的卷上。 它含有数据集的特性和扩展(extention)信息。
每个有任何VSAM或者任何SMS管理的数据集的卷必须有一个VVDS
可以(通过IDCAMS)明确的定义VVDS,或者,当你在这个卷上第一次定义VSAM数据集或者由SMS管理的非VSAM数据集时,暗含建立VVDS。
VVDS里面至少包含两条记录 -VVCR(VSAM volume control record) -VVDS self-describing volume record
VVDS的第一条记录必定是VVCR(VSAM Volume Control Record). 其中包含DASD管理的必要信息和当前VVDS中cataloged data set的BCS信息 (亦即不包含cataloged的非SMS manage的Non-VSAM file的BCS信息):
CATALOG RBA 0 Col 25 Format CHAR VOLSER FAN002 Type ESDS DSNAME SYS1.VVDS.VFAN002 RBA Len 25...30....5...40....5...50....5...60....5...70....5...80....5...90....5... 0 4088 CATALOG.SYSFAN.UCAT ............CATALOG.Z16.MASTER
对于VSAM数据集的VVDS记录被称之为VVR(VSAM Volume Record), 对于SMS管理的非VSAM数据集的VVDS记录则被称之为NVR(Non-VSAM Volume Record) VVDS中的第二条记录就是对VVDS的一个自描述的VVR
BCS按逻辑结构分为master catalog 和 user catalog
Master catalog中通常存放user catalog entry,alias 和 system level 的file
User catalog里面通常存放user data set
Master catalog通过 alias 和user catalog 联系起来.
MVS上面的data set name被 "." 分成若干段,第一段一般称为HLQ(High Level Qualifier)。通常会按一个user name或一个project常用冠名的HLQ去建立一个Alias.
DSLIST - Data Sets Matching VIVIAN Row 1 of 63 Command ===> Scroll ===> CSR Command - Enter "/" to select action Message Volume Tracks % XT Device Dsorg Recfm Lrecl Blksz Created Expires Referred Catalog ------------------------------------------------------------------------------- VIVIAN *ALIAS CATALOG.Z16.MASTER ------------------------------------------------------------------------------- VIVIAN.ADCD.ISPCLT1 FUSR12 15 0 1 3390 PS FB 80 8000 2010/03/31 ***None*** ***None*** CATALOG.USERS.UCAT ------------------------------------------------------------------------------- VIVIAN.ADCD.ISPCLT2 FUSR03 15 0 1 3390 PS FB 80 8000 2010/03/31 ***None*** ***None*** CATALOG.USERS.UCAT -------------------------------------------------------------------------------
User/job 需要访问data set的时候(比如VIVIAN.ADCD.ISPCLT1),先从master catalog CATALOG.Z16.MASTER 发现 alias VIVIAN是映射到 user catalog CATALOG.USERS.UCAT 的,然后再从user catalog CATALOG.USERS.UCAT 找到这个data set位于volume FUSR12