 | レベル: 上級 中野 和人, 情報マネージメント技術/大和ソフトウェア開発研究所, IBM
2006年 12月 04日 Content Managerでは妥当検査ユーティリティーというデータの整合性をチェックするツールが提供されています。整合性が崩れている場合はXML形式でレポート出力が行われますが、データ修復方法についてはサンプルが提供されていません。ここでは、あるケースを想定し、不整合を修復するJavサンプル・プログラムについて解説します。
はじめに
IBM DB2 Content Manager バージョン8(以降、Content Managerと略す) では、妥当性検査ユーティリティー(以降、Validatorと略す)と呼ばれるプログラムを提供しています。Validatorは障害時での使用を想定しており、Content Manager管理下のデータベースとファイルとの整合性のチェックを行い、XML形式でレポート出力を行います。
Validatorはレポート出力を行いますが、不整合になった箇所の自動修復は行いません。また修復を行うサンプルなども提供されておりません。この記事では、代表的な不整合を例に取りあげ、修復の考え方について解説を行います。
Validatorの概念
ライブラリー・サーバーとストレージ・システムとの間には直接リンクがないため、ライブラリー・サーバーとリソース・マネージャーとの違い、および、リソース・マネージャーとストレージ・システムとの違いをレポートする必要があります。そのために以下の2つのコマンドが提供されています。Windows用コマンドとAIX用のコマンドを挙げて説明します。
- icmrmvolval.bat / icmrmvolval.sh
ボリューム妥当性検査ユーティリティーと呼ばれており、リソース・マネージャーとストレージ・システム(ドライブ、ファイル・システム)との整合性チェックを行います。
- icmrmlsval.bat / icmrmlsval.sh
サーバー妥当性検査ユーティリティーと呼ばれており、ライブラリー・サーバーとリソース・マネージャーとの整合性チェックを行います。
レポートはXML形式で icmrmlsval20060904222256_NOTINRM.xml のように現象ごとに出力され、タイムスタンプが付加されます。加えて、icmrm.css、icmrmval.css、icmrmval.dtd も出力されます。ファイルごとに、以下の種類の不整合が報告されます。
| 不整合の種類 | 説明 |
|---|
|
Orphan (オーファン)
| オブジェクト・ファイルがリソース・マネージャーにあるが、ライブラリー・サーバーにはそのオブジェクトに対する参照がない場合は、項目がORPHAN レポートに加えられます。 |
|---|
リソース・マネージャーにない (Not in resource manager)
| オブジェクト・ファイルに対する参照がライブラリー・サーバーにあるが、そのオブジェクト・ファイルがリソース・マネージャーにない場合は、項目がNOTINRM レポートに加えられます。 |
|---|
Size mismatch 1
(サイズ不一致)
| ライブラリー・サーバーのオブジェクトのサイズがリソース・マネージャーのオブジェクトのサイズに一致しない場合は、項目がSIZEMISMATCH レポートに加えられます。 |
|---|
Collection mismatch (コレクション不一致)
| ライブラリー・サーバーのオブジェクト・ファイルのコレクションがリソース・マネージャーのオブジェクト・ファイルのコレクションと一致しなかった場合は、項目がCOLLECTION レポートに加えられます。 |
|---|
Date mismatch (日付不一致)
| ライブラリー・サーバーのオブジェクト更新日付がリソース・マネージャーのオブジェクト更新日付と一致しなかった場合は、項目がDATEMISMATCH レポートに加えられます。通常、ライブラリー・サーバーとリソース・マネージャーとの間の同期に問題がある場合は、オブジェクトの更新日付は一致しません。各種レポートにおける余分の項目を減らすため、COLLECTION MISMATCH またはSIZE MISMATCH レポートに加えられた項目はDATEMISMATCH レポートには加えられません。 |
|---|
File not found (ファイルが検出されない)
| オブジェクト・ファイルがリソース・マネージャー・データベースにあるが、そのデータベースに記録されているボリュームには見つからない場合は、項目がFILENOTFOUND レポートに加えられます。ボリュームのデバイス・マネージャーが、「ファイルが存在しない」、または、「データベースのサイズはゼロでないのにファイルのサイズがゼロである」と報告した場合は、ファイルは「Not Found (未検出)」であると判別されます。 |
|---|
Size mismatch 2 (サイズ不一致)
| リソース・マネージャー・データベースのオブジェクト・ファイルのサイズがデバイス・マネージャーの報告するサイズに一致しない場合は、項目がSIZEMISMATCH レポートに加えられます。 |
|---|
以下にレポート例を2つ示します。
一つ目は、「Size mismatch 2 (サイズ不一致)」のレポート例です。格納されているオブジェクト・ファイル“L1.A1001001A06G28C01323H96539.V1“のファイル・サイズは24813バイトですが、リソース・マネージャーでは23093バイトで登録されています。
リスト1. SIZEMISMATCHのレポート例
<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="icmrmval.xsl"?>
<!DOCTYPE icmrmval SYSTEM "icmrmval.dtd">
<icmrmval>
<reporttype>SIZEMISMATCH</reporttype>
<reportattributes>
<reportparameters>-b 2004-12-01-00.00.00 -e 2006-12-01-00.00.00 -f c:\temp
</reportparameters>
<reportparameters name="hostname">testserver</reportparameters>
<reportparameters name="fqdn">9.0.0.1</reportparameters>
<reportparameters name="inetaddress">testserver/9.0.0.1</reportparameters>
<reportparameters name="rmname">RMDB</reportparameters>
<reportparameters name="libname">ICMNLSDB</reportparameters>
<reportdate>2006-09-24-12.02.54</reportdate>
</reportattributes>
<rmvolvalinfo>
<obj_library>ICMNLSDB</obj_library>
<obj_itemid>A1001001A06G28C01323H96539</obj_itemid>
<obj_version>1</obj_version>
<obj_collection>CBR.CLLCT001</obj_collection>
<obj_volume>D-Drive</obj_volume>
<obj_size>23093</obj_size>
<obj_createdate>2006-07-28 11:13:24.938061</obj_createdate>
<obj_updatedate>2006-07-28 11:13:24.938061</obj_updatedate>
<obj_objectname>L1.A1001001A06G28C01323H96539.V1</obj_objectname>
<obj_orgfilename>d:\doc\Test2.jpg</obj_orgfilename>
<obj_filename>D:\\lbosdata\00001\82\L1.A1001001A06G28C01323H96539.V1</obj_filename>
<obj_mimetype>image/jpeg</obj_mimetype>
<vol_size>241813</vol_size>
</rmvolvalinfo>
<returncode>9908</returncode>
<returnmsg>ICM9908: リソース・マネージャーの検査で SIZEMISMATCH タイプの同期化問題を検出しました。
</returnmsg>
</icmrmval>
|
二つ目は、「File not found (ファイルが検出されない)」のレポート例です。Test2.jpgというファイルをContent Managerに登録を行い、“L1.A1001001A06G28C13657B53163.V1”というファイル名で保管されているはずですが、このファイルが存在しません。
リスト2. FILENOTFOUNDのレポート例
<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="icmrmval.xsl"?>
<!DOCTYPE icmrmval SYSTEM "icmrmval.dtd">
<icmrmval>
<reporttype>FILENOTFOUND</reporttype>
<reportattributes>
<reportparameters>-b 2004-12-01-00.00.00 -e 2006-12-01-00.00.00 -f c:\temp
</reportparameters>
<reportparameters name="hostname">testserver</reportparameters>
<reportparameters name="fqdn">9.0.0.1</reportparameters>
<reportparameters name="inetaddress">testserver/9.0.0.1</reportparameters>
<reportparameters name="rmname">RMDB</reportparameters>
<reportparameters name="libname">ICMNLSDB</reportparameters>
<reportdate>2006-09-02-00.09.26</reportdate>
</reportattributes>
<rmvolvalinfo>
<obj_library>ICMNLSDB</obj_library>
<obj_itemid>A1001001A06G28C13657B53163</obj_itemid>
<obj_version>1</obj_version>
<obj_collection>CBR.CLLCT001</obj_collection>
<obj_volume>D-Drive</obj_volume>
<obj_size>9894</obj_size>
<obj_createdate>2006-07-28 12:36:58.782283</obj_createdate>
<obj_updatedate>2006-07-28 12:36:58.782283</obj_updatedate>
<obj_objectname>L1.A1001001A06G28C13657B53163.V1</obj_objectname>
<obj_orgfilename>Test2.jpg</obj_orgfilename>
<obj_filename>L1.A1001001A06G28C13657B53163.V1</obj_filename>
<obj_mimetype>image/jpeg</obj_mimetype>
</rmvolvalinfo>
<returncode>9908</returncode>
<returnmsg>ICM9908: リソース・マネージャーの検査で FILENOTFOUND タイプの同期化問題を検出しました。
</returnmsg>
</icmrmval>
|

 |
修復の考え方、実施例
まずは、不一致と報告された場合の修復を見てみましょう。この場合はデータがないわけではなく、情報が“一致していない”わけですから、ある基準を作って、どちらかの値に合わせることになり、具体的にはデータベース内のレコードを更新することになります。実際にはシェル、JDBCなどでプログラムを作ることになると思いますが、ここでは単純化したSQLコマンドを使いながら作業の説明を行います。紙面などの都合のため、DB2への接続は省略しています。
準備:
対象のライブラリー・サーバーのテーブル名を特定します。
> db2 “select COMPONENTVIEWID,COMPONENTVIEWNAME from ICMSTCOMPVIEWDEFS”
|
出力結果は以下のようになります。
300 ICMBASE001
301 ICMBASETEXT001
1000 NOINDEX001
|
ICMBASEを例にとるとCOMPONENTID=300 で、COMPONENTVIEWNAMEのインデックスが001なので、テーブル名はICMUT00300001 (ICMUT0+0300+001)となります。
-
SIZEMISMATCH:Size mismatch 1 (サイズ不一致)
実存するファイルのファイル・サイズを調査し、その値を更新します。この例では、項目ID「A1001001A04C16B64603G44598'」に対して、ファイル・サイズ58804バイトという値を更新しています。
> db2 "update ICMUT00300001 set RESOURCELENGTH= 58804 where itemid=
'A1001001A04C16B64603G44598'"
|
-
SIZEMISMATCH:Size mismatch 2 (サイズ不一致)
リソース・マネージャーに格納されている値を正として、ライブラリー・サーバー側のファイル・サイズ情報を更新します。
> db2 "update RMOBJECTS set OBJ_SIZE=58804 where obj_itemid='A1001001A04C16B64603G44598'" |
-
COLLECTIONMISMATCH:Collection mismatch (コレクション不一致)
リソース・マネージャーに格納されている値を正として、ライブラリー・サーバー側のファイル・サイズ情報を更新します。
>db2 "update ICMUT00300001 set SMSCOLLCODE=1 where itemid='A1001001A04C16B64603G44598'"
|
コレクションIDは以下のSQL文から取り出すことが可能です。
>db2 "select COL_COLLNAME, COL_COLLID from RMCOLLECTIONS"
|
-
DATEMISMATCH:Date mismatch (日付不一致)
リソース・マネージャーに格納されている値を正として、ライブラリー・サーバー側のファイル・サイズ情報を更新します。
>db2 "update ICMUT00300001 set OBJECTCREATED=’2005-07-28-11:13:38.032652’,
OBJECTUPDATED=’2005-07-28-11:13:38.032652’ where itemid='A1001001A04C16B64603G44598'"
|
次に、データがないと報告された場合の修復を見てみましょう。「Orphan (オーファン)」「リソース・マネージャーにない(Not in resource manager)」「File not found (ファイルが検出されない)」がこれに該当します。“ない”わけですから、なかったことにし、その上で整合性を確保することが一つの基準です。例えば、「File not found」に対して、仮のファイルを作成して整合性を確保することも一つの考え方ですが、ここでは整合性の取れていないレコードを削除することにします。
-
ORPHAN:オーファン
リソース・マネージャーのレコードに’D’という削除対象を示す印を付けておけば、マイグレーター処理時にこのレコードは削除され、関連するオブジェクト・ファイルも併せて削除されます。
> db2 "update RMOBJECTS set OBJ_STATUS='D' where obj_itemid='A1001001A04C16B64603G44598'"
|
-
NOTINRM:リソース・マネージャーにない(Not in resource manager)
以下のように、対象となるライブラリー・サーバー内の情報をXQuery形式で検索を行い、DKDDO#del()メソッドで削除を行います。注意点としては、DKDDO#retrieve()メソッドは発行しないでください。リソース・マネージャーにはオブジェクト・ファイル実体は存在していないので、Exceptionが返されます。
リスト3. NOTINRMの場合の修復例
* @copyright(external)
* Licensed Materials - Property of IBM
* IBM DB2 Content Manager Enterprise Edition V8 (program number 5724-B19)
* IBM DB2 Content Manager Express Edition V8 (program number 5724-F73)
* (c ) Copyright IBM Corp. 1998, 2004. All Rights Reserved.
*
* US Government Users Restricted Rights
* Use, duplication or disclosure restricted by GSA ADP Schedule
* Contract with IBM Corp.
*
* IBM grants you ("Licensee") a non-exclusive, royalty free, license to use,
* copy and redistribute the Non-Sample Header file software in source and
* binary code form, provided that i) this copyright notice, license and
* disclaimer appear on all copies of the software; and ii) Licensee does
* not utilize the software in a manner which is disparaging to IBM.
*
* This software is provided "AS IS." IBM and its Suppliers and Licensors
* expressly disclaim all warranties, whether EXPRESS OR IMPLIED, INCLUDING
* ANY IMPLIED WARRANTY OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE
* OR WARRANTY OF NON- INFRINGEMENT. IBM AND ITS SUPPLIERS AND LICENSORS
* SHALL NOT BE LIABLE FOR ANY DAMAGES SUFFERED BY LICENSEE THAT RESULT
* FROM USE OR DISTRIBUTION OF THE SOFTWARE OR THE COMBINATION OF THE
* SOFTWARE WITH ANY OTHER CODE. IN NO EVENT WILL IBM OR ITS SUPPLIERS
* AND LICENSORS BE LIABLE FOR ANY LOST REVENUE, PROFIT OR DATA, OR FOR
* DIRECT, INDIRECT, SPECIAL, CONSEQUENTIAL, INCIDENTAL OR PUNITIVE DAMAGES,
* HOWEVER CAUSED AND REGARDLESS OF THE THEORY OF LIABILITY, ARISING OUT OF
* THE USE OF OR INABILITY TO USE SOFTWARE, EVEN IF IBM HAS BEEN ADVISED OF
* THE POSSIBILITY OF SUCH DAMAGES.
* @endCopyright
*/
DKDDO ddo = null;
DKNVPair options[] = new DKNVPair[3];
dkIterator iter = null;
DKResults results = null;
options[0] = new DKNVPair(DKConstant.DK_CM_PARM_MAX_RESULTS, "0");
options[1] = new DKNVPair(DKConstant.DK_CM_PARM_RETRIEVE, new Integer(DKConstant
.DK_CM_CONTENT_YES));
options[2] = new DKNVPair(DKConstant.DK_CM_PARM_END, null);
results = (DKResults)dsICM.evaluate("/ICMUT00300001
[./ICMPARTS/@SYSREFERENCEATTRS=>*[@ITEMID=\""A1001001A04C16B64603G44598 "\"]]",
DKConstantICM.DK_CM_XQPE_QL_TYPE, options );
iter = results.createIterator();
while(iter.more()){
ddo = (DKDDO) iter.next();
ddo.del();
}
|
-
FILENOTFOUND:File not found (ファイルが検出されない)
これは、先のNOTINRMと同様に対象のDDOを削除することにより、不整合を解消することができます。(参照:リスト3)

 |
最後に
以上の解説により、場合分けを行いながら、不整合を修復できることを説明致しました。
考慮点としては、バックアップの際には、オブジェクト・ファイルのタイムスタンプは保持してください。そうしないと、リストアの際にValidatorを動作させたときに、すべてのオブジェクト・ファイルに対して「Date mismatch (日付不一致)」が返されることになってしまいます。
参考文献
著者について  | |  | 中野 和人、情報マネージメント技術/大和ソフトウェア開発研究所
|
記事の評価
|  |