DBミラーリングシステムの対象とするデータベースに利用不可能な資源が含まれている場合、データベース資源の関連付け(rdbbcmapコマンド)、またはSQLの操作がエラーになります。
各操作におけるエラー情報と対処方法について以下に示します。
未サポートの定義内容 | エラー情報 | 対処方法 |
---|---|---|
サポートされていない格納構造の定義 | rdb: ERROR: qdg20320u:バックアップセンタ運用でサポートしていないDSIが存在するため資源識別子を抽出することができません DSI='データベース名.DSI名' 原因コード=1 | |
一意性制約がない表の定義 | rdb: ERROR: qdg20320u:バックアップセンタ運用でサポートしていないDSIが存在するため資源識別子を抽出することができません DSI='データベース名.DSI名' 原因コード=2 |
SQLの制約事項 | SQLSTATE | SQLMSG | メッセージログファイル | 対処方法 |
---|---|---|---|---|
サポートされていない格納構造に対するデータ更新 | 71400 | JYP2903E:バックアップセンタ運用でサポートされていない機能が利用されました. | rdb: INFO: qdg20001i:バックアップセンタ運用でサポートされていない機能が利用されました 原因コード=1 ロググループ名='ロググループ名' | |
一意性制約がない表に対するデータ更新 | 71400 | JYP2903E:バックアップセンタ運用でサポートされていない機能が利用されました. | rdb: INFO: qdg20001i:バックアップセンタ運用でサポートされていない機能が利用されました 原因コード=2 ロググループ名='ロググループ名' | |
一意制約キーに対する集合更新 | 71400 | JYP2903E:バックアップセンタ運用でサポートされていない機能が利用されました. | rdb: INFO: qdg20001i:バックアップセンタ運用でサポートされていない機能が利用されました 原因コード=3 ロググループ名='ロググループ名' |
参照
正系ノードで利用できる資源については、“B.3.1 サポート対象資源”を参照してください。
DBミラーリングシステムの運用対象資源をDBミラーリングシステムがサポートする格納構造に変更する方法を、以下に説明します。
rdbunlコマンドを使用し、未サポート資源のデータを退避します。
rdbddlexコマンドを使用し、未サポート資源の再定義を行います。
RANDOM構造の表の場合
表とインデックスのDSO定義を削除し、SEQUENTIAL構造の定義で再作成します。
一意性制約がない表の場合
表定義を削除したあと、一意性制約を付加して定義を行います。
格納構造定義を簡略化する設定で、Symfoware/RDBのシステム用の動作環境ファイルにDEFAULT_DSI_NAME=CODEを指定している場合
以下のいずれかを実施して、作成したテーブルの再定義を行います。
テーブル定義を簡略化、または格納領域指定せずに再定義する。
Symfoware/RDBのシステム用の動作環境ファイルのDEFAULT_DSI_NAMEパラメタを省略またはDEFAULT_DSI_NAME=STANDARDに指定して再定義する。
rdbsloaderコマンドを使用し、退避したデータのロード処理を行います。
ポイント
rdbunlコマンド、rdbddlexコマンドおよびrdbsloaderコマンドは、セットアップ時またはDBミラーリングサービス通常停止状態で実施します。
参照
rdbunlコマンド、rdbddlexコマンドおよびrdbsloaderコマンドの詳細は、“コマンドリファレンス”を参照してください。
データベースの格納構造を変更する方法の詳細は、“RDB運用ガイド(データベース定義編)”を参照してください。
DBミラーリングシステムの運用開始後に定義変更を行う場合は“10.3 データベースの定義の変更”を参照してください。
DBミラーリングシステムの運用を行う場合、以下の条件を満たすUPDATE文:探索を実行することができません。実行した場合、DBミラーリングシステムの制約により業務アプリケーションがエラーとなることがあります。
[条件]
設定句の列名に、一意性制約の構成列を指定している。かつ、
更新の結果、一意性制約を指定した列の値が、一時的に同じ値になる行が存在する。
[制約により出力されるエラー]
SQLSTATE | SQLMSG | メッセージログファイル |
---|---|---|
71400 | JYP2903E:バックアップセンタ運用でサポートされていない機能が利用されました. | rdb: INFO: qdg20001i:バックアップセンタ運用でサポートされていない機能が利用されました 原因コード=3 ロググループ名='ロググループ名' |
エラーとなる場合の例、および対処方法について以下に説明します。
制約により業務アプリケーションがエラーとなる例
一意性制約の構成列C1の値が1,2,3 の3行について、C1を2,3,4 と更新しようとした場合に、C1=1の更新処理中に、2,2,3 と一時的に同じ値を持つキーが存在します。
備考) 更新前のC1を3,2,1の順序で処理を行った場合には、4,2,1→4,3,1→4,3,2となって条件外となります(行の並びは、実表データの格納順序や探索条件に依存します)。
対処方法
DBミラーリングシステムの制約により業務アプリケーションがエラーとならないように更新処理を変更してください。
例えば、以下のいずれかのような処理に変更すると、一時的に同じ値にならずに更新できます。
UPDATE文:位置付けでカーソルによって位置づけられた1行を更新する方式に変更
UPDATE文:探索で1行を更新するように、WHERE句に一意性制約の全構成列を指定
一時的に同じ値になることを回避する例について、以下に説明します。
レコードを更新する順序を変更することで、一意性制約の列の値が重複しないようにします。
UPDATE文:位置付けにより一意性制約を構成する列を降順に並び替え、位置づけられた1行を更新する方法に変更する場合
EXEC SQL DECLARE CR1 CURSOR FOR SELECT C1 FROM S01.T01 WHERE C2 = 100 ORDER BY C1 DESC FOR UPDATE; EXEC SQL WHENEVER NOT FOUND GOTO :CLOSE_01; EXEC SQL OPEN CR1; for (;;) { EXEC SQL FETCH CR1 INTO :H01; EXEC SQL UPDATE S01.T01 SET C1 = C1 + 1 WHERE CURRENT OF CR1; } CLOSE_01: EXEC SQL CLOSE CR1; EXEC SQL COMMIT WORK;
UPDATE文:探索で1行を更新するように、WHERE句に一意性制約の全構成列を指定する場合
EXEC SQL SELECT MAX(C1) INTO :max_data FROM S01.T01 WHERE C2 = 100; for (count=max_data; count!=0; count--) { EXEC SQL UPDATE S01.T01 SET C1 = C1 + 1 WHERE C1 = :count AND C2 = 100; } EXEC SQL COMMIT WORK;