DBミラーリングシステムの対象とするデータベースに利用不可能な資源が含まれている場合、データベース資源の関連付け(rdbbcmapコマンド)、またはSQLの操作がエラーになります。
各操作におけるエラー情報と対処方法について以下に示します。
未サポートの定義内容 | エラー情報 | 対処方法 |
---|---|---|
サポートされていない格納構造の定義 | qdg20761u: DBミラーリングサービスでサポートしていないDSIが存在するため資源識別子を抽出することができません DSI='データベース名.DSI名' 原因コード=1 | |
一意性制約がない表の定義 | qdg20761u:DBミラーリングサービスでサポートしていないDSIが存在するため資源識別子を抽出することができません DSI='データベース名.DSI名' 原因コード=2 |
SQLの制約事項 | SQLSTATE | SQLMSG | メッセージログファイル | 対処方法 |
---|---|---|---|---|
サポートされていない格納構造に対するデータ更新 | 71400 | JYP2906E: DBミラーリングサービスでサポートされていない機能が利用されました. | qdg20756u:DBミラーリングサービスでサポートされていない機能が利用されました 原因コード=1 ロググループ名='ロググループ名' RLP名='RLP名' | |
一意性制約がない表に対するデータ更新 | 71400 | JYP2906E: DBミラーリングサービスでサポートされていない機能が利用されました. | qdg20756u:DBミラーリングサービスでサポートされていない機能が利用されました 原因コード=2 ロググループ名='ロググループ名' RLP名='RLP名' | |
一意制約キーに対する集合更新 | 71400 | JYP2906E: DBミラーリングサービスでサポートされていない機能が利用されました. | qdg20756u:DBミラーリングサービスでサポートされていない機能が利用されました 原因コード=3 ロググループ名='ロググループ名' RLP名='RLP名' | |
トランザクション内で複数のロググループに対する更新 | 71400 | JYP2907E:トランザクション内で複数のロググループに対する更新はできません. | qdg20763u: トランザクション内で複数のロググループに対する更新はできません ロググループ名='更新を行ったDSIの属するロググループ名' ロググループ名='更新が抑止されたDSIの属するロググループ名' DSI名='更新が抑止されたDSIのデータベース名.更新が抑止されたDSI名' | “B.3.3.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 | JYP2906E: DBミラーリングサービスでサポートされていない機能が利用されました. | qdg20756u:DBミラーリングサービスでサポートされていない機能が利用されました 原因コード=3 ロググループ名='ロググループ名' RLP名='RLP名' |
エラーとなる場合の例、および対処方法について以下に説明します。
制約により業務アプリケーションがエラーとなる例
一意性制約の構成列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;
DBミラーリングシステムの運用を行う場合、トランザクション内で複数のロググループに対する更新はできません。実行した場合、DBミラーリングシステムの制約により業務アプリケーションがエラーとなります。
[出力されるエラー]
SQLSTATE | SQLMSG | メッセージログファイル |
---|---|---|
71400 | JYP2907E: トランザクション内で複数のロググループに対する更新はできません. | qdg20763u: トランザクション内で複数のロググループに対する更新はできません ロググループ名='更新を行ったDSIの属するロググループ名' ロググループ名='更新が抑止されたDSIの属するロググループ名' DSI名='更新が抑止されたDSIのデータベース名.更新が抑止されたDSI名' |
エラーとなる場合の例、および対処方法について以下に説明します。
[例と対処方法の概要]
No | エラーとなる内容 | 対処方法 |
---|---|---|
例1 | トランザクションを終了せずに、別のロググループに対応づけられた資源に対して更新を行った場合 | トランザクションを終了してから、別の資源にアクセスするようにしてください。 |
例2 | 複数のDSIに分割している表で、1つのSQL文で複数のロググループに対応づけられた資源に対して更新を行った場合 | [対処方法1] |
[対処方法2] |
例1
トランザクションを終了せずに、別のロググループに対応づけられた資源に対して更新を行った場合は、エラーとなります。
トランザクションを終了してから、別の資源にアクセスするようにしてください。
例2
複数のDSIに分割している表で、1つのSQL文で複数のロググループに対応づけられた資源に対して更新を行った場合はエラーとなります。
SQL文に分割条件を追加し、トランザクションを分けて資源にアクセスするようにしてください。
資源配置を修正し、1つのロググループに集約するようにしてください。
ポイント
定義を変更した後で変更したDSIに対する初期データを入力するために、rdbunlコマンドを使用し、表DSIのデータを退避しておいてください。
参照
rdbunlコマンドの詳細は、“コマンドリファレンス”を参照してください。
データベースの格納構造を変更する方法の詳細は、“RDB運用ガイド(データベース定義編)”を参照してください。
DBミラーリングシステムの運用開始後に定義を変更する方法の詳細は、“10.3 データベースの定義変更”を参照してください。