【IRIS/Cache】データベースの整合性をチェックする

はじめに

IRIS/Cacheが不具合を起こす事が希な事ですが、端末の異常に巻き込まれる形でIRIS/Cach不具合を起こす事があります。
過去に、ストレージの劣化と共にデータベースにも不具合が発生し、データの不整合が発生するケースがありました。

データベースの不整合は、ぱっと見で判断するのは困難です。

その時に確認する方法として、「^INTEGRIT」コマンドがあります。

^INTEGRIT

レイドを組んでいたサーバ機で、ハードディスクに障害が発生しました。
念のため、Cacheに何らかの影響が発生していないか、調査を行いました。

Cacheのスタジオを立ち上げた際に、見たこともない強烈なエラーが表示されていました。

エラー名:<DATABASE>
エラー内容:「Caché がデータベースの劣化を検出しました」

丁度OSが発しているエラーと同じ内容のエラーが出ていますね。
 →怪しさ満点ですが、この時はまさかデータベース自体に問題が発生しているとまでは思っていませんでした。

そこで「^INTEGRIT」コマンドの登場です。
%SYSネームスペースにて実行します。

zn "%SYS"
d ^INTEGRIT
SAMPLE>zn "%SYS"
 
%SYS>d ^INTEGRIT
 
This utility is used to check the integrity of a database
and the pointer structure of one or more globals.
 
Output results on
Device: 

「Output results on Device:」と聞かれるので、出力先をファイル名を含めた絶対パスで入力します。

Device: xxxxxxx\integrit.log
Parameters? "WNS" => [Enter]
Stop after any error?  No=> [Enter]
Do you want to check all databases?  No=> [Y]

全データベースのチェック(Do you want to check all databases?)だけは「Y」にして、後はそのままEnterで良いです。

その後チェックロジックが走り、結果は「Device:」で入力したログファイルに出力されます。
 ※かなりマシンに負荷がかかるのでご注意下さい。

出力されたログファイル(integrit.log)を確認すると、下記エラーが出力されていました。

Global: ISC.oddMETA
 トップ/ボトムポインタレベル: ブロック数=1      8kb (充填率 9%)
 データレベル:           ブロック数=1      8kb (充填率 0%)
 合計:                ブロック数=2      16kb (充填率 4%)
 経過時間 = 2.1 秒 11/12/2021 01:21:48
   
 **********グローバル ISC.oddMETA に問題があります**********
 ポインタブロック 46 を処理中にタイプ 33 のエラー
 ノード 10 を処理中にエラーが発生しました
  which is ^ISC.oddMETA("PRESUS","%Studio.General","cpp-dyn","tree","%Studio.General",3,"K") pointing to the lower level block 185
 ブロックの照合 #15 がグローバルディレクトリの照合 #5 と一致しません

データベースに不整合が発生しているのを確認できましたが、よりにもよってmgrフォルダ配下のcacheのDATファイルで発生していました。

この他にも、クリティカルなDATファイルで同様にエラーが出力されていました。

幸いな事に、データ自体はバックアップがあったので、Cacheをアンインストールからの再インストールを行い、バックアップデータをリストアする事で、何とか復旧まで漕ぎつけています。

おわりに

不慮の事故は極力遭遇したくないものです。
ただ、稀に遭遇してしまうのは仕方のない話です。

その時は、慌てず色々と調査のコマンドを実施する必要があります。

転ばぬ先の杖。
知っていて損はないコマンドのご紹介でした。