- Learn VSAM Tutorial
- VSAM - Home
- VSAM - Overview
- VSAM - Components
- VSAM - Cluster
- VSAM - ESDS
- VSAM - KSDS
- VSAM - RRDS
- VSAM - LDS
- VSAM - Commands
- VSAM - Alternate Index
- VSAM - Catalog
- VSAM - File Status
- VSAM - Interview Questions
- VSAM Useful Resources
- VSAM - Quick Guide
- VSAM - Useful Resources
- VSAM - Discussion
VSAM - 快速指南
VSAM - 概述
虚拟存储访问方法(VSAM)是一种高性能的访问方法和数据集组织,它通过目录结构来组织和维护数据。它利用虚拟存储概念,可以通过提供密码来保护各个级别的数据集。VSAM 可以像物理顺序文件一样用于 COBOL 程序中。VSAM是用于存储记录的逻辑数据集。VSAM 中的文件可以顺序读取和随机读取。它是一种改进的数据存储方式,克服了顺序文件等传统文件系统的一些限制。
VSAM的特点
以下是 VSAM 的特点 -
VSAM 使用密码保护数据免遭未经授权的访问。
VSAM 提供对数据集的快速访问。
VSAM 具有优化性能的选项。
VSAM 允许在批处理和在线环境中共享数据集。
VSAM 在存储数据方面更加结构化和组织化。
VSAM 文件中的可用空间会自动重用。
VSAM 的局限性
VSAM 的唯一限制是它不能存储在 TAPE 卷上。它始终存储在 DASD 空间上。需要多个柱面来存储数据,成本效益不高。
VSAM - 组件
VSAM 由以下组件组成 -
- VSAM集群
- 控制区
- 控制间隔
VSAM集群
VSAM 是用于存储记录的逻辑数据集,称为簇。簇是数据集的索引、序列集和数据部分的关联。VSAM 簇占用的空间被划分为称为控制间隔的连续区域。我们将在本模块稍后讨论控制间隔。
VSAM 集群中有两个主要组件 -
索引组件包含索引部分。索引记录存在于索引组件中。使用索引组件 VSAM 能够从数据组件检索记录。
数据组件包含数据部分。实际数据记录存在于数据组件中。
控制间隔
VSAM 中的控制间隔 (CI) 相当于非 VSAM 数据集的块。在非VSAM方法中,数据单元由块定义。VSAM 使用称为控制间隔的逻辑数据区域。
控制间隔是磁盘和操作系统之间传输的最小单位。每当直接从存储中检索记录时,包含该记录的整个 CI 都会被读入 VSAM 输入输出缓冲区。然后所需的记录从 VSAM 缓冲区传输到工作区。
控制间隔包括 -
- 逻辑记录
- 控制信息字段
- 可用空间
加载 VSAM 数据集时,将创建控制区间。默认控制间隔大小为 4K 字节,最多可扩展至 32K 字节。
控制区间分析
以下是上述程序中使用的术语的描述 -
R1..R5 - 存储在控制间隔中的记录。
FS - FS 是可用空间,可用于进一步扩展数据集。
RDF - RDF 称为记录定义字段。RDF 的长度为 3 个字节。它描述了记录的长度并告诉有多少相邻记录具有相同的长度。
CIDF - CIDF 被称为控制间隔定义字段。CIDF 长 4 个字节,包含有关控制间隔的信息。
控制区
控制区域(CA)是通过将两个或多个控制间隔放在一起形成的。VSAM数据集由一个或多个控制区域组成。VSAM 的大小始终是其控制区域的倍数。VSAM 文件以控制区域为单位进行扩展。
以下是控制区域的示例 -
VSAM - 集群
VSAM集群在JCL中定义。JCL 使用IDCAMS实用程序创建集群。IDCAMS 是 IBM 开发的一个用于访问方法服务的实用程序。它主要用于定义VSAM数据集。
定义集群
以下语法显示了分组在Define Cluster、Data和Index下的主要参数。
.DEFINE CLUSTER (NAME(vsam-file-name) - BLOCKS(number) - VOLUMES(volume-serial) - [INDEXED / NONINDEXED / NUMBERED / LINEAR] - RECSZ(average maximum) - [FREESPACE(CI-Percentage,CA-Percentage)] - CISZ(number) - [KEYS(length offset)] - [READPW(password)] - [FOR(days)|TO(date)] - [UPDATEPW(password)] - [REUSE / NOREUSE] ) - DATA - (NAME(vsam-file-name.data)) - INDEX - (NAME(vsam-file-name.index)) - CATALOG(catalog-name[/password]))
CLUSTER 级别的参数适用于整个集群。DATA 或 INDEX 级别的参数仅适用于数据或索引组件。
我们将在下表中详细讨论每个参数 -
先生编号 | 参数及说明 |
---|---|
1 | 定义集群 Define Cluster命令用于定义集群并指定集群及其组件的参数属性。 |
2 | 姓名 NAME 指定我们为其定义集群的 VSAM 文件的名称。 |
3 | 积木 Blocks 指定分配给集群的块数。 |
4 | 成交量 卷指定将包含集群或组件的一个或多个卷。 |
5 | 索引/非索引/编号/线性 该参数可以采用三个值:INDEXED、NONINDEXED 或 NUMBERED,具体取决于我们创建的数据集的类型。对于键序 (KSDS) 文件,使用 INDEXED 选项。对于条目排序 (ESDS) 文件,使用 NONINDEXED 选项。对于相对记录 (RRDS) 文件,需要 NUMBERED 选项。对于线性 (LDS) 文件,需要 LINEAR 选项。该参数的默认值为 INDEXED。我们将在接下来的模块中详细讨论 KSDS、ESDS、RRDS 和 LDS。 |
6 | 雷克萨斯 记录大小参数有两个值:平均和最大记录大小。平均值指定文件中逻辑记录的平均长度,最大值表示记录的长度。 |
7 | 可用空间 可用空间指定为数据组件的控制间隔 (CI) 和控制区域 (CA) 保留的可用空间的百分比。该参数的默认值是零百分比。 |
8 | CISZ CISZ 称为控制间隔大小。它指定控制间隔的大小。 |
9 | 按键 Keys 参数仅在密钥序列 (KSDS) 文件中定义。它指定主键距第一列的长度和偏移量。该参数的取值范围为1~255字节。 |
10 | 读PW READPW参数中的值指定读取级别的密码。 |
11 | 为/至 此参数的值指定保留文件的时间量(以日期和天数表示)。此参数的默认值是零天。 |
12 | 更新PW UPDATEPW 参数中的值指定更新级别的密码。 |
13 | 重复使用/不重复使用 REUSE 参数允许定义可以重置为空状态的集群,而无需删除和重新定义它们。 |
14 | 数据-名称 簇的 DATA 部分包含数据集名称,其中包含文件的实际数据。 |
15 | 索引名称 簇的 INDEX 部分包含主键和数据部分中相应记录的内存指针。它是在使用 Key Sequenced 簇时定义的。 |
16 | 目录 Catalog 参数表示将在其下定义文件的目录。我们将在接下来的模块中单独讨论目录。 |
例子
以下是一个基本示例,展示如何在 JCL 中定义集群 -
//SAMPLE JOB(TESTJCL,XXXXXX),CLASS = A,MSGCLASS = C //STEP1 EXEC PGM = IDCAMS //SYSPRINT DD SYSOUT = * //SYSIN DD * DEFINE CLUSTER (NAME(MY.VSAM.KSDSFILE) - INDEXED - RECSZ(80 80) - TRACKS(1,1) - KEYS(5 0) - CISZ(4096) - FREESPACE(3 3) ) - DATA (NAME(MY.VSAM.KSDSFILE.DATA)) - INDEX (NAME(MY.VSAM.KSDSFILE.INDEX)) /*
如果您将在大型机服务器上执行上述 JCL。它应该以 MAXCC = 0 执行,并将创建 MY.VSAM.KSDSFILE VSAM 文件。
删除集群
要删除 VSAM 文件,需要使用 IDCAMS 实用程序删除 VSAM 集群。DELETE 命令从目录中删除 VSAM 簇的条目,并可选择删除文件,从而释放对象占用的空间。如果 VSAM 数据集未过期,则不会被删除。要删除此类类型的数据集,请使用 PURGE 选项。
DELETE data-set-name CLUSTER [ERASE / NOERASE] [FORCE / NOFORCE] [PURGE / NOPURGE] [SCRATCH / NOSCRATCH]
上面的语法显示了我们可以与删除语句一起使用的参数。我们将在下表中详细讨论它们 -
先生编号 | 参数及说明 |
---|---|
1 |
擦除/不擦除 指定 ERASE 选项可覆盖为目录中的对象指定的 ERASE 属性。默认情况下采用 NOERASE 选项。 |
2 |
力/无力 指定 FORCE 选项可删除 SPACE 和 USERCATALOG,即使它们不为空。默认情况下采用 NOFORCE 选项。 |
3 |
净化/不净化 如果数据集尚未过期,PURGE 选项用于删除 VSAM 数据集。默认情况下采用 NOPURGE 选项。 |
4 |
划痕/无划痕 指定 SCRATCH 选项是为了从卷目录中删除对象的关联条目。它主要用于非 vsam 数据集,例如 GDG。默认情况下采用 NOSCRATCH 选项。 |
例子
以下是一个基本示例,展示如何在 JCL 中删除集群 -
//SAMPLE JOB(TESTJCL,XXXXXX),CLASS = A,MSGCLASS = C //STEPNAME EXEC PGM = IDCAMS //SYSPRINT DD SYSOUT = * //SYSIN DD * DELETE MY.VSAM.KSDSFILE CLUSTER PURGE /*
如果您将在大型机服务器上执行上述 JCL。它应该以 MAXCC = 0 执行,并将删除 MY.VSAM.KSDSFILE VSAM 文件。
VSAM-静电放电分析仪
ESDS 被称为条目排序数据集。条目排序数据集的Behave类似于顺序文件组织,但包含更多功能。我们可以直接访问记录,出于安全目的,我们也可以使用密码。我们必须在 ESDS 数据集的 DEFINE CLUSTER 命令内编写NONINDEXED代码。以下是 ESDS 的主要特点 -
ESDS 簇中的记录按照插入数据集的顺序存储。
记录通过物理地址引用,称为相对字节地址(RBA)。假设在 ESDS 数据集中,我们有 80 字节记录,第一个记录的 RBA 将为 0,第二个记录的 RBA 将为 80,第三个记录的 RBA 将为 160,依此类推。
记录可以通过 RBA 顺序访问,这称为寻址访问。
记录按照插入的顺序保存。新记录将插入到末尾。
ESDS 数据集中的记录无法删除。但它们可以被标记为不活动。
ESDS 数据集中的记录可以是固定长度或可变长度。
ESDS 是非索引的。ESDS 数据集中不存在键,因此它可能包含重复记录。
ESDS 可以像任何其他文件一样在 COBOL 程序中使用。我们将在JCL中指定文件名,我们可以使用ESDS文件在程序内部进行处理。在 COBOL 程序中,将文件组织指定为顺序,访问模式指定为带有 ESDS 数据集的顺序。
定义 ESDS 集群
以下语法显示了我们在创建 ESDS 集群时可以使用哪些参数。参数描述与 VSAM - Cluster 模块中提到的相同。
DEFINE CLUSTER (NAME(esds-file-name) - BLOCKS(number) - VOLUMES(volume-serial) - NONINDEXED - RECSZ(average maximum) - [FREESPACE(CI-Percentage,CA-Percentage)] - CISZ(number) - [READPW(password)] - [FOR(days)|TO(date)] - [UPDATEPW(password)] - [REUSE / NOREUSE]) - DATA - (NAME(esds-file-name.data))
例子
以下示例展示了如何使用 IDCAMS 实用程序在 JCL 中创建 ESDS 集群 -
//SAMPLE JOB(TESTJCL,XXXXXX),CLASS = A,MSGCLASS = C //STEP1 EXEC PGM = IDCAMS //SYSPRINT DD SYSOUT = * //SYSIN DD * DEFINE CLUSTER (NAME(MY.VSAM.ESDSFILE) - NONINDEXED - RECSZ(80 80) - TRACKS(1,1) - CISZ(4096) - FREESPACE(3 3) ) - DATA (NAME(MY.VSAM.ESDSFILE.DATA)) /*
如果您将在大型机服务器上执行上述 JCL。它应该以 MAXCC = 0 执行,并将创建 MY.VSAM.ESDSFILE VSAM 文件。
删除 ESDS 集群
使用 IDCAMS 实用程序删除 ESDS 集群。DELETE 命令从目录中删除 VSAM 簇的条目,并可选择删除文件,从而释放对象占用的空间。
DELETE data-set-name CLUSTER [ERASE / NOERASE] [FORCE / NOFORCE] [PURGE / NOPURGE] [SCRATCH / NOSCRATCH]
上面的语法显示了我们在删除 ESDS 集群时可以使用哪些参数。参数描述与 VSAM - Cluster 模块中提到的相同。
例子
以下示例显示如何使用 IDCAMS 实用程序删除 JCL 中的 ESDS 集群 -
//SAMPLE JOB(TESTJCL,XXXXXX),CLASS = A,MSGCLASS = C //STEPNAME EXEC PGM = IDCAMS //SYSPRINT DD SYSOUT = * //SYSIN DD * DELETE MY.VSAM.ESDSFILE CLUSTER /*
如果您将在大型机服务器上执行上述 JCL。它应该以 MAXCC = 0 执行,并将删除 MY.VSAM.ESDSFILE VSAM 集群。
VSAM-KSDS
KSDS 被称为密钥排序数据集。键序列数据集 (KSDS) 比 ESDS 和 RRDS 更复杂,但更有用且通用。我们必须在 KSDS 数据集的 DEFINE CLUSTER 命令内编写INDEXED代码。KSDS 集群由以下两个组件组成 -
索引- KSDS 集群的索引组件包含集群中记录的键值列表以及指向数据组件中相应记录的指针。索引组件是指 KSDS 记录的物理地址。这将每个记录的键与该记录在数据集中的相对位置相关联。当添加或删除记录时,该索引也会相应更新。
数据- KSDS 集群的数据组件包含实际数据。KSDS 簇的数据组件中的每个记录都包含一个具有相同字符数的关键字段,并且出现在每个记录中相同的相对位置。
以下是 KSDS 的主要特点 -
KSDS 数据集中的记录始终按关键字段排序。记录按升序存储,并按键整理顺序。
记录可以顺序访问,也可以直接访问。
使用密钥来识别记录。每条记录的键是记录内预定义位置的字段。每个密钥在 KSDS 数据集中必须是唯一的。因此记录重复是不可能的。
当插入新记录时,记录的逻辑顺序取决于关键字段的整理顺序。
KSDS 数据集中的记录可以是固定长度或可变长度。
KSDS 可以像任何其他文件一样在COBOL程序中使用。我们将在JCL中指定文件名,我们可以使用KSDS文件在程序内部进行处理。在 COBOL 程序中,将文件组织指定为索引,您可以对 KSDS 数据集使用任何访问模式(顺序、随机或动态) 。
KSDS 文件结构
为了搜索特定记录,我们给出一个唯一的键值。在索引组件中搜索键值。一旦找到密钥,就会检索引用数据组件的相应内存地址。从内存地址我们可以获取存储在数据组件中的实际数据。以下示例显示了索引和数据文件的基本结构 -
定义 KSDS 集群
以下语法显示了我们在创建 KSDS 集群时可以使用哪些参数。
参数描述与 VSAM - Cluster 模块中提到的相同。
DEFINE CLUSTER (NAME(ksds-file-name) - BLOCKS(number) - VOLUMES(volume-serial) - INDEXED - KEYS(length offset) - RECSZ(average maximum) - [FREESPACE(CI-Percentage,CA-Percentage)] - CISZ(number) - [READPW(password)] - [FOR(days)|TO(date)] - [UPDATEPW(password)] - [REUSE / NOREUSE]) - DATA - (NAME(ksds-file-name.data)) - INDEX - (NAME(ksds-file-name.index))
例子
以下示例展示了如何使用 IDCAMS 实用程序在 JCL 中创建 KSDS 集群 -
//SAMPLE JOB(TESTJCL,XXXXXX),CLASS = A,MSGCLASS = C //STEP1 EXEC PGM = IDCAMS //SYSPRINT DD SYSOUT = * //SYSIN DD * DEFINE CLUSTER (NAME(MY.VSAM.KSDSFILE) - INDEXED - KEYS(6 1) - RECSZ(80 80) - TRACKS(1,1) - CISZ(4096) - FREESPACE(3 3) ) - DATA (NAME(MY.VSAM.KSDSFILE.DATA)) - INDEX (NAME(MY.VSAM.KSDSFILE.INDEX)) - /*
如果您将在大型机服务器上执行上述 JCL。它应该以 MAXCC = 0 执行,并将创建 MY.VSAM.KSDSFILE VSAM 文件。
删除 KSDS 集群
使用 IDCAMS 实用程序删除 KSDS 集群。DELETE 命令从目录中删除 VSAM 簇的条目,并可选择删除文件,从而释放对象占用的空间。
DELETE data-set-name CLUSTER [ERASE / NOERASE] [FORCE / NOFORCE] [PURGE / NOPURGE] [SCRATCH / NOSCRATCH]
上面的语法显示了我们在删除 KSDS 集群时可以使用哪些参数。参数描述与 VSAM - Cluster 模块中提到的相同。
例子
以下示例展示了如何使用 IDCAMS 实用程序删除 JCL 中的 KSDS 集群 -
//SAMPLE JOB(TESTJCL,XXXXXX),CLASS = A,MSGCLASS = C //STEPNAME EXEC PGM = IDCAMS //SYSPRINT DD SYSOUT = * //SYSIN DD * DELETE MY.VSAM.KSDSFILE CLUSTER /*
如果您将在大型机服务器上执行上述 JCL。它应该以 MAXCC = 0 执行,并将删除 MY.VSAM.KSDSFILE VSAM 集群。
VSAM-RRDS
RRDS 被称为相对记录数据集。RRDS 集群类似于 ESDS 集群。唯一的区别是 RRDS 记录是通过相对记录号 (RRN)访问的,我们必须在 DEFINE CLUSTER 命令中编码NUMBERED 。以下是 RRDS 的主要特点 -
相对记录数据集具有由相对记录号 (RRN)标识的记录,RRN 是相对于第一条记录的序列号。
RRDS 允许按编号访问记录,如记录 1、记录 2 等。这提供了随机访问,并假设应用程序有办法获取所需的记录号。
RRDS 数据集中的记录可以按相对记录编号顺序顺序访问,也可以通过提供所需记录的相对记录编号来直接访问。
RRDS 数据集中的记录存储在固定长度的槽中。每条记录都由其槽号引用,槽号可以从 1 到数据集中的最大记录数不等。
可以通过将新记录插入到空槽中来写入 RRDS 中的记录。
可以从 RRDS 集群中删除记录,从而留下一个空槽。
使用固定长度记录或具有上下文含义的记录号的应用程序可以使用 RRDS 数据集。
RRDS 可以像任何其他文件一样在COBOL程序中使用。我们将在JCL中指定文件名,我们可以使用KSDS文件在程序内部进行处理。在 COBOL 程序中,将文件组织指定为RELATIVE ,您可以对 RRDS 数据集使用任何访问模式(顺序、随机或动态) 。
RRDS 文件结构
RRDS 文件结构中的空间被划分为固定长度的槽。插槽可以完全空闲或完全满。因此,可以将新记录添加到空槽中,并且可以从已填充的槽中删除现有记录。我们可以通过给出相对记录号直接访问任何记录。以下示例显示了数据文件的基本结构 -
数据组件
相对记录数 | 记录字段1 | 记录字段2 |
---|---|---|
1 | 教程 | 观点 |
2 | 莫赫塔希姆 | M。 |
3 | 尼尚特 | 马利克 |
定义 RRDS 集群
以下语法显示了我们在创建 RRDS 集群时可以使用哪些参数。
参数描述与 VSAM - Cluster 模块中提到的相同。
DEFINE CLUSTER (NAME(rrds-file-name) - BLOCKS(number) - VOLUMES(volume-serial) - NUMBERED - RECSZ(average maximum) - [FREESPACE(CI-Percentage,CA-Percentage)] - CISZ(number) - [READPW(password)] - [FOR(days)|TO(date)] - [UPDATEPW(password)] - [REUSE / NOREUSE]) - DATA - (NAME(rrds-file-name.data))
例子
以下示例展示了如何使用 IDCAMS 实用程序在 JCL 中创建 RRDS 集群 -
//SAMPLE JOB(TESTJCL,XXXXXX),CLASS = A,MSGCLASS = C //STEP1 EXEC PGM = IDCAMS //SYSPRINT DD SYSOUT = * //SYSIN DD * DEFINE CLUSTER (NAME(MY.VSAM.RRDSFILE) - NUMBERED - RECSZ(80 80) - TRACKS(1,1) - REUSE - FREESPACE(3 3) ) - DATA (NAME(MY.VSAM.RRDSFILE.DATA)) /*
如果您将在大型机服务器上执行上述 JCL。它应该以 MAXCC = 0 执行,并将创建 MY.VSAM.RRDSFILE VSAM 文件。
删除 RRDS 集群
使用 IDCAMS 实用程序删除 RRDS 集群。DELETE 命令从目录中删除 VSAM 簇的条目,并可选择删除文件,从而释放对象占用的空间。
DELETE data-set-name CLUSTER [ERASE / NOERASE] [FORCE / NOFORCE] [PURGE / NOPURGE] [SCRATCH / NOSCRATCH]
上面的语法显示了我们在删除 RRDS 集群时可以使用哪些参数。参数描述与 VSAM - Cluster 模块中提到的相同。
例子
以下示例显示如何使用 IDCAMS 实用程序删除 JCL 中的 RRDS 集群 -
//SAMPLE JOB(TESTJCL,XXXXXX),CLASS = A,MSGCLASS = C //STEPNAME EXEC PGM = IDCAMS //SYSPRINT DD SYSOUT = * //SYSIN DD * DELETE MY.VSAM.RRDSFILE CLUSTER /*
如果您将在大型机服务器上执行上述 JCL。它应该以 MAXCC = 0 执行,并将删除 MY.VSAM.RRDSFILE VSAM 集群。
VSAM-LDS
LDS 被称为线性数据集。线性数据集是传统操作系统文件中使用的唯一形式的字节流数据集。线性数据集很少使用。以下是 LDS 的主要特点 -
线性数据集不包含 RDF 和 CIDF,因为它的 CI 中没有嵌入任何控制信息。
可以在线性数据集中的虚拟存储中作为字节可寻址字符串访问的数据。
线性数据集的控制间隔大小为 4KB。
LDS 是一种非 vsam 文件,具有一些 VSAM 设施,例如使用 IDCAMS 和目录中的 VSAM 特定信息。
DB2 目前是线性数据集的最大用户。
IDCAMS 用于定义 LDS,但使用虚拟数据 (DIV) 宏来访问它。
线性数据集没有记录的概念。所有 LDS 字节都是数据字节。
定义LDS集群
以下语法显示了我们在创建 LDS 集群时可以使用哪些参数。参数描述与 VSAM - Cluster 模块中提到的相同。
DEFINE CLUSTER (NAME(lds-file-name) - BLOCKS(number) - VOLUMES(volume-serial) - LINEAR - CISZ(number) - [READPW(password)] - [FOR(days)|TO(date)] - [UPDATEPW(password)] - [REUSE / NOREUSE]) - DATA - (NAME(lds-file-name.data))
例子
以下示例展示了如何使用 IDCAMS 实用程序在 JCL 中创建 LDS 集群 -
//SAMPLE JOB(TESTJCL,XXXXXX),CLASS = A,MSGCLASS = C //STEP1 EXEC PGM = IDCAMS //SYSPRINT DD SYSOUT = * //SYSIN DD * DEFINE CLUSTER (NAME(MY.VSAM.LDSFILE) - LINEAR - TRACKS(1,1) - CISZ(4096) ) - DATA (NAME(MY.VSAM.LDSFILE.DATA)) /*
如果您将在大型机服务器上执行上述 JCL。它应该以 MAXCC = 0 执行,并将创建 MY.VSAM.LDSFILE VSAM 文件。
删除LDS集群
使用 IDCAMS 实用程序删除 LDS 集群。DELETE 命令从目录中删除 VSAM 簇的条目,并可选择删除文件,从而释放对象占用的空间。
DELETE data-set-name CLUSTER [ERASE / NOERASE] [FORCE / NOFORCE] [PURGE / NOPURGE] [SCRATCH / NOSCRATCH]
上面的语法显示了我们在删除 LDS 集群时可以使用哪些参数。参数描述与 VSAM - Cluster 模块中提到的相同。
例子
以下示例显示如何使用 IDCAMS 实用程序删除 JCL 中的 LDS 集群 -
//SAMPLE JOB(TESTJCL,XXXXXX),CLASS = A,MSGCLASS = C //STEPNAME EXEC PGM = IDCAMS //SYSPRINT DD SYSOUT = * //SYSIN DD * DELETE MY.VSAM.LDSFILE CLUSTER /*
如果您将在大型机服务器上执行上述 JCL。它应该以 MAXCC = 0 执行,并将删除 MY.VSAM.LDSFILE VSAM 集群。
VSAM - 命令
VSAM命令用于对VSAM数据集执行某些操作。以下是最有用的 VSAM 命令 -
- 改变
- 再现
- 列表猫
- 检查
- 核实
改变
ALTER命令用于修改VSAM文件属性。我们可以更改 VSAM 文件的属性,这些属性在 VSAM 集群定义中提到过。以下是更改属性的语法 -
ALTER file-cluster-name [password] [ADDVOLUMES(volume-serial)] [BUFFERSPACE(size)] [EMPTY / NOEMPTY] [ERASE / NOERASE] [FREESPACE(CI-percentage CA-percentage)] [KEYS(length offset)] [NEWNAME(new-name)] [RECORDSIZE(average maximum)] [REMOVEVOLUMES(volume-serial)] [SCRATCH / NOSCRATCH] [TO(date) / FOR(days)] [UPGRADE / NOUPGRADE] [CATALOG(catalog-name [password]]
上面的语法显示了我们可以在现有 VSAM 集群中更改哪些参数。参数描述与 VSAM - Cluster 模块中提到的相同。
例子
以下示例展示了如何使用 ALTER 命令来增加可用空间、添加更多卷和更改密钥 -
//SAMPLE JOB(TESTJCL,XXXXXX),CLASS = A,MSGCLASS = C //STEP1 EXEC PGM = IDCAMS //SYSPRINT DD SYSOUT = * //SYSIN DD * ALTER MY.VSAM.KSDSFILE [ADDVOLUMES(2)] [FREESPACE(6 6)] [KEYS(10 2)] /*
如果您将在大型机服务器上执行上述 JCL。它应该以 MAXCC = 0 执行,并且它将改变可用空间、卷和键。
再现
REPRO命令用于将数据加载到VSAM数据集中。它还用于将数据从一个 VSAM 数据集复制到另一个 VSAM 数据集。我们可以使用此命令将数据从顺序文件复制到 VSAM 文件。IDCAMS 实用程序使用 REPRO 命令加载数据集。
REPRO INFILE(in-ddname) OUTFILE(out-ddname)
在上面的语法中,in-ddname 是具有记录的输入数据集的 DD 名称。out-ddname 是输出数据集的 DD 名称,输入数据集记录将复制到其中。
例子
以下示例展示了如何将记录从一个数据集复制到另一个 VSAM 数据集 -
//SAMPLE JOB(TESTJCL,XXXXXX),CLASS = A,MSGCLASS = C //STEP1 EXEC PGM = IDCAMS //IN DD DSN = MY.VSAM.KSDSFILE,DISP = SHR //OUT DD DSN = MY.VSAM1.KSDSFILE,DISP = SHR //SYSPRINT DD SYSOUT = * //SYSIN DD * REPRO INFILE(IN) OUTFILE(OUT) /*
如果您将在大型机服务器上执行上述 JCL。它应该以 MAXCC = 0 执行,并将所有记录从 MY.VSAM.KSDSFILE 复制到 MY.VSAM1.KSDSFILE VSAM 文件。
列表猫
LISTCAT命令用于获取VSAM数据集的目录详细信息。Listcat 命令提供有关 VSAM 数据集的以下信息 -
- 短信信息
- RLS信息
- 成交量信息
- 球体信息
- 分配信息
- 数据集属性
LISTCAT ENTRY(vsam-file-name) ALL
在上面的语法中,vsam-file-name 是我们需要其所有信息的 VSAM 数据集名称。指定 ALL 关键字以获取所有目录详细信息。
例子
以下示例展示了如何使用 Listcat 命令获取 VSAM 数据集的所有详细信息 -
//SAMPLE JOB(TESTJCL,XXXXXX),CLASS = A,MSGCLASS = C //STEP1 EXEC PGM = IDCAMS //SYSPRINT DD SYSOUT = * //SYSIN DD * LISTCAT ENTRY(MY.VSAM.KSDSFILE) ALL /*
如果您将在大型机服务器上执行上述 JCL。它应该以 MAXCC = 0 执行,并将显示有关 MY.VSAM.KSDSFILE 数据集的所有目录详细信息。
检查
检查命令用于检查键排序数据集簇的结构完整性。它检查索引和数据组件,如果发现任何问题,则会向假脱机发送错误消息。您可以检查任何 IDCxxxxx 消息。
EXAMINE NAME(vsam-ksds-name) - INDEXTEST DATATEST - ERRORLIMIT(50)
在上面的语法中,vsam-ksds-name 是我们需要检查 VSAM 集群的索引和数据部分的 VSAM 数据集名称。
例子
以下示例显示如何检查 KSDS 数据集的索引和数据部分是否同步 -
//SAMPLE JOB(TESTJCL,XXXXXX),CLASS = A,MSGCLASS = C //STEP1 EXEC PGM = IDCAMS //SYSPRINT DD SYSOUT = * //SYSIN DD * EXAMINE NAME(MY.VSAM.KSDSFILE) - INDEXTEST DATATEST - ERRORLIMIT(50) /*
如果您将在大型机服务器上执行上述 JCL。它应该以 MAXCC = 0 执行,并将在假脱机中的 IDCxxxxx 消息之一中显示 VSAM 数据集的所有问题。
核实
verify命令用于检查并修复错误后未正确关闭的VSAM文件。该命令将正确的数据结束记录添加到文件中。
VERIFY DS(vsam-file-name)
在上面的语法中,vsam-file-name是我们需要检查错误的VSAM数据集名称。
例子
以下示例展示了如何检查和修复 VSAM 数据集中的错误 -
//SAMPLE JOB(TESTJCL,XXXXXX),CLASS = A,MSGCLASS = C //STEP1 EXEC PGM = IDCAMS //SYSPRINT DD SYSOUT = * //SYSIN DD * VERIFY DS(MY.VSAM.KSDSFILE) /*
如果您将在大型机服务器上执行上述 JCL。它应该以 MAXCC = 0 执行,并且它将修复 VSAM 数据集中的错误。
VSAM - 替代索引
备用索引是除了主索引之外为 KSDS/ESDS 数据集创建的附加索引。备用索引通过使用多个键来提供对记录的访问。备用索引的键可以是非唯一键,也可以有重复项。
创建替代索引
以下步骤用于创建备用索引 -
- 定义备用索引
- 定义路径
- 建筑索引
定义备用索引
备用索引是使用DEFINE AIX命令定义的。
DEFINE AIX - (NAME(alternate-index-name) - RELATE(vsam-file-name) - CISZ(number) - FREESPACE(CI-Percentage,CA-Percentage) - KEYS(length offset) - NONUNIQUEKEY / UNIQUEKEY - UPGRADE / NOUPGRADE - RECORDSIZE(average maximum)) - DATA - (NAME(vsam-file-name.data)) - INDEX - (NAME(vsam-file-name.index))
上面的语法显示了定义备用索引时使用的参数。我们已经在定义集群模块中讨论了一些参数,并且一些新参数用于定义备用索引,我们将在这里讨论 -
先生编号 | 参数及说明 |
---|---|
1 | 定义 AIX Define AIX 命令用于定义备用索引并指定其组件的参数属性。 |
2 | 姓名 NAME 指定备用索引的名称。 |
3 | 涉及 RELATE 指定为其创建备用索引的 VSAM 集群的名称。 |
4 | 非唯一键 / 唯一键 UNIQUEKEY 指定备用索引是唯一的,NONUNIQUEKEY 指定可能存在重复项。 |
5 | 升级/不升级 UPGRADE 指定如果修改了基本簇,则应修改备用索引;NOUPGRADE 指定如果修改了基本簇,则应保留备用索引。 |
例子
以下是一个基本示例,展示如何在 JCL 中定义备用索引 -
//SAMPLE JOB(TESTJCL,XXXXXX),CLASS = A,MSGCLASS = C //STEP1 EXEC PGM = IDCAMS //SYSPRINT DD SYSOUT = * //SYSIN DD * DEFINE AIX (NAME(MY.VSAM.KSDSAIX) - RELATE(MY.VSAM.KSDSFILE) - CISZ(4096) - FREESPACE(20,20) - KEYS(20,7) - NONUNIQUEKEY - UPGRADE - RECORDSIZE(80,80)) - DATA(NAME(MY.VSAM.KSDSAIX.DATA)) - INDEX(NAME(MY.VSAM.KSDSAIX.INDEX)) /*
如果您将在大型机服务器上执行上述 JCL。它应该以 MAXCC = 0 执行,并将创建 MY.VSAM.KSDSAIX 备用索引。
定义路径
定义路径用于将备用索引与基本集群相关联。在定义路径时,我们指定路径的名称以及与该路径相关的备用索引。
DEFINE PATH - NAME(alternate-index-path-name) - PATHENTRY(alternate-index-name))
上面的语法有两个参数。NAME 用于指定备用索引路径名称,PATHENTRY 用于指定备用索引名称。
例子
以下是在 JCL 中定义路径的基本示例 -
//SAMPLE JOB(TESTJCL,XXXXXX),CLASS = A,MSGCLASS = C //STEP1 EXEC PGM = IDCAMS //SYSPRINT DD SYSOUT = * //SYSIN DD * DEFINE PATH - NAME(MY.VSAM.KSDSAIX.PATH) - PATHENTRY(MY.VSAM.KSDSAIX)) /*
如果您将在大型机服务器上执行上述 JCL。它应该以 MAXCC = 0 执行,并且它将在备用索引到基本集群之间创建路径。
建筑索引
BLDINDEX 命令用于构建备用索引。BLDINDEX 读取 VSAM 索引数据集(或基本簇)中的所有记录,并提取构建备用索引所需的数据。
BLDINDEX - INDATASET(vsam-cluster-name) - OUTDATASET(alternate-index-name))
上面的语法有两个参数。INDATASET 用于指定 VSAM 集群名称,OUTDATASET 用于指定备用索引名称。
例子
以下是在 JCL 中构建索引的基本示例 -
//SAMPLE JOB(TESTJCL,XXXXXX),CLASS = A,MSGCLASS = C //STEP1 EXEC PGM = IDCAMS //SYSPRINT DD SYSOUT = * //SYSIN DD * BLDINDEX - INDATASET(MY.VSAM.KSDSFILE) - OUTDATASET(MY.VSAM.KSDSAIX)) /*
如果您将在大型机服务器上执行上述 JCL。它应该以 MAXCC = 0 执行,并且它将构建索引。
VSAM - 目录
目录维护数据集所在的单位和卷。目录用于检索数据集。非 VSAM 数据集通过 JCL 中的配置参数创建目录条目。VSAM 数据集以 KSDS 集群的形式维护自己的目录。在下图中,您可以看到 VSAM 目录的类型 -
主目录
主目录本身是一个监视和管理VSAM操作的文件。它们是任何系统中唯一包含有关系统数据集和 VSAM 数据集条目的主目录。VSAM 和非 VSAM 数据集可能在主目录中有条目,但这不是一个好的做法。主目录在系统生成过程中创建并驻留在系统卷上。主目录拥有操作系统中的所有VSAM资源。VSAM 中使用的所有文件均由主目录控制。主目录负责以下操作 -
- 文件密码授权
- 加强安全
- 文件的 VSAM 访问
- 文件空间管理
- 文件位置
- 文件中的可用空间
当上述任何文件属性发生更改时,它们会在主目录中自动更新。主目录是使用 IDCAMS 程序定义的。
用户目录
用户目录与主目录具有相同的结构和概念。它存在于主目录之后的下一个层次结构级别。用户目录在系统中不是强制的,但用于增强VSAM系统的安全性。主目录指向 VSAM 文件,但如果存在用户目录,则主目录指向用户目录。根据系统要求,用户目录的数量可以很多。在VSAM结构中,如果删除主目录,则不会影响用户目录。用户目录包含有关应用程序特定数据集的条目。用户目录的信息存储在主目录中。
数据空间
数据空间是直接存取存储设备中专门分配给VSAM 使用的区域。创建VSAM集群之前必须先创建数据空间。数据空间占用的区域记录在卷目录(VTOC)中,因此该空间将不可分配给任何其他用途,无论是VSAM还是非VSAM。VTOC 有空间占用区域的条目。VSAM 创建一个数据空间来保存用户目录条目。VSAM 控制该空间,并根据 VSAM 文件的需要监视和维护该空间。
独特的集群
唯一集群由一个单独的数据空间组成,该空间完全由在其中创建的集群使用。独特的集群是在直接访问存储上的未分配空间中创建的。
子分配集群
子分配的 VSAM 文件与其他子分配的文件共享 VSAM 空间。它指定文件应在现有 VSAM 空间内进行子分配。子分配用于更轻松地管理和控制VSAM空间。
非 VSAM 数据集
非 VSAM 数据集驻留在磁带和直接访问存储上。非 VSAM 数据集可能在主目录和用户目录中都有条目。编目非VSAM数据集的主要功能是保留单元和卷的序列信息。
VSAM - 文件状态
在使用 VSAM 数据集时,您可能会遇到异常终止。以下是常见的文件状态代码及其描述,将帮助您解决问题 -
代码 | 描述 |
---|---|
00 | 操作成功完成 |
02 | 发现非唯一备用索引重复键 |
04 | 固定长度记录无效 |
05 | 执行 OPEN 文件时,文件不存在 |
10 | 遇到文件结尾 |
14 | 尝试读取文件边界之外的相关记录 |
20 | VSAM KSDS 或 RRDS 密钥无效 |
21 | 执行写入或更改重写密钥时出现序列错误 |
22 | 发现主重复键 |
23 | 未找到记录或未找到文件 |
24 | 文件边界外的键 |
30 | 永久性 I/O 错误 |
34 | 在文件边界外记录 |
35 | 执行 OPEN 文件时,文件不存在 |
37 | 使用错误模式打开文件 |
38 | 尝试打开锁定的文件 |
39 | 由于文件属性冲突,OPEN 失败 |
41 | 试图打开一个已经打开的文件 |
42 | 试图关闭未打开的文件 |
43 | 尝试在不先读取记录的情况下重写 |
44 | 尝试重写不同长度的记录 |
46 | 尝试读取超出文件结尾的内容 |
47 | 尝试读取未打开的文件 IO 或 INPUT |
48 | 尝试写入未打开 IO 或 OUTPUT 的文件 |
49 | 尝试删除或重写未打开的文件 IO |
91 | 密码或授权失败 |
92 | 逻辑错误 |
93 | 资源不可用 |
94 | 顺序记录不可用或并发 OPEN 错误 |
95 | 文件信息无效或不完整 |
96 | 文件没有 DD 语句 |
97 | 打开成功并且文件完整性已验证 |
98 | 文件被锁定 - 打开失败 |
99 | 记录锁定 - 记录访问失败 |