`
阅读更多

一个礼拜没整理大机笔记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里头的子参数是用空格隔开的,而非逗号,切记!

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics