データベース設計時にXMLデータを使用する検索業務が決まっており、XMLデータのインデックスを設計できる場合の運用形態について説明します。
以下に運用手順を示します。
図3.2 XMLアダプタの運用手順

“図3.3 論理構造とXMLデータ”、“図3.4 格納構造と論理構造”に示すデータベースの論理構造と格納構造を例に運用手順を説明します。
参照
表、インデックスに対する定義については、“RDB運用ガイド(データベース定義編)”を参照してください。
図3.3 論理構造とXMLデータ

図3.4 格納構造と論理構造

データベース名の登録は、CREATE DATABASE文で行います。このSQL文で、登録するデータベース名を指定します。指定したデータベース名がRDBディクショナリに登録されます。
ここでは、データベースとして、伝票管理DBを登録します。
CREATE DATABASE 伝票管理DB ;
データベーススペースの作成は、CREATE DBSPACE文で行います。CREATE DBSPACE文では、データベーススペース名と、データベーススペースを作成するファイル名を指定します。
ここでは、データベーススペースをDBSP_1とします。
Solarisの場合
ローデバイス名を/dev/rdsk/c3t1d0s3とします。ローデバイス名は、すでに定義済みで実在するものでなければなりません。
CREATE DBSPACE DBSP_1 ALLOCATE RAWDEVICE /dev/rdsk/c3t1d0s3 ;
Linuxの場合
ローデバイス名を/dev_symfoware/raw10とします。ローデバイス名は、すでに定義済みで実在するものでなければなりません。
CREATE DBSPACE DBSP_1 ALLOCATE RAWDEVICE /dev_symfoware/raw10 ;
Windowsの場合
ファイル名をE:\SFWD\RDB\USR\DBSP\DBSP_1とします。
CREATE DBSPACE DBSP_1 ALLOCATE FILE E:\SFWD\RDB\USR\DBSP\DBSP_1 ATTRIBUTE SPACE(100M);
データベーススペースの作成が終了したあと、論理構造の定義を行います。論理構造の定義を行うと、その情報がRDBディクショナリに格納されます。論理構造の定義には、スキーマ定義、順序定義、表定義、ビュー定義、権限情報定義、トリガ定義、プロシジャルーチン定義およびファンクションルーチン定義があります。ここでは、スキーマ定義、表定義だけを行うものとします。
CREATE SCHEMA 伝票スキーマ COMMENT ' 伝票管理用 ' ;
CREATE TABLE 伝票スキーマ.伝票表 (伝票番号 INTEGER NOT NULL,
部門コード SMALLINT NOT NULL,
伝票種別 CHARACTER(2) NOT NULL,
伝票 BLOB(2K) NOT NULL,
PRIMARY KEY(伝票番号)) ;論理構造の定義が終了した後、格納構造の定義を行います。格納構造の定義を行うと、その情報がRDBディクショナリに格納されます。格納構造の定義には、DSO定義とDSI定義の2つがあります。論理構造の定義で作成された表に対して、表のDSO定義および表のDSI定義を行います。
また、表に対してインデックスを定義する場合には、インデックスのDSO定義およびインデックスのDSI定義を行います。同様に、表に対してXMLデータのインデックスを定義する場合は、XML構造のインデックスのDSO定義およびXMLデータのインデックスのDSI定義を行います。格納構造定義は、DSO定義文およびDSI定義文を実行することにより行います。
DSO定義
表、インデックスおよびXMLデータのインデックスのDSOを定義します。
CREATE DSO 伝票表DSO FROM 伝票スキーマ.伝票表
TYPE SEQUENTIAL(PAGESIZE(4), ORDER(0)) ;
CREATE DSO 伝票番号IXDSO INDEX ON 伝票スキーマ.伝票表 (伝票番号)
TYPE BTREE(PAGESIZE1(16), PAGESIZE2(1))
BY ADDRESS ;
CREATE DSO 伝票IXDSO INDEX ON 伝票スキーマ.伝票表 (伝票)
TYPE XML(PAGESIZE1(16), PAGESIZE2(1))
BY ADDRESS ;DSI定義
表、インデックスおよびXMLデータのインデックスのDSIを定義します。
CREATE DSI 伝票表DSI1 DSO 伝票表DSO
ALLOCATE DATA ON DBSP_1 SIZE 280K ;
CREATE DSI 伝票番号IXDSI1 INDEX DSO 伝票番号IXDSO
ALLOCATE BASE ON DBSP_1 SIZE 200K ,
INDEX ON DBSP_1 SIZE 40K ;
CREATE DSI 伝票IXDSI1 INDEX DSO 伝票IXDSO
ALLOCATE BASE ON DBSP_1 SIZE 200K ,
INDEX ON DBSP_1 SIZE 40K ;XMLデータのインデックスの構造を決めるため、XMLグループを定義します。XMLグループは、CREATE XMLGROUP文で定義します。
XMLグループでは、XMLデータの構成要素の中で業務で検索対象とする検索パスを定義します。また、定義したXMLグループが適用される条件を規定する列とその列に格納される情報を選択条件として定義します。
XMLグループは1つのXMLデータのインデックスに存在するDSOに対して複数定義できます。この場合、対象XMLデータのインデックスに存在するDSOに対してそれぞれのXMLグループを定義します。
以下にXMLグループを1つ定義する場合の例を示します。ここでは、“図3.3 論理構造とXMLデータ”に示す構造のXMLデータを「伝票」列に格納するものとし、業務で検索対象とする検索パスは以下の3つとします。
/受注伝票/伝票番号
/受注伝票/受注先/社名
/受注伝票/商品*/商品名
なお、商品タグは繰り返し構造をもつものとし、定義したXMLグループを適用する条件の情報は、「伝票種別」列に格納され、その値は“1”であるとします。
CREATE XMLGROUP 受注伝票GR ON 伝票IXDSO (
'/受注伝票/伝票番号' NUMBER(10,0),
'/受注伝票/受注先/社名' STRING(20),
'/受注伝票/商品*/商品名' STRING(20)
) RULE (伝票種別) = ('1');データベースを効率よくアクセスするために、最適化情報の設定を行います。最適化情報は、格納構造の定義が完了した後に、データベースに格納するレコードの件数やインデックスキーのバリエーションを想定して値を設定します。最適化情報の設定は、XML構造以外の格納構造に対して行います。
参照
最適化情報の設定については、“RDB運用ガイド(データベース定義編)”を参照してください。
DSIは、データを格納する前までに初期化しておきます。DSIの初期化は、rdbfmtコマンドで行います。ただし、rdbsloaderコマンドによりデータを格納する場合にはDSIの初期化は不要です。
以下にrdbfmtコマンドの使用例を示します。
rdbfmt -mi -i 伝票管理DB.伝票表DSI1 rdbfmt -mi -i 伝票管理DB.伝票番号IXDSI1 rdbfmt -mi -i 伝票管理DB.伝票IXDSI1
データベースの定義情報の保全のために、RDBディクショナリのデータをバックアップします。アーカイブログ運用を行っている場合、この契機のバックアップは必須ではありません。RDBディクショナリのバックアップは、RDBディクショナリの規模やリカバリに要する時間を考慮して、任意の契機で、計画的にバックアップを行ってください。
![]()
Solaris/Linuxの場合
rdbdmpdic -f dicback@/home/rdb1/backup -e -y
Windowsの場合
rdbdmpdic -f DICBACK@E:\HOME\RDB1\BACKUP -e -y
アーカイブログ運用を行っていない場合、RDBディクショナリに異常が発生したとき、システム全体をRDBディクショナリのバックアップ時点までリカバリできます。このため、Symfoware/RDBでは、データベース更新が主体の業務には、アーカイブログ運用を行い、データベース参照が主体の業務には、アーカイブログ運用を行わないことを推奨しています。
データベースの創成方法として、以下の2つがあります。
データファイルを使用したrdbsloaderコマンドによる方法(DSI初期化不要)
創成用のアプリケーションを作成してINSERT文によって行う方法(DSI初期化必要)
[rdbsloaderコマンドによるデータベース創成]
rdbsloaderコマンドによってデータベースを創成する例を以下に示します。rdbsloaderコマンドを実行することで、XMLデータのインデックスも同時に作成されます。
![]()
Solaris/Linuxの場合
rdbsloader -mi -i 伝票管理DB.伝票表DSI1 /home/rdb1/voucher.data
Windowsの場合
rdbsloader -mi -i 伝票管理DB.伝票表DSI1 E:\HOME\RDB1\VOUCHER.DATA
[INSERT文によるデータベース創成]
INSERT文によってデータベースを創成するアプリケーションの例を以下に示します。
/*
* 標準入力から入力されたデータを伝票表に格納する
*
* 入力データ形式 : 以下の行の繰り返し
* 伝票番号 部門コード 伝票種別 XMLデータファイル名
*
*/
#include <stdio.h>
#include <string.h>
/* ホスト変数を宣言する */
EXEC SQL BEGIN DECLARE SECTION;
SQL TYPE IS BLOB(32K) SDATA;
char SQLSTATE[6];
char SQLMSG[256];
EXEC SQL END DECLARE SECTION;
int insert(int sno,short code,char *kind);
int main(int argc, char **argv)
{
char in_buf[4096];
EXEC SQL WHENEVER SQLERROR GO TO :ERROR;
/* データベースに接続する */
memset(SQLSTATE,0x00,sizeof(SQLSTATE));
memset(SQLMSG,0x00,sizeof(SQLMSG));
EXEC SQL CONNECT TO DEFAULT;
/* 標準入力から1行ずつ読み込む */
while (fgets(in_buf, sizeof(in_buf), stdin) != NULL){
FILE* fp;
int sno;
int code;
char kind[10];
char fname[256];
/* 挿入するデータを特定する */
if (sscanf(in_buf, "%d %d %s %s", &sno, &code, kind, fname) != 4){
fprintf(stderr, "Invalid data\n");
return 1;
}
/* XMLデータファイルの内容をホスト変数に読み込む */
fp = fopen(fname, "r");
if (fp == NULL){
fprintf(stderr, "Can't open file: %s\n", fname);
return 1;
}
SDATA.SDATA_length =
fread(SDATA.SDATA_data,1, sizeof(SDATA.SDATA_data), fp);
/* データを挿入する */
if (insert(sno, (short)code, kind) != 0){
return 1;
}
}
/* コミットする */
memset(SQLSTATE,0x00,sizeof(SQLSTATE));
memset(SQLMSG,0x00,sizeof(SQLMSG));
EXEC SQL COMMIT WORK;
return 0;
ERROR:
/* 異常終了 */
fprintf(stderr, "ERROR OCCURED\n");
fprintf(stderr, "SQLSTATE = %s\n",SQLSTATE);
fprintf(stderr, "SQLMSG = %s\n\n",SQLMSG);
return 1;
}
int insert(int sno, short code, char *kind)
{
/* ホスト変数を宣言する */
EXEC SQL BEGIN DECLARE SECTION;
long SNO;
short CODE;
char KIND[3];
EXEC SQL END DECLARE SECTION;
/* ホスト変数を初期化する */
memset(KIND,0x00,sizeof(KIND));
memset(SQLSTATE,0x00,sizeof(SQLSTATE));
memset(SQLMSG,0x00,sizeof(SQLMSG));
/* ホスト変数にデータを設定する */
SNO = sno;
CODE = code;
memcpy(KIND,kind,2);
EXEC SQL WHENEVER SQLERROR GO TO :ERROR;
/* 伝票表へデータを格納する */
EXEC SQL INSERT INTO 伝票スキーマ.伝票表
VALUES(:SNO, :CODE, :KIND, :SDATA);
/* 正常終了 */
return 0;
ERROR:
/* 異常終了 */
fprintf(stderr, "ERROR OCCURED\n");
fprintf(stderr, "SQLSTATE = %s\n",SQLSTATE);
fprintf(stderr, "SQLMSG = %s\n\n",SQLMSG);
return -1;
}データベースの運用前に、データ破壊などの異常時のリカバリに備えて、データベースをバックアップします。アーカイブログ運用を行っている場合、表のDSIおよびXMLデータのインデックスのDSIをバックアップしてください。
アーカイブログ運用を行っている場合に、表のDSIとXMLデータのインデックスのDSIをバックアップする手順例を以下に示します。
![]()
Solaris/Linuxの場合
rdbdmp -t /home/rdb1/DSI/dsi.dat -e -y
dsi.datの内容を以下に示します。
伝票管理DB.伝票表DSI1 dmp1@/backup 伝票管理DB.伝票IXDSI1 dmpx@/backup
Windowsの場合
rdbdmp -t E:\USERS\DEFAULT\DSI.DAT -e -y
DSI.DATの内容を以下に示します。
伝票管理DB.伝票表DSI1 DMP1@D:\BACKUP 伝票管理DB.伝票IXDSI1 DMPX@D:\BACKUP
インデックスのDSIは、ダンプレス機能および同期復元機能で、表のDSIからリカバリする場合バックアップ不要です。XMLデータのインデックスについては、表のDSIからインデックスを作成するのに、BTREE構造のインデックスと比べて時間がかかるため、インデックスのDSIの退避データを取得する運用を推奨しています。
業務アプリケーションの運用を開始します。