消してしまったデータセットを復活させる
資料を整理していたら懐かしの資料が出てきた。今ではVSAMに加えストライピングなどの拡張データセットなどが増え、従来からのPSやPDSだけではないので簡単に救えるわけではないけど、せっかくなので備忘録代わりに残そうと思う。自身がなければDFSMSdssなどでボリュームを物理ダンプでバックアップしてからトライすること。
なお、消してしまったデータセットがワークボリュームなど、いろんなジョブから頻繁に一時的データセットなどが作られるボリュームにあった場合、消してしまったデータセットのトラックデータを後から作られたデータセットで上書きされている可能性が高いので復活は望み薄。また、バックアップがあるならそこから戻すに超したことはない。バックアップが古すぎて役に立たないとか、バックアップ後の更新を再反映させる手間が多すぎるとか、やるならいろいろ考えてからにする。
- 同じVOL内で身代わりにするデータセットのDSCBを選択してそのアドレスを求める。
- 身代わりになるデータセットのバックアップを取る。これはとても重要。
- 身代わりになるデータセットのDSCB内のエクステント記述部分を、消してしまったデータセットの元のエクステント・アドレスに書き換える。
- 復活したデータセットを別ボリュームにバックアップする。
- 身代わりデータセットのDSCBを元に戻す。
消してしまったデータセットの復活を試みる
削除してしまったデータセットがボリューム内のどのアドレスにあったかを突き止められるなら、VTOCにZAPすることで一時的に復活させる方法がある。昔、あやまってソースやロードモジュールのライブラリーを消してしまった時に使った。その時は担当してたPPが持っていたオンラインのDASDパッチツールを使ったが、IMASPZAPでも同様のことはできる。
以降に説明する手順は、PSやPDSデータセットについてのもので、エクステントが複数(それも4個以上)にまたがるようなものや、SMS管理の拡張データセットなどを、VTOC ZAPで復元するには十分なDFSMSのスキルが必要になる。しかし上手くできればプログラムなどを作ることなく復活できる可能性がある。
手順
考え方の基本は「データセットを消してもそれはVTOCからはずれているだけで元のトラック上にはデータは残っている」ということ。消したデータセットが使っていたトラックが新しく作成したデータセットに割り当てられない限りデータは読み出せる。生きているVTOCエントリーで消したデータセットの占有スペースを示せばデータを取り出せるはず、というもの。
なお作業中は対象のDASDボリュームへの新規データセットの作成を禁止すること。既存のデータセットの読み込みはかまわないが書き出しはやめた方がよい。もしエクステントが拡張されると消したデータセットのトラックが再使用される可能性がある。
求めるのはデータセットではなくDSCBのアドレス。IEHLIST LISTVTOC/FORMATかDUMPで得られる。
※可能な限り、消してしまったデータセットと同じ形式で、容量やエクステント数が近いものがよい。まったく違うデータセットだと、DSCBの変更量が増えて大変。同じ形式のPSがあるならそれがよい。
拡張データセットでなければ、SPACE=(TRK,0)で同じ形式のデータセットをアロケートしてもよい。VTOCにDSCB1は追加されるが、どのトラックも割り当てられないので、元のデータセットのトラックには影響しない。ただし拡張フォーマットDSの場合はSMSがからむので、ゼロ・スペースでは割り当てられなかった、と記憶している。
複数のエクステントがあるなら、それに応じて書き換え部分を増やす。なお元のデータセットが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実行時はコンソールにコンファーム・リプライが上がるので注意。
//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 //
//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構造についての十分な知識が必要、マニュアルなどで十分に調べて自信がなければやめましょう。いざとなったらこんな方法もある、ということです。
Comment from 野良猫
Time 2011年2月17日 at 00:21
自分のこの方法ではないのですが、消したデータセットを完全復元はできませんでしたが、何とか読むことはできました。その際に使用したのが、スペースをABS指定でアロケーションし、読み込む際には、消したデータセットのDCBを付加して読み込んだのですが、やはり読める場合と読めない場合がありました。