- 「メインフレーム・コンピューター」で遊ぼう - http://www.arteceed.net -

消してしまったデータセットを復活させる

資料を整理していたら懐かしの資料が出てきた。今ではVSAMに加えストライピングなどの拡張データセットなどが増え、従来からのPSやPDSだけではないので簡単に救えるわけではないけど、せっかくなので備忘録代わりに残そうと思う。自身がなければDFSMSdssなどでボリュームを物理ダンプでバックアップしてからトライすること。
なお、消してしまったデータセットがワークボリュームなど、いろんなジョブから頻繁に一時的データセットなどが作られるボリュームにあった場合、消してしまったデータセットのトラックデータを後から作られたデータセットで上書きされている可能性が高いので復活は望み薄。また、バックアップがあるならそこから戻すに超したことはない。バックアップが古すぎて役に立たないとか、バックアップ後の更新を再反映させる手間が多すぎるとか、やるならいろいろ考えてからにする。


    消してしまったデータセットの復活を試みる

    削除してしまったデータセットがボリューム内のどのアドレスにあったかを突き止められるなら、VTOCにZAPすることで一時的に復活させる方法がある。昔、あやまってソースやロードモジュールのライブラリーを消してしまった時に使った。その時は担当してたPPが持っていたオンラインのDASDパッチツールを使ったが、IMASPZAPでも同様のことはできる。
    以降に説明する手順は、PSやPDSデータセットについてのもので、エクステントが複数(それも4個以上)にまたがるようなものや、SMS管理の拡張データセットなどを、VTOC ZAPで復元するには十分なDFSMSのスキルが必要になる。しかし上手くできればプログラムなどを作ることなく復活できる可能性がある。

      手順

      考え方の基本は「データセットを消してもそれはVTOCからはずれているだけで元のトラック上にはデータは残っている」ということ。消したデータセットが使っていたトラックが新しく作成したデータセットに割り当てられない限りデータは読み出せる。生きているVTOCエントリーで消したデータセットの占有スペースを示せばデータを取り出せるはず、というもの。
      なお作業中は対象のDASDボリュームへの新規データセットの作成を禁止すること。既存のデータセットの読み込みはかまわないが書き出しはやめた方がよい。もしエクステントが拡張されると消したデータセットのトラックが再使用される可能性がある。

        1. 同じVOL内で身代わりにするデータセットのDSCBを選択してそのアドレスを求める。
        2. 求めるのはデータセットではなくDSCBのアドレス。IEHLIST LISTVTOC/FORMATかDUMPで得られる。
          ※可能な限り、消してしまったデータセットと同じ形式で、容量やエクステント数が近いものがよい。まったく違うデータセットだと、DSCBの変更量が増えて大変。同じ形式のPSがあるならそれがよい。

          拡張データセットでなければ、SPACE=(TRK,0)で同じ形式のデータセットをアロケートしてもよい。VTOCにDSCB1は追加されるが、どのトラックも割り当てられないので、元のデータセットのトラックには影響しない。ただし拡張フォーマットDSの場合はSMSがからむので、ゼロ・スペースでは割り当てられなかった、と記憶している。


        3. 身代わりになるデータセットのバックアップを取る。これはとても重要。

        4. 身代わりになるデータセットのDSCB内のエクステント記述部分を、消してしまったデータセットの元のエクステント・アドレスに書き換える。
        5. 複数のエクステントがあるなら、それに応じて書き換え部分を増やす。なお元のデータセットが3個を超えるエクステントを持っていた場合、追加のDSCB3を作る必要がある。したがって身代わりデータセットも4個以上のエクステントを持ち、DSCB3がチェインされているものを選ぶ必要がある。エクステント数が多かったり、ストライピングでいくつものボリュームにまたがっているデータセットの強制復活にチャレンジするには、DFSMSが拡張フォーマットのデータセットやストライピングをどう管理しているか十分に理解してからでないと危険。

          //VTOCZAP  EXEC PGM=IMASPZAP
          //SYSPRINT DD SYSOUT=*
          //SYSLIB   DD DISP=OLD,DSN=FORMAT4.DSCB,
          //            UNIT=SYSDA,VOL=SER=volser,DCB=KEYLEN=44
          //SYSIN    DD *
          *
          * UPDATE VTOC DSCB1 TO RESTORE SCRATCHED DATASET
          *
          CCHHR 0000000104
          VER 006B 000200000002000E
          REP 006B 000300000003000E
          ABSDUMP 0000000104 0000000104
          //
          

          これがエクステント・アドレスを付け替えるSPZAPのサンプル。DSCB1はCCHHR=0000-0001-04にある。
          身代わりデータセットのエクステント0002-0000から0002-000Eの15トラック分を、消してしまったデータセットのエクステント0003-0000から0003-000Eに付け替える。
          1エクステントで構成された簡単な例で、エクステントアドレスとDSN以外は、身代わりと消してしまったものは同じ場合の例。
          DSCBのフィールドとオフセットについてはIECSDSL1マクロで確認できる。またはマニュアル「DFSMSdfp 拡張サービス」参照。SPZAP実行時はコンソールにコンファーム・リプライが上がるので注意。


        6. 復活したデータセットを別ボリュームにバックアップする。
        7. //IEBGENER EXEC PGM=IEBGENER(またはICEGENER)
          //SYSPRINT DD SYSOUT=*
          //SYSUT1   DD DISP=SHR,DSN=身代わりのデータセット名
          //SYSUT2   DD DISP=(,CATLG),DSN=消してしまったデータセットに対応した任意のDSN,
          //            UNIT=SYSDA,VOL=SER=WRKVOL,SPACE=(CYL,(1,1))  SPACE量は必要に応じて指定
          //SYSIN    DD DUMMY
          //
          

        8. 身代わりデータセットのDSCBを元に戻す。
        9. //VTOCZAP  EXEC PGM=IMASPZAP
          //SYSPRINT DD SYSOUT=*
          //SYSLIB   DD DISP=OLD,DSN=FORMAT4.DSCB,
          //            UNIT=SYSDA,VOL=SER=volser,DCB=KEYLEN=44
          //SYSIN    DD *
          *
          * UPDATE VTOC DSCB1 TO RESTORE ORIGIN DATASET
          *
          CCHHR 0000000104
          VER 006B 000300000003000E
          REP 006B 000200000002000E
          ABSDUMP 0000000104 0000000104
          //
          

          実行後ISPFなどで内容を確認する。


いずれにしてもDASDボリュームのVTOC構造についての十分な知識が必要、マニュアルなどで十分に調べて自信がなければやめましょう。いざとなったらこんな方法もある、ということです。