テーブルにカラムを追加するとその後のDMLにて Post プロセスで ORA-14148 が発生してPostが停止する場合があります。
-ターゲット event_log
Notice 2022-01-31 11:03:44.159648 32571 3346884352 s:8 Poster: ORA-14148: DML and DDL operations are not directly allowed on the guard-column. (posting from o.SRCSID, queue POSTQNAME, to o.TGTSID) [module osp]
Error 2022-01-31 11:03:44.159949 32571 3346884352 s:8 Poster: que/seq = 8/ 0 seqno/offset = 107/121981144 Unexpected Oracle error: ORA-14148: DML and DDL operations are not directly allowed on the guard-column. (object name: "OWNER"."REPLICATEDTABLE") (posting from o.SRCSID, queue POSTQNAME, to o.TGTSID) [module opo]
Info 2022-01-31 11:03:44.914766 30655 2341717952 Poster exited with code=1, pid = 32571 (posting from o.SRCSID, queue POSTQNAME, to o.TGTSID))
以下の条件をすべて満たす場合に起こり得ます。
- Oracle Database 12c 以降を使用している。
- 以下のようにテーブルにデフォルト値を含むカラムを追加し制約を追加している
CREATE TABLE ATEST_TABLE(I NUMBER);
ALTER TABLE ATEST_TABLE ADD (J NUMBER DEFAULT 0 NOT NULL);
ALTER TABLE ATEST_TABLE ADD (K NUMBER DEFAULT 0);
ALTER TABLE ATEST_TABLE ADD CONSTRAINT "C_ATEST" PRIMARY KEY (I,J,K);
INSERT INTO ATEST_TABLE(I,J,K) VALUES (1,2,3);
COMMIT;
製品の不具合です。
SharePlex リリース 10.2にて修正済みです。
SharePlex 10.2 - Release Notes Resolved Issues and Enhancements
SPO-22777 SharePlex Poster is displaying an error when users add a column with the default value in an Alter table.
SharePlex バージョン 10.2 以上に更新できない場合、以下の回避策を実施してください。
- 問題発生後の復旧手順
1. ターゲットにて KB:4327076 の手順でエラーを起こしているメッセージを破棄します。
以下のように s:8 の出力が event_log に見られる場合、session 8 のメッセージを破棄します。
Notice 2022-01-31 11:03:44.159648 32571 3346884352 s:8 Poster: ORA-14148: DML and DDL operations are not directly allowed on the guard-column. (posting from o.SRCSID, queue POSTQNAME, to o.TGTSID) [module osp]
Error 2022-01-31 11:03:44.159949 32571 3346884352 s:8 Poster: que/seq = 8/ 0 seqno/offset = 107/121981144 Unexpected Oracle error: ORA-14148: DML and DDL operations are not directly allowed on the guard-column. (object name: "OWNER"."REPLICATEDTABLE") (posting from o.SRCSID, queue POSTQNAME, to o.TGTSID) [module opo]
Info 2022-01-31 11:03:44.914766 30655 2341717952 Poster exited with code=1, pid = 32571 (posting from o.SRCSID, queue POSTQNAME, to o.TGTSID))
SRCSID ... ソースにおけるSharePlexの接続設定で指定している名前(SIDあるいはTNS別名)
POSTQNAME … ソースのConfig行で指定したポストキュー名(指定がなければソースホスト名)
TGTSID … ターゲットにおけるSharePlexの接続設定で指定している名前(SIDあるいはTNS別名)
REPLICATEDTABLE … エラーが発生したオブジェクトの名前
OWNER … エラーが発生したオブジェクトのスキーマ名
Current queue POSTQNAME+P+o.SRCSID-o.TGTSID user +PP+POSTQNAME+sp_opst_mt+o.SRCSID-o.TGTSID
Sque 8, mtime 01/31/22 11:03:39, qseq 0, 01/31/22 10:55:49, 107/121981144, Insert, AAASGAAAMAAAAGGAAA "OWNER"."REPLICATEDTABLE", SCN 15302977, forward = 1
Sque 8, mtime 01/31/22 11:03:39, qseq 594, 01/31/22 10:55:51, 107/121983504, COMMIT, AAASGAAAMAAAAGGAAA , SCN 15302981, forward = 1
Total messages read: 2
2. ソースにて同じconfigを再アクティベートすることでオブジェクトキャッシュを再作成します
Post キューメッセージの滞留が無くなったらソースにて KB:314524 の方法でオブジェクトキャッシュを再生成します。
ソースにて
$ sp_ctrl
show config コマンドで現在有効な(Activeである)Configファイル名を確認します。
sp_ctrl> show config
3. 問題が発生したテーブルに対して repair コマンドにてデータを同期します。
sp_ctrl> repair "OWNER"."REPLICATEDTABLE"
以上となります。
- 回避策
ソースのOracle Database でカラム追加を行う際、 "_add_col_optim_enabled" パラメータを false にしたセッションで実施します。
-- 実行例 --
SQL> alter session set "_add_col_optim_enabled"=false ;
SQL> ALTER TABLE ATEST_TABLE ADD (J NUMBER DEFAULT 0 NOT NULL);
SQL> ALTER TABLE ATEST_TABLE ADD (K NUMBER DEFAULT 0);
SQL> ALTER TABLE ATEST_TABLE ADD CONSTRAINT "C_ATEST" PRIMARY KEY (I,J,K);
© ALL RIGHTS RESERVED. Terms of Use Privacy Cookie Preference Center