一个礼拜没整理大机笔记liao ,感觉再不整理的话就对不起大机。昨天的确是虚脱了,所以高珍的课听得象梦游似的。今天比较认真,早上、下午都在机房混,虽然天气很热,但还是顶下来,偶没睡觉,哈哈,真是个意外,连我自己也吓了一跳。
一、VSAM概述:
VSAM(Virtual Storage Access Method)是一种相当与接口的访问方法,是操作系统与应用程序之间的桥梁,其主要目的是提高数据存取的效率。
VSAM读取记录的过程如下:
1、VSAM负责解释应用程序的逻辑请求并且决定需要使用的设备
2、VSAM负责向操作系统申请输入和输出的操作。
3、操作系统执行实际的物理输入和输出操作。
4、VSAM将数据返回给应用程序处理。
二、VSAM数据集类型和结构
[术语]
1、控制段(Control Interval、CI)
---CI是VSAM数据集(除了Liner Data Set)输入输出的单位。
结构如右:R1 | R2 | FREE SPACE | RDF2 | RDF1 | CIDF
---其中,R1、R2表示数据,RDF2、RDF1描述CI中的记录信息(长度和起始位置),每个RDF长度为3个字节。CIDF描述FREE SPACE的大小(2字节)和位置(2字节),长度4字节。
---需要注意的地方,Record从左往右连续填写,RDF紧挨着CIDF从右往左连续填写。FREE SPACE 在中间,刚好两肋插刀。
---如果一个CI中存放的所有记录的长度都相等的话,则整个CI只有两个RDF,一个说明记录长度,另一个说明记录个数。
---CI大小范围[512Byte,32K]
2、控制区(Control Area、CA)
---VSAM数据集创建时所需要的磁盘空间大小是以CA为单位进行分配的。
---由几个连续的CI组成。同一个VSAM里头每个CA都有相同的CI个数。CA的大小可以在定义VSAM数据集的是时候指定。
---CA大小范围 [一个磁道,一个柱面]
3、相对字节位置(Relative Byte Address、RBA)
---RBA是指VSAM数据集中记录的相对位置,从数据集的起始位置开始计算,VSAM将数据看成连续的字节流。
RBA:02040
R1|R2|R3
4、Spanned Record
---长度超过一个CI大小的记录
---大小范围(CI,CA-VSAM控制信息]
5、数据集(Cluster)
---一个逻辑上的概念,由若干个物理数据集组成。
---一般来说,Cluster和Data set之间没什么区别,除了KSDS Cluster。KSDS Cluster 包括KSDS.DATA 和KSDS.INDEX两部分。
[数据集类型]
1、ESDS(Entry-Sequenced Data Set)进入顺序数据集
---ESDS仅由数据部分组成,本质上来说,它是个SDS。
---查找记录可以用顺序查找或者是RBA查找;增加记录只能从后面加;更新记录的话,新记录的长度必须和旧记录的相同;删除记录操作只能从逻辑上删除,无法从磁盘中真正删除。
2、KSDS(Key-Sequenced Data Set)索引顺序数据集
---KSDS包括两部分:Data Component、Index Component
---每个逻辑记录都有一个索引,记录按照索引的升序排列。
---索引必须是连续且唯一的。
---CA中的CI之间可能不是按序排列的,CI内的记录则一定是按序排列。
---索引是树状结构的。IS(Index Set)包含较高层的索引信息,SS(Sequence Set)包含最低层的索引信息。
---SS的大小为一个CI,对应一个数据CA,SS包含下一个SS的水平指针和对应的每个CI的最大索引值以及相应CI的指针(CI的RBA)
---SS的指针超过一个CI大小时,系统会建立多级的IS,但是顶层只能有一个IS。
---KSDS的访问方法:
直接存取
(1)查询顶层IS的索引,以决定要要找的记录位于下一层的哪个IS;
(2)循环寻找,直至SS层。
(3)根据SS的记录,对索引所在的CI进行定位。
(4)将该CI从DASD读入到存储器中,取得所要的记录传送到程序中。(以CI为单位进行IO,切记)
顺序存取
(1)定位到第一个CI
(2)从第一个记录开始,顺序读取每个记录,直至完成所有的记录读取操作。
定位顺序存取
(1)按照直接存取的方式定位到需要读取的指针
(2)按照顺序存取方式从指定的记录开始顺序处理,直至完成所有操作。
---KSDS的插入操作:
(1)若目标CI有足够空间的话,则在目标位置插入新记录,并建立相应的RDF,更新SS。
(2)如果目标CI没有足够空间,但CA内还有空的CI,则VSAM产生CI Split操作,将原CI的后半部分(N/2的上限)以及它们所对应的RDF移到空的CI内。新记录增加在原CI的相应位置,并增加RDF,更新SS。
(3)如果目标CI没有足够空间,同时CA内没有空的CI,则VSAM产生CA Split操作。 方法类同CI Split 操作,不过要注意的是SS也会split,并且产生IS。
3、RRDS(Relative Record Data Set)相对记录数据集
---仅由Data Component组成
---每个CI都分成固定大小的片(slot)并且具有相同数目的slot,每个slot都有一个相对记录编号(RRN)。
---每个slot都有一个RDF与之对应,RDF表示该slot是否为空。
4、LDS(Linear Data Set)线性数据集合
---只有Data Component组成,每个CI中都只有数据而没有控制信息。
三、VSAM的编目
1、对数据集的编目实际是对数据集的入口建立列表和索引。
2、在z/OS系统中,主编目只有一个,它描述系统的数据集和用户编目,而用户编目则描述用户的数据集。
3、用户编目的建立是选择性的,主要目的是缩短编目的寻找时间。
4、z/OS系统中,编目结构只有两级。
四、IDCAMS(集成编目访问方法服务实用程序)
[格式]
//SYSIN DD *
DEFINE CLUSTER -/*续行标记 为“-”,切记
(NAME(ST018.EXAMPLE.KSDS1) - /* 子参数间不是用逗号隔开 ,而是空格,切记切记!
INDEXED -
VOLUNES(USER02) -
FREESPACE(20 10) -
RECORDSIZE(100 100) )
[AMS命令的应用]
1、DEFINE MASTERCATALOG
建立主编目:
DEFINE MASTERCATALOG
(parameters) -
[DATA(parameters)] -
[INDEX(parameters)] -
[CATALOG (parameters)] -
2、DEFINE USERCATALOG
建立用户编目:
DEFINE USERCATALOG
(parameters) -
[DATA(parameters)] -
[INDEX(parameters)] -
[CATALOG (parameters)] -
3、DEFINE CLUSTER (建立并定义VSAM数据集)
DEFINE CLUSTER
(NAME(entryname) -
{CYCINDERS (primary [secondary])| -
RECORDS (primary [secondary])} -
[FREESPACE (cipercent [capercent])] -
[INDEXED | NONINDEXED | NUMBERED | LINEAR] -
[KEYS(LENGTH OFFSET)] -
[RECORDSIZE(average maximum)] -
[RECOVERY | SPEED] -
[SHAROPTIONS(crosspartition [cross system])] -
[VOLUMES(volser [volser...])])
[DATA
([NAME(entryname)])]
[INDEX
([NAME(entryname)])]
[CATALOG(mastercatname [/password])]
*******说明:
(1)NAME:指明VSAM数据集的名字,命名规则和其它数据集相同。
(2)CYLINDERS:以柱面为单位分配空间,仅限于磁盘数据集。Primary指第一次进行分配的数量,secondary指追加的分配数量。
(3)RECORD:以记录为单位进行数据集的分配。
(4)FREESPACE:给KSDS或者VRRDS中的每个CI和CA分别预留多少百分比的空间。默认为0;
(5)INDEXED:数据集类型为KSDS
(6)NONINDEXED:数据集类型为ESDS
(7)NUMBERED:数据集类型为RRDS,如果记录平均长度和最大长度不一样,则为VRRDS。
(8)LINEAR:数据集类型为LDS
(9)KEYS:说明数据集中索引的长度和起始位置。注意,偏移良是从零开始的。
(10)RECORDSIZE:分别指定记录的平均长度和最大长度。如果两值相等,则代表数据集的记录是定长格式
(11)VOLUME: 卷标号
(12)DATA:代表KSDS数据集的数据部分
(13)INDEX:代表KSDS数据集的索引部分
4、REPRO
将记录存入数据集中、复制VSAM数据集、复制编目、分开编目或者合并编目。
REPRO{INDATASET(data set name)|
INFILE(DDname)}
{OUTDATASET(data set name)
OUTFILE(DDname)}
[NOREPLACE | REPLACE]
[NOREUSE | REUSE]
5、LISTCAT
显示编目的一部分或者全部信息
LISTCAT[CLUSTER | USERCATALOG]
[CATALOG (catname)]#说明要显示的数据集的编目信息
[ENTRIES(entryname)]#说明编目中的哪一个数据集信息需要显示
[NAME | ALL]# 把编目中指定的名称显示出来,ALL是显示所有的信息
********************一个例子*********************************
000100 //ST018A JOB ACCT#,'TRAINER',CLASS=A,NOTIFY=&SYSUID,
000200 //MSGCLASS=X,MSGLEVEL=(1,1)
000300 //STEP1EXEC PGM=IDCAMS
000400 //SYSPRINT DD SYSOUT=*
000500 //SYSINDD *
000600DELETE 'ST018.VSAM.KSDS1'
000700SET MAXCC = 0
000800DEFINE CLUSTER -
000900(NAME(ST018.VSAM.KSDS1) -
001000INDEXED -
001100VOLUME(USER02) -
001200RECORDS(4000,100) -
001300RECORDSIZE(80 80) -
001400CONTROLINTERVALSIZE(4096) -
001500KEYS(5,4))
001600IF LASTCC=0 THEN -
001700DO
001800REPRO INDATASET(ST018.SDS.DATA) -
001900OUTDATASET(ST018.VSAM.KSDS1)
002000IF LASTCC=0 THEN -
002100DO
002200LISTCAT ENT(ST018.VSAM.KSDS1) ALL
002300PRINTINDATASET(ST018.VSAM.KSDS1) DUMP -
002400FROMKEY(00100) TOKEY(00300)
002500IF LASTCC=0 THEN -
002600DO
002700LISTCAT ENT(ST018.VSAM.KSDS1) ALL
002800DELETE 'ST018.VSAM.KSDS1'
002900DEFINE CLUSTER -
003000(NAME(ST018.VSAM.KSDS1) -
003100INDEXED -
003200VOLUME(USER02) -
003300RECORDS(3000 100) -
003400RECSZ(80 80) -
003500KEYS(5 4) -
003600CONTROLINTERVALSIZE(4096) -
003700FREESPACE(10) -
003800BUFFERSPACE(50000))
003900LISTCAT ENT(ST018.VSAM.KSDS1) ALL
004000END
004100END
004200ELSE -
004300LISTCAT ENT(ST018.VSAM.KSDS1) ALL
004400END
004500 //
小结:
这篇文章,有点恶心,总感觉又在做帮助文档了。。。没想法。
要注意的几个地方:
1、KSDS里的KEY 不能重复,切记切记。
2、VSAM数据集可以JCL语句或3.2界面进行创建。
3、对VSAM数据集的操作必须使用M.7(DITTO)或者JCL直接调用
4、AMS里头的子参数是用空格隔开的,而非逗号,切记!