データセットの紹介
本章では、データセットのアクセス方式、データセット名、SMSクラス、カタログの登録と管理、およびデータセットの処理など、データセットの全般について記述します。
1. 概要
データセットとは、論理的に関連付けられているデータ・レコードの集合であり、アプリケーションで使用されるデータの基本単位です。データセットとUNIXファイルの根本的な違いは、データセットを使用する場合、レコード単位のI/Oをサポートするアクセス方式が提供されるという点です。
データセットは、ハードディスクや磁気テープなどの2次記憶装置に格納されます。記憶装置の基本単位はボリュームです。ハードディスクにはあらゆる種類のデータセットが格納できますが、磁気テープには順次データセット(SDS)のみを格納できます。
OpenFrameでは、磁気テープ・デバイスはサポートしていません。その代わり、ハードディスクの特定領域を磁気テープのボリュームにマッピングする方法を提供します。オプションに応じて磁気テープのボリュームに格納されているデータセットを圧縮して保管できます。
2. データ・アクセス方式
データをレコード単位で読み取り、書き込む技術です。それぞれのアクセス方式は、固有のデータセット構造でデータを格納し、データセットを処理するためのインターフェースとユーティリティ・プログラムを持っています。各データセットの処理に使われるアクセス方式は、そのデータセットの構造によって識別されます。たとえば、順次データセットを処理するには、BSAMまたはQSAMを使用する必要があります。
OpenFrameでは、メインフレームのEXCP(EXecute Channel Program)を用いた物理I/O方式は提供していません。一般的なリホスト対象のアプリーションが、メインフレームの低レベル・アクセス方式のマクロや関数を直接使用することは稀なためです。OpenFrameが目指しているのは、メインフレームのマクロや関数に1対1で対応および互換させることではなく、論理的・外部的なレベルの機能や概念の違いに基づいてリホストした場合の高コスト問題を解消するために、低コストで効率的なソリューションを提供することです。 |
以下は、データセットのアクセス方式の種類と、それについての説明です。
-
BDAM (Basic Direct Access Method、基本直接アクセス方式)
プログラムの要求に応じてデータ・レコードを格納し、0から始まるデータ・レコードの相対アドレスに直接アクセスします。BDAMデータセットでは1ブロック・サイズのデータを1つのレコードとして認識します。
BDAMアクセス方式は、最も基本的なアクセス方式です。使用上の制約が多いため、最近ではアプリケーション・プログラムで使用されることは多くありません。
-
BSAM (Basic Sequential Access Method、基本順次アクセス方式)
データ・レコードを入力順に格納する方式で構成されたデータセットを順次データセットといいます。プログラムは様々なレコードを1つのブロックとして構成して格納し、BSAMはブロック単位でデータを読み書きできます。
OpenFrameでは、順次データセットを処理するために、データ・ブロックのバッファー管理をユーザーに任せるBSAMアクセス方式ではなく、ユーザーの代わりにバッファーを管理するQSAMアクセス方式を提供しています。
-
QSAM (Queued Sequential Access Method、待機順次アクセス方式)
BSAMと同様に、入力順にレコードを格納します。QSAMはI/O性能を向上するためにバッファーリング手法を使用し、ユーザーの代わりにバッファーを管理します。つまり、GETインターフェースで入力バッファーから次の順次レコードを読み取り、PUTインターフェースで次の順次レコードを出力バッファーに記録します。ディスクに存在するデータを入力バッファーに読み込むか、あるいは出力バッファーにあるデータをディスクに格納するのはアクセス・メソッドが行います。
-
ISAM (Indexed Sequential Access Method、索引付き順次アクセス方式)
ISAMで処理されるデータセットは、索引順次データセットと呼ばれます。ISAMはキー・フィールドの順にレコードを格納し、キー・フィールドでデータ・レコードを照会します。
OpenFrameではISAMデータセットを、内部的にVSAMのKSDSにマッピングしてサポートしていますが、データセット管理の統一性を保つために、VSAMのKSDSに変換して使用することをお勧めします。
-
BPAM (Basic Partitioned Access Method、基本区分アクセス方式)
データを区分データセット(PDS: Partitioned Data Set)のメンバーとして格納します。区分データセットの各メンバーは1つの順次データセットとみなされます。
区分データセットは、データセット内部に、それぞれのメンバー名でデータ・アドレスを検索できるディレクトリ情報が含まれています。OpenFrameでの区分データセットは、UNIXファイル・システムのディレクトリで構成されます。
日立メインフレームにはLIMEというアクセス方式が存在しますが、OpenFrameではLIMEには対応していません。LIMEは非VSAMのPDSと同様に、1つのデータセットに複数のメンバーを保存します。一方、実装の面では、VSAMをベースにしてPDSの機能を実装しており、メンバー単位のロック処理が可能であることが特徴です。
-
VSAM (Virtual Storage Access Method、仮想記憶アクセス方式)
VSAMは、ディスクに格納された固定長レコードや可変長レコードの直接処理、または順次処理に使用します。VSAMによって構成されたデータは、迅速なアクセスのために必ずカタログに登録する必要があります。
VSAMデータセットは、以下の4つのタイプに分けられます。
種類 説明 ESDS (Entry-Sequenced Data Set、入力順データセット)
入力順にレコードを格納し、新規レコードはデータセットの一番後ろに追加されます。レコードに対する順次処理が可能であり、相対バイト・アドレス(RBA: Relative Byte Address)を使用して直接処理することもできます。
KSDS (Key-Sequenced Data Set、キー順データセット)
レコードはキー・フィールドの昇順に格納され、キー・フィールドでレコードの直接処理を行うことができます。TSAMでは、相対アドレスでKSDSの直接処理ができません。
RRDS (Relative Record Data Set、相対レコードデータセット)
レコード番号(RRN: Relative Record Number)の順にレコードを格納します。このレコード番号でのみレコードを直接処理できます。RRDSには固定長RRDSと可変長RRDSの2種類があります。
LDS (Linear Data Set、線形データセット)
LDSは、データをレコード単位でなく、ブロック単位で格納します。LDSは他のVSAMデータセットと異なり、データセット内にいかなる制御データも持っていません。またTSAMでは、LDSをサポートしていません。
-
OpenFrameではVSAMの対応製品としてTSAMを提供しています。TSAMについての詳細は、VSAMデータセットを参照してください。
-
日立メインフレームではLDSタイプをFDS(Flat Data Set)タイプに区分します。
-
VSAMデータセットの種類についての詳細は、VSAMデータセットの種類を参照してください。
-
新規データセットのアクセス方式を選択するには、順次処理をするか直接処理をするか、またどのような処理が行いたいかなどを考慮する必要があります。たとえば、RRDSは直接処理のみを行うアプリケーションや直接処理または順次処理をするアプリケーションに適しています。BSAM(順次データセット)とVSAM ESDSは、順次処理をするアプリケーションに適しています。
3. データセット名
ユーザーは新規データセットを作成する際には、一意の名前を付ける必要があります。(一般的にデータセットの名前は、JCLでdsnameで指定されます。)
データセット名は、1つの名前セグメント、または関連付けられた複数の名前セグメントで構成されます。それぞれの名前セグメントは修飾子でレベルを示します。
たとえば、TPLAB.IGKANG.TEST3というデータセット名は、3つの名前セグメントで構成されています。最初のセグメントであるTPLABは「高位修飾子」、最後のセグメントのTEST3は「低位修飾子」と呼ばれます。
データセット名は以下のような規則で作成します。
-
名前セグメントは基本的に最大8文字で構成されますが、環境設定により最大15文字まで使用することができます。
-
セグメントの最初の文字は英字(A-Z)または記号(#、@、$)のいずれかで始まります。
-
セグメントの残りの7文字は、英字(A-Z)、数字(0-9)、記号(#、@、$)、またはハイフン(-)から選択します。
-
名前セグメントを区切るためにピリオド(.)を使用します。
-
データセット名の長さは、名前セグメントとピリオドを含めて44文字に制限されます。
|
4. ストレージの管理
ジョブを実行するユーザーが、新規データセットを作成するたびに、データセットを格納するユニットやボリューム・シリアルをJCLに直接記述するのは非効率的です。また、ジョブを実行する各ユーザーにストレージ管理を任せると、ストレージ管理への体系がないため、時間が経つにつれ管理が難しくなります。
本節では、OpenFrameシステムのSMSクラス(ストレージ・クラス、マネジメント・クラス、データ・クラス)を使用して、効果的にストレージを管理する方法について説明します。
4.1. ストレージ・クラス
ストレージ管理者は、現行システムで使用可能なすべてのストレージに対し、各ストレージ・デバイスの性能または容量を基準にして用途を区別した後、そのストレージ・デバイスを環境設定のsmサブジェクトのストレージ・クラスとして登録します。
システムにストレージ・クラスを登録した後は、JCLのDD文にUNITまたはVOLパラメータを使って直接ボリューム・シリアル番号を指定するのではなく、JCLのDD文にストレージ・クラスを指定することができます。ストレージ・クラスが指定されたデータセットは、そのストレージ・クラスに分類されたストレージ・ボリューム・シリアルのいずれかにデータ領域が割り当てられます。
さらに、データセット名からデータセットの属性が推測できる場合は、JCLのDD文に直接ストレージ・クラスを指定しなくても、自動的にストレージ・クラスが指定されるように設定できます。
ストレージ管理者がACS(Automatic Class Selection)規則を登録すると、そのACSの規則に適したデータセットは、ストレージ管理者が設定したストレージ・クラスに指定されます。また、そのストレージ・クラスに分類されたボリューム・シリアルのいずれかにデータセットのデータ領域が割り当てられます。
|
4.2. マネジメント・クラス
ストレージの管理には、新規データセットに対するデータ領域の割り当てや、期限切れデータセットの削除などの操作が含まれます。
ストレージ管理者は、データセットの保管期間に応じてデータセットのクラスを分類した後、マネジメント・クラスとして登録します。登録されたマネジメント・クラスは、前述したストレージ・クラスと同様、JCLのDD文に直接記述して使用するか、またはACS規則を登録して自動的にデータセットにマネジメント・クラスが指定されるように設定できます。
マネジメント・クラスが指定されたデータセットが期限切れになると、OpenFrameのデータセット管理サーバーであるofrdmsvrによって自動的に削除されます。
4.3. データ・クラス
データ・クラスは、使用頻度の高いデータセットの属性を基準にクラスを登録します。データ・クラスを使用すると、ユーザーはより簡単にJCLを作成することができます。
データ・クラスに定義されたデータセットの属性は、前述のストレージ・クラスやマネジメント・クラスとは異なり、JCLのパラメータを使って変更できます。
以下は、JCLを使用してデータセットを新規作成する例です。この例では、ACS規則を使用せずに、直接JCLにSMSクラスを指定してデータセットを作成しています。(ストレージ・クラスを直接指定したため、VOLパラメータとUNITパラメータは無効です)
//MYJOB JOB //STEP1 EXEC PGM=IEFBR14 //MKDS1 DD DSNAME=IGKANG.TEST.DS0001,DISP=(NEW,CATLG), // DATACLAS=TEST,MGMTCLAS=NEVER, // STORCLAS=SECURE,VOL=SER=XXXXXX,UNIT=SYSDA
5. カタログの登録
データセットの物理的なストレージを管理するために、OpenFrameシステムはVTOC(Volume Table of Contents)とカタログを使用します。
VTOCは、1つのボリューム内にあるデータセットの一覧を管理し、データセットに関する基本情報や物理的なディスク・アドレス、データセットのサイズを管理します。カタログは、データセットの多様な属性と、データセットが存在するボリュームに関する情報を記述します。
すべてのデータセットは、以下の方法でカタログに登録されます。
-
JCL(Job Control Language、ジョブ制御言語)のDISPパラメータ
-
AMS(Access Method Service、アクセス方式サービス)のALLOCATE、またはDEFINEコマンド
-
TSO(Time Sharing Option、タイム・シェアリング・オプション)のALLOCATEコマンド
カタログに登録されていない既在のデータセットは、IDCAMS(JSCVSUT/KQCAMS)ユーティリティのDEFINE RECATALOGコマンドを使用してカタログに登録できます。
|
6. データセットの処理
OpenFrame環境ですべてのプログラムは以下の手順でデータセットを処理します。
-
データセットを割り当てて、プログラムとデータセットを関連付けます。(Allocate)
データセットを処理するには、まずデータセットを割り当てた後、それぞれのアクセス方式が提供するインターフェースを使用してデータにアクセスします。
データセットの割り当てとは、次の2つの作業を意味します。
-
新規データセットのためのディスク領域の割り当て
以下の方法でデータセットを割り当てることができます。
区分 説明 AMS(Access Method Service)
IDCAMS(JSCVSUT/KQCAMS)のALLOCATEコマンドを使用してデータセットを割り当てます。
JCL(Job Control Language)
すべてのデータセットはJCLを使用して直接定義することができます。
-
ジョブ・ステップと使用するデータセットの論理的な関連付け
-
-
DDNAMEを使用してデータセットを識別し、データセットを開きます。(Open)
-
アクセス方式を使用してデータを読み書きします。(Read/Write)
-
使用したデータセットを閉じます。(Close)
-
割り当てられたデータセットを解放します。(Unallocate)
非VSAMデータセットに対する処理手順も同じです。 |
6.1. データセットの割り当てと解放
ユーザーが既存のデータセットにアクセスする際、システムは物理的なストレージ・デバイスのアドレスを検索するため、JCLでユーザーが提供したデータセットの情報とカタログに登録されているデータセット情報を利用します。また、ユーザーが新規データセットを作成する際、システムはユーザーが提供したデータセットの情報に基づき、ディスクにデータセットのストレージを確保します。このように、既存のデータセットのストレージ・アドレスを検索する作業、または新規データセットのストレージを確保する作業などを割り当て(Allocate)といいます。
-
データセットを新規作成するために割り当てる場合には、新規データセットが格納されるボリュームとデバイス情報、データセットのサイズ情報が必要です。
-
既存のデータセットを使用するために割り当てる場合には、ボリュームとデバイス情報が必要です。データセットがカタログに登録されている場合は、データセット名を指定するだけで十分です。
システムはデータセットを割り当てる際、DCB(Data Control Block)と呼ばれる構造体を用意します。DCB構造体は、1つのデータセットを処理するために必要な情報とリアルタイムでI/Oレポートを行うためのバッファーで構成されています。
データセットを処理する前に割り当てが必要で、データセットの処理後には解放(Unallocate)する必要があります。JCLで記述されるデータセットのディスポジションは、システムがデータセットを解放する際、どのように処理すべきかを指定します。たとえば、一時データセットの処理において、作業が終わるまでデータセットを維持すべきか、あるいはすぐに削除すべきかを決定し、永久データセットの処理においては、マスター・カタログに登録されるべきか、もしくはユーザー・カタログに登録されるべきかを決定します。
6.2. データセットのオープンとクローズ
アプリケーションは特定のデータセットにアクセスする前に、Openインターフェースを使用してデータセットを開く必要があります。OpenインターフェースはDCBを介してアプリケーションとアクセス方式、およびデータセットを論理的に関連付けます。
Openインターフェースは、DCB構造体を完成し、データセットを初期化し、データセットの処理に必要なシステム内部バッファーを用意します。
DCB構造体は、次の3つの情報により完成されます。
-
カタログ情報
-
JCL DD文
-
アプリケーション
Closeインターフェースは、アプリケーションとデータセット間の接続を切断します。
データセットを閉じる際、システムは以下のような作業を行います。
-
物理的に記録されていないデータをディスクに書き込みます。
-
データセットのサイズ情報などのカタログ情報を変更します。
-
データセットの処理に使用されたDCB構造体を解放します。
6.3. オープン・モード
データセットを開くときはオープン・モードを指定します。同モードは、アプリケーションのデータセットに対する読み書きを設定するためのモードです。
データセットは、次の4つのオープン・モードのいずれかに指定されます。
-
入力モード(Input Mode)
入力モードを指定すると、データセットの読み取りのみ可能になります。レコードを記録、変更、削除するなどの操作にはエラーが発生します。存在しないデータセットを開く場合、OPTIONALオプションを指定していなければエラーが発生します。
-
出力モード(Output Mode)
出力モードを指定すると、アプリケーションがレコードを書き込みできる新規データセットを作成します。データセットでレコードを読み取る操作にはエラーが発生します。また、書き込みの目的で既存のデータセット開くと、既存のすべてのレコードは削除されます。
-
入出力モード(Input/Output Mode)
入出力モードを指定すると、データセットの読み書き操作が可能になります。存在しないデータセットを開く場合、OPTIONALオプションを指定していなければエラーが発生します。
-
拡張モード(Extend Mode)
拡張モードは出力モードと似ていますが、既存のデータセットへの書き込みにのみ使用されます。アプリケーションはファイルの末尾に新規レコードを書き込みます。存在しないデータセットを開く場合、OPTIONALオプションを指定していなければエラーが発生します。
該当するデータセットが存在しない場合、OPTIONALオプションが指定されていれば、データセットを作成します。 |
6.4. アクセス・モード
データセットのアクセス・モードは、データセットに存在するレコードの処理順を意味しており、データセットの属性ではなくアプリケーションでデータセットを使用する方法を示します。
次の3つのアクセス・モードのいずれかを指定します。
-
順次アクセス(Sequential Access)
順次アクセス・モードは、レコードを最初のレコードから最後のレコードまで順次に読み書きする方法です。ESDS、RRDS、KSDSはすべてのレコードに対する順番が存在するため、順次にアクセスすることができます。RRDSの順番は相対レコード番号(RRN)によって決まり、KSDSの順番は主キーまたは補助キーのいずれの英数字のキーで決まります。
-
ランダム・アクセス(Random Access)
ランダム・アクセス・モードは、希望する順にレコードを処理します。ESDS、RRDS、KSDSはランダム・アクセス・モードをサポートします。ランダム・アクセス方式でデータセット・レコードを読み取る場合、ユーザーはデータセットの構成方式に応じて、RBA、RRN、キー値などのレコード識別子を指定する必要があります。
-
動的アクセス(Dynamic Access)
動的アクセス・モードは、アプリケーションを実行している間、データセットに対して順次アクセス・モードとランダム・アクセス・モードを両方とも使うことができます。ESDS、RRDS、KSDSは動的アクセス・モードをサポートします。
6.5. レコード・アクセス
データセットが開かれた後は、TSAMで提供する多様なインターフェースを使用して、データセットに存在するレコードを処理することができます。たとえば、READインターフェースを介してデータセットに存在するレコードを読み取り、WRITEインターフェースを使用してデータセットに新規レコードを追加することができます。
次の4つのレコード・アクセス・インターフェースを使用してデータセットのレコードを管理します。
-
WRITE(レコードの挿入と追加)
TSAM ESDSでは、新規レコードを間に追加することができません。TSAM KSDSやRRDSの場合、キーを使用して追加されるレコードの位置を指定すると、間にレコードを追加することが可能です。該当のレコード・キーにすでにレコードが存在する場合は、DUPLICATE RECORDエラーコードが返されます。
-
READ(レコードの読み取り)
-
順次アクセス
アプリケーションがデータセットに初めて順次アクセスを実行すると、常に最初のレコードから読み取り始めます。以前、データセットにランダム・アクセスを行ったことがある場合は、内部のレコード・ポインターが変更されている可能性があるため、STARTインターフェースを使ってレコード・ポインターを初期化してから、順次アクセス・インターフェースを使用することをお勧めします。
-
ランダム・アクセス
TSAM ESDS、KSDS、RRDSはレコード識別子を使用してランダム・アクセスをサポートします。ランダム・アクセス・モードは内部レコード・ポインターの影響を受けません。読み取るレコードを検索するには、TSAMデータセットの種類に応じて、以下の情報を提供する必要があります。
データセット 情報 KSDS
KEY
RRDS
RRN
ESDS
RBA
ESDSに対してもRBAを使用したランダム・アクセスは可能ですが、一般的な業務アプリケーションで使用するには適していません。
-
-
REWRITE(レコードの変更)
REWRITEインターフェースを使用して、レコードの内容を変更することができます。ただし、TSAM KSDSのレコードを変更するとき、主キーの内容は変更できません。
-
DELETE(レコードの削除)
DELETEインターフェースを使用して、データセット・レコードを削除することができます。TSAM RRDSでレコードを削除すると、削除されたレコードが使用していた領域を再使用することができます。ただし、TSAM ESDSではレコードを削除することができません。