15.14.4 組み込みDBデータベースを再編成する

ここでは,組み込みDBデータベースのメンテナンス時期を見積もる方法とメンテナンス作業の手順について説明します。

JP1/AJS2のデータベースに組み込みDBを使用して長時間運用する場合,レコードの削除でインデクスに無効領域が発生します。この無効領域は,次に示すどちらかの方法でメンテナンスする必要があります。

ajsembdbreclaimコマンドを使用すると,データベース内に存在する無効領域だけで構成されるページ(空きページ)を回収して再利用できるようにします。このコマンドは,サーバ稼働中でも実行できますので,定期的にコマンドを投入することで,データ領域が効率良く利用できるようになります。通常の運用では,このajsembdbreclaimコマンドを使用するだけで,再編成の必要がありません。

しかし,ページの利用効率が低い場合(ページ中に有効データが1件だけある場合など)は,回収可能な空きページが少なくなり,効率良く回収できない場合があります。この場合は,再編成を実施する必要があります。

メンテナンス作業の流れ(組み込みDB)と,マニュアルでの記載個所を次の図に示します。次に示す図を参考にして,メンテナンス時期を見積り,メンテナンス方法を選択してください。

図15-3 組み込みDBデータベース使用時のメンテナンス作業の流れ

[図データ]

<この項の構成>
(1) 組み込みDBデータベースをメンテナンスする時期を見積もる方法
(2) ajsembdbreclaimコマンドを手動で実行する
(3) ajsembdbreclaimコマンドを自動で(ジョブとして)実行する
(4) 手動でデータベースを再編成する
(5) スクリプトを使用してデータベースを再編成する
(6) 組み込みDB再編成スクリプト

(1) 組み込みDBデータベースをメンテナンスする時期を見積もる方法

組み込みDBは,定期的にajsembdbreclaimコマンドを実行して,無効領域を有効領域化するか,または再編成する必要があります。ajsembdbreclaimコマンドの利用および再編成時期を見積もるには,データベース領域を解析します。次に示す方法で実測した解析値を基に,時期を見積もってください。

再編成の時期を見積もる場合,週単位や月単位でピークとなる日や,週および月単位での増加分を考慮してください。

データベース領域を解析する方法を次に示します。

(a) データベース領域の解析

ajsembdbstatusコマンドを実行して,データベースの状態を確認します。

ajsembdbstatusコマンドを使って解析した結果,空きセグメントが少なく空きページが多い場合,データベースをメンテナンスしてください。

ajsembdbstatusコマンドについては,マニュアル「JP1/Automatic Job Management System 2 コマンドリファレンス ajsembdbstatus」を参照してください。

(b) 領域不足のメッセージ

組み込みDBのデータの格納効率が悪くなると,組み込みDBはWindowsイベントログまたはsyslogにメッセージKFPH00211-I,またはKFPH00212-Iを出力します。メッセージが出力された場合,ajsembdbstatusコマンドでデータベースの状態を解析し,必要に応じてデータベースを再編成してください。メッセージの出力例を次に示します。

領域不足のメッセージ出力例

KFPH00211-I RDAREA usage xxx%, RDAREA="xxxxx" xxxxx
KFPH00212-I Table should be reorganized, RDAREA="xxxxx", AUTHID=xxxxx, TABLE=xxxxx

データベースをメンテナンスまたは再編成した直後に,まだメッセージが出力される場合は,RDエリアを拡張する必要があります。RDエリアの拡張については,マニュアル「JP1/Automatic Job Management System 2 コマンドリファレンス ajsembdbaddarea」を参照してください。

(2) ajsembdbreclaimコマンドを手動で実行する

ajsembdbreclaimコマンドを手動で実行する方法を次に示します。ajsembdbreclaimコマンドの詳細は,マニュアル「JP1/Automatic Job Management System 2 コマンドリファレンス ajsembdbreclaim」を参照してください。

なお,ajsembdbreclaimコマンドを組み込みDBのオンライン中に実行すると,データベースサーバのトランザクション終了を待ってからajsembdbreclaimコマンドが実行されますので,繁忙期を避けて使用してください。

Windowsホストの場合
JP1/AJS2 - Managerのインストール先フォルダ¥tools¥ajsembdbreclaim
UNIXホストの場合
/opt/jp1ajs2/tools/ajsembdbreclaim
コマンド例
  • マネージャー(JP1/AJS2 - Manager)内のすべてのスケジューラーサービスを対象とする場合
    ajsembdbreclaim -m manager
  • スケジューラーサービスを対象とする場合
    ajsembdbreclaim -m scheduler -F AJSROOT1

(3) ajsembdbreclaimコマンドを自動で(ジョブとして)実行する

ajsembdbreclaimコマンドをJP1/AJS2のジョブとして定義すると,スケジュールに従ってajsembdbreclaimコマンドを自動的に実行できるようになります。スケジューリングする場合は,1日に1回ajsembdbreclaimコマンドのジョブを実行するスケジュールをお勧めします。

ajsembdbreclaimコマンドを自動で実行する運用例を次に示します。

(a) 定義方法

毎週第5運用日の23:00にajsembdbreclaimコマンドを実行する場合の定義例

  1. 次に示す内容のユニット定義ファイルを作成する。
    Windowsの場合

    unit= ajsembdbreclaim-netwin,,jp1admin,;
    {
       ty=n;
       sd=1,*5;
       st=1,23:00;
       cy=1,(5,d);
       sh=1,ca;
       unit= ajsembdbreclaim-jobwin;
       {
           ty=pj;
           sc="C:¥Program Files¥HITACHI¥JP1AJS2¥tools¥ajsembdbreclaim";
           prm="-m manager";
       }
    }

    UNIXの場合

    unit= ajsembdbreclaim-netunix,,jp1admin,;
    {
       ty=n;
       sd=1,*5;
       st=1,23:00;
       cy=1,(5,d);
       sh=1,ca;
       unit= ajsembdbreclaim-jobunix;
       {
           ty=j;
           te="/opt/jp1ajs2/tools/ajsembdbreclaim";
           prm="-m manager";
       }
    }

  2. 次に示すコマンドを実行してユニットを定義する。
    「ajsdefine ユニット定義ファイル名」コマンドを実行します。
    ajsembdbreclaim.txtという名称でユニット定義ファイルを作成した場合のコマンドの実行例を次に示します。

    ajsdefine ajsembdbreclaim.txt

  3. 次に示すコマンドを実行してユニットを計画実行登録する。
    「ajsentry -s ユニット名」コマンドを実行します。
    コマンドの実行例を次に示します。

    ajsentry -s /ajsembdbreclaim-netwin

    定義したスケジュール情報に従って,自動的に空きページが回収されます。
    なお,JP1/AJS2 - Viewを使用して,計画実行登録することもできます。

(4) 手動でデータベースを再編成する

組み込みDBを手動で再編成する手順を次に示します。ここでは手順の説明に続いて,組み込みDBを使用した場合の使用例を示します。再編成には,ajsembdbrorgコマンドを使用します。ajsembdbrorgコマンドについては,マニュアル「JP1/Automatic Job Management System 2 コマンドリファレンス ajsembdbrorg」を参照してください。

  1. JP1/AJS2のスケジューラーサービスを終了する。
    ajsstopコマンドを使って,該当するJP1/AJS2のスケジューラーサービスを終了します。再編成を実施する組み込みDBが格納しているスケジューラーサービスをすべて終了してください。
    コマンドの形式: ajsstop -F サービス名
    -F サービス名
    処理対象とするスケジューラーサービスのサービス名を指定します。
    コマンドの使用例: ajsstop -F AJSROOT2
  2. 接続しているJP1/AJS2 - Viewおよびコマンドをすべて停止する。
    JP1/AJS2 - Viewおよびスケジューラーのコマンドが動作していないことを確認してください。JP1/AJS2 Console Viewからの接続も切断してください。
  3. ajsembdbreclaimコマンドを使用して,空きセグメントの回収を行う。
    空きセグメントが少ない状態で再編成を実施すると,作業領域が不足して,再編成に失敗する場合があります。これを避けるため,事前に空きセグメントの回収を行うことをお勧めします。
    Windowsホストの場合
    JP1/AJS2 - Managerのインストール先フォルダ¥tools¥ajsembdbreclaim -m scheduler -F サービス名
    UNIXホストの場合
    /opt/jp1ajs2/tools/ajsembdbreclaim -m scheduler -F サービス名
  4. ajsembdbrorgコマンドを使ってデータベースを再編成する。
    ajsembdbrorgコマンドについては,マニュアル「JP1/Automatic Job Management System 2 コマンドリファレンス ajsembdbrorg」を参照してください。
    コマンドの使用例
    Windowsの場合
    ajsembdbrorg -k unld -F サービス名 -d C:¥tmp
    ajsembdbrorg -k reld -F サービス名 -d C:¥tmp
    UNIXの場合
    ajsembdbrorg -k unld -F サービス名 -d /tmp
    ajsembdbrorg -k reld -F サービス名 -d /tmp
    -dで指定するディレクトリは,組み込みDBのセットアップ時に必要な容量を確保してください。
    -k unldで取得したデータを使用して,-k reldを実行するため,-dで指定するディレクトリは,-k unld,reldで同じディレクトリを指定してください。
    -k unldでエラーが発生した場合,作成されたファイルを使用して-k reldを実行しないでください。データベースの内容が不正になるおそれがあります。
  5. JP1/AJS2のスケジューラーサービスを起動する。
    ajsstartコマンドを使って,該当するJP1/AJS2のスケジューラーサービスを起動します。また,関連するサービスも起動してください。
    コマンドの形式: ajsstart -F サービス名
    -F サービス名
    処理対象とする,スケジューラーサービスのサービス名を指定します。
    コマンドの使用例: ajsstart -F AJSROOT2

(5) スクリプトを使用してデータベースを再編成する

組み込みDBをスクリプトで一括してデータベースを再編成する手順を次に示します。ここでは手順の説明に続いて,使用例を示します。

注意
操作としては,(4)で実施している再編成と同等であるため,(4)で作業をすることをお勧めします。
  1. 組み込みDBのコマンドを実行するのに必要な環境変数を設定する。
    設定する環境変数を次の表に示します。

    表15-20 設定が必要な環境変数

    設定する環境変数説明
    PDDIR組み込みDB運用ディレクトリ名を指定します。
    PDCONFPATHWindowsの場合,組み込みDB運用ディレクトリ¥confを,UNIXの場合,組み込みDB運用ディレクトリ/confを指定します。組み込みDBの定義ファイルを格納するディレクトリです。
    PDUXPLDIRWindowsの場合だけ,組み込みDB作業ディレクトリ名を指定します。
    PDUSER組み込みDB管理者(スケジューラーデータベースのテーブルの所有者)のユーザーおよびパスワード(ユーザー/パスワード)を指定します。
    例:PDUSER="root"/"root"
    JP1_HOSTNAMEクラスタで運用している場合に,論理ホスト名を指定します。
    PATHWindowsの場合,組み込みDB運用ディレクトリ¥binを,UNIXの場合,組み込みDB運用ディレクトリ/binを指定します。組み込みDBのコマンドを格納するディレクトリです。
    SHLIB_PATHUNIXの場合だけ,組み込みDB運用ディレクトリ/libを指定します。
    注※
    Solaris,Linuxの場合は,LD_LIBRARY_PATHに,AIXの場合は,LIBPATHになります。
    Windowsの場合の環境変数設定例

    x:¥> set PDDIR=c:¥win32app¥hitachi¥hirdb_e_JA0
    x:¥> set PDCONFPATH=%PDDIR%¥conf
    x:¥> set PDUXPLDIR=%PDDIR%¥uxpldir

    x:¥> set PDUSER="root"/"root"
    x:¥> set JP1_HOSTNAME=lhost1
    x:¥> set PATH=%PATH%;e:¥hirdb_e_JA0¥bin

    UNIX(HP-UX)の場合の環境変数設定例

    # PDDIR=/opt/HiRDB_J
    # PDCONFPATH=$PDDIR/conf
    # PDUSER='"root"/"root"'
    # SHLIB_PATH=$PDDIR/lib
    # PATH=$PATH:$PDDIR/bin

    # export PDDIR PDCONFPATH PDUSER SHLIB_PATH PATH

  2. JP1/AJS2のスケジューラーサービスを終了する。
    ajsstopコマンドを使って,該当するJP1/AJS2のスケジューラーサービスを終了します。再編成するRDエリアを使用しているすべてのスケジューラーサービスを終了してください。
    コマンドの形式: ajsstop -F サービス名
    -F サービス名
    処理対象とするスケジューラーサービスのサービス名を指定します。
    コマンドの使用例: ajsstop -F AJSROOT2
  3. 接続しているJP1/AJS2 - Viewおよびコマンドをすべて停止する。
    JP1/AJS2 - Viewおよびスケジューラーのコマンドが動作していないことを確認してください。JP1/AJS2 Console Viewからの接続も切断してください。
  4. ajsembdbreclaimコマンドを使用して,空きセグメントの回収を行う。
    空きセグメントが少ない状態で再編成を実施すると,作業領域が不足して,再編成に失敗する場合があります。これを避けるため,事前に空きセグメントの回収を行うことをお勧めします。
    Windowsホストの場合
    JP1/AJS2 - Managerのインストール先フォルダ¥tools¥ajsembdbreclaim -m scheduler -F サービス名
    UNIXホストの場合
    /opt/jp1ajs2/tools/ajsembdbreclaim -m scheduler -F サービス名
  5. 次に示すスクリプトを実行する。
    再編成スクリプトはサンプルが提供されています。作業ディレクトリにコピーして使用してください。
    Windowsホスト
    JP1/AJS2のインストール先フォルダ¥tools¥ajsembdbcond-sample.bat
    UNIXホスト
    /opt/jp1ajs2/tools/ajsembdbcond-sample

    ajsembdbcondスクリプトについては,「(6) 組み込みDB再編成スクリプト」を参照してください。
    スクリプトの使用例: ajsembdbcond
    (サンプルスクリプトを,ajsembdbcondに名称変更した場合)
  6. JP1/AJS2のスケジューラーサービスを起動する。
    ajsstartコマンドを使って,該当するJP1/AJS2のスケジューラーサービスを起動します。
    コマンドの形式: ajsstart -F サービス名
    -F サービス名
    処理対象とする,スケジューラーサービスのサービス名を指定します。
    コマンドの使用例: ajsstart -F AJSROOT2

(6) 組み込みDB再編成スクリプト

組み込みDBの再編成スクリプトの形式とカスタマイズについて説明します。再編成スクリプトを使うと,組み込みDBのテーブルおよびインデクスを再編成できます。

(a) 再編成スクリプトの形式

形式
ajsembdbcond-sample[-u ユーザー名 -p パスワード
引数
-u ユーザー名
テーブルの再編成を実行するユーザー名(テーブル所有ユーザー)を指定します。ユーザー名を省略した場合,スクリプト内部で指定されているユーザー名で再編成されます。
-p パスワード
テーブルの再編成を実行するユーザーのパスワードを指定します。パスワードを省略した場合,スクリプト内部で指定されているユーザーのパスワードで再編成されます。
補足事項
  • ユーザー名やパスワードを指定する場合は,次のように指定してください。
    Windowsの場合:"root"
    UNIXの場合:¥"root¥"
    " "で囲むことで,大文字,小文字が区別されます。

(b) 再編成スクリプトのカスタマイズ

再編成スクリプトのカスタマイズについて説明します。スクリプトファイルは,元のスクリプトファイルを作業ディレクトリにコピーしたあと,編集してから使用してください。構築された組み込みDB環境ごとに,スクリプトファイルを用意してください。カスタマイズできる項目を次に示します。

CUSTOM_PDDIR=組み込みDB運用ディレクトリ
組み込みDB運用ディレクトリ名を指定します。
環境変数PDDIRが設定済みの場合は,環境変数PDDIRでの設定を優先します。
また,環境変数PDDIRが設定されていない場合で,スクリプトファイル内でCUSTOM_PDDIRを指定しないときは,テーブルの再編成が実行されません。
CUSTOM_PDCONFPATH=組み込みDBシステム定義ファイル格納ディレクトリ
組み込みDBシステム定義ファイル格納ディレクトリ名を指定します。
環境変数PDCONFPATHが設定済みの場合は,環境変数PDCONFPATHの設定を優先します。
環境変数PDCONFPATHが設定されていない場合で,スクリプトファイル内でCUSTOM_PDCONFPATHを指定しないときは,テーブルの再編成が実行されません。
CUSTOM_PDUXPLDIR=組み込みDB作業ディレクトリ
Windowsの場合だけ指定が必要です。組み込みDB作業ディレクトリ名を指定します。
環境変数PDUXPLDIRが設定済みの場合は,環境変数PDUXPLDIRの設定が優先されます。
また,環境変数PDUXPLDIRが設定されていない場合で,スクリプトファイル内でCUSTOM_PDUXPLDIRを指定しないときは,テーブルの再編成が実行されません。
CUSTOM_EMBDB_USER=テーブル所有者名
再編成コマンドを実行するユーザー名を指定します。
テーブルの所有者ユーザーを指定してください。
CUSTOM_EMBDB_USERにユーザー名を指定していても,スクリプトの引数でユーザー名を指定した場合は,スクリプトの引数の値が優先されます。
CUSTOM_EMBDB_PASS=テーブル所有者名のパスワード
再編成コマンドを実行するユーザーのパスワードを指定します。
CUSTOM_TABLE_LIST=テーブル名
再編成するテーブルのリストをスペースの区切りで指定します。
指定しない場合は,テーブルの再編成が実行されません。
CUSTOM_TABLE_RDAREA=テーブル格納RDエリア
再編成するテーブルを格納しているRDエリアを指定します。
指定しない場合は,テーブルの再編成が実行されません。
CUSTOM_INDEX_RDAREA=インデクス格納RDエリア
再編成するテーブルのインデクスを格納しているRDエリアを指定します。
指定しない場合は,テーブルの再編成が実行されません。
CUSTOM_TEMP_DIR=一時ファイル格納ディレクトリ
再編成コマンドの制御ファイルやデータベースからアンロードしたデータファイルなどを格納するフォルダ名をフルパスで指定します。
指定しない場合,Windowsは「C:¥TEMP」が,UNIXは「/tmp」が仮定されます。
複数の組み込みDB環境を構築している場合や,複数のスケジューラーサービスを構築している場合は,スクリプトの同時実行などによるデータ消失を避けるために,これらの間で使用する一時ファイル格納ディレクトリが重複しないように指定してください。
CUSTOM_LOG_FILE=ログ出力ファイル
スクリプトの実行結果のログを出力するファイルをフルパスで指定します。ログの出力先ファイル名を指定した場合,ログファイルは無限に増えるファイルとなるので,必要に応じて削除してください。
指定しない場合は,標準出力にログが出力されます。
補足事項
  • スクリプトを実行できるユーザー
    スクリプト内で使用するpdholdおよびpdrelsコマンドは,組み込みDBシステム管理者だけが実行できます。OS上の組み込みDBシステム管理者ユーザーでスクリプトを実行してください。
  • ユーザー名やパスワードを指定する場合は,次のように指定してください。
    Windowsの場合:"root"
    UNIXの場合:¥"root¥"
    " "で囲むことで,大文字,小文字が区別されます。
  • エラー発生時の対処方法
    テーブルの再編成中,アンロードしたデータのリロード処理に失敗すると,データベース上のテーブルやインデクスが空になっている場合があります。その場合には,アンロードデータから手動でリロード処理を実行する必要があります。
    また,再編成中にエラーが発生すると,RDエリアは閉塞されたままになるので,回復処理を実行したあと,閉塞を解除してください。
    リロード中にエラーが発生した場合のテーブルを次の表に示します。

    表15-21 エラー発生時(リロード中)のテーブルの状態と回復方法

    エラー発生直前のメッセージRDエリア内のテーブルの状態回復方法
    なし再編成実行前の状態該当テーブルの再編成を再実行
    KFPL00721-Iテーブル削除済み該当テーブルのリロードを再実行
    KFPL00712-I
    KFPL00732-I
    テーブル作成未完該当テーブルのリロードを再実行
    KFPL00714-I
    KFPL00734-I
    テーブル作成終了該当テーブルのリロードを再実行
    KFPL00715-Iインデクス作成未完該当テーブルのリロードを再実行
    KFPL00716-Iインデクス作成終了不要
    (例)リロードを再実行する場合
    データのリロードに失敗した場合,スクリプトの次のパラメーターに指定したフォルダにアンロードしたデータファイルが格納されています。
    CUSTOM_TEMP_DIR
    指定していない場合,Windowsは「C:¥TEMP」が,UNIXは「/tmp」が仮定されます。
    このフォルダには次のファイルが作成されます。
    rorg_ctrl:再編成に必要なコントロールファイル
    08-10-01以前のバージョンの場合
    unldfile:表データ
    08-10-02以降のバージョンの場合
    unldfile_テーブル名:表データ
    このフォルダに作成されたファイルを使用してリロードを実行してください。
    UNITテーブルのリロード時に失敗した場合,再編成の再実行コマンドは次のとおりになります。
    コマンドの実行例
    Windowsの場合:pdrorg -k reld -t AJSUNIT C:¥tmp¥rorg_ctrl
    UNIXの場合:pdrorg -k reld -t AJSUNIT /tmp/rorg_ctrl

    表15-21を参考にして,どの表でのリロードが失敗しているかを特定してください。