MVS的存储机制和Catalog error checking

    技术2022-05-20  43

    前些日子遇到一个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

     

     

     

     

     


    最新回复(0)