[GoldenGate] impdpによるデータロード処理が抽出できない事象

# はじめに
ソースデータベースに対して実行したimpdpによるデータインポート処理が、GoldenGateのPrimary Extract(いわゆるCaptureプロセス)による抽出処理が実行されない事象が発生しましたため、本記事にて共有いたします。

Captureプロセスに、タグ00を無視する下記パラメータが設定されている場合に発生するようです。
* TRANLOGOPTIONS EXCLUDETAG 00

# 環境
動作確認環境は下記です。
DB: Oracle Database 19c Enterprise Edition 19.16.0.0.0
GG: Oracle GoldenGate 19.1 19.1.0.0.210720

# 再現確認
Captureプロセスの TRANLOGOPTIONS EXCLUDETAG 設定が、`00` になっている事を確認します。
```
GGSCI > SEND pe1 GETPARAMINFO TRANLOGOPTIONS

Sending GETPARAMINFO request to EXTRACT PE1 ...

/u01/ogg/gghome_1/dirprm/pe1.prm

tranlogoptions                       : <enabled>
  excludetag                         : 00
(省略)
```

impdpコマンドを使用して、テーブルデータをインポートします。
```
[oracle@db11 admin]$ impdp system@pdbtokyo.primary DIRECTORY=mig_dir DUMPFILE=tab_pump.dmp TABLES=pumpdemo.tab_pump  LOGFILE=imp_tab_pum
p.log CONTENT=DATA_ONLY

Import: Release 19.0.0.0.0 - Production on 土 6月 10 15:27:22 2023
Version 19.16.0.0.0

Copyright (c) 1982, 2019, Oracle and/or its affiliates.  All rights reserved.
パスワード:

接続先: Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production
マスター表"SYSTEM"."SYS_IMPORT_TABLE_01"は正常にロード/アンロードされました
"SYSTEM"."SYS_IMPORT_TABLE_01"を起動しています: system/********@pdbtokyo.primary DIRECTORY=mig_dir DUMPFILE=tab_pump.dmp TABLES=pumpdemo.tab_pump LOGFILE=imp_tab_pump.log CONTENT=DATA_ONLY
オブジェクト型TABLE_EXPORT/TABLE/TABLE_DATAの処理中です
. . "PUMPDEMO"."TAB_PUMP"                       190.8 KB   10000行がインポートされました
ジョブ"SYSTEM"."SYS_IMPORT_TABLE_01"が土 6月 10 15:27:28 2023 elapsed 0 00:00:02で正常に完了しました
```

上記の通り、`10000行がインポートされました`と出力されて正常に完了している事が確認できます。

本来であれば、ソースデータベースにインポートされた10000行のデータが、Captureプロセスによって抽出されるはずですが、STATSコマンドにて確認しても下記の通り、処理された形跡はありません。
```
GSCI>  STATS EXTRACT pe1, LATEST, TOTALSONLY PDBTOKYO.PUMPDEMO.TAB_PUMP

Sending STATS request to EXTRACT PE1 ...
(省略)
        No database operations have been performed.
Fully qualified table name PDBTOKYO.PUMPDEMO.TAB_PUMP is not found in the Oracle GoldenGate configuration.

End of Statistics.
```

# パラメータ修正後の確認
次に、Captureプロセスの TRANLOGOPTIONS EXCLUDETAG 設定を、`10` に修正して同じ操作を実行します。TRANLOGOPTIONS EXCLUDETAG 設定を確認します。想定通り`10`になっています。
```
GGSCI (db11.besite) 8> SEND pe1 GETPARAMINFO TRANLOGOPTIONS

Sending GETPARAMINFO request to EXTRACT PE1 ...

/u01/ogg/gghome_1/dirprm/pe1.prm

tranlogoptions                       : <enabled>
  excludetag                         : 10
(省略)
```

impdpコマンドを使用して、テーブルデータをインポートします。
```
[oracle@db11 ~]$ impdp system@pdbtokyo.primary DIRECTORY=mig_dir DUMPFILE=tab_pump.dmp TABLES=pumpdemo.tab_pump  LOGFILE=imp_tab_pump.log CONTENT=DATA_ONLY

Import: Release 19.0.0.0.0 - Production on 土 6月 10 16:12:32 2023
Version 19.16.0.0.0

Copyright (c) 1982, 2019, Oracle and/or its affiliates.  All rights reserved.
パスワード:

接続先: Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production
マスター表"SYSTEM"."SYS_IMPORT_TABLE_01"は正常にロード/アンロードされました
"SYSTEM"."SYS_IMPORT_TABLE_01"を起動しています: system/********@pdbtokyo.primary DIRECTORY=mig_dir DUMPFILE=tab_pump.dmp TABLES=pumpdemo.tab_pump LOGFILE=imp_tab_pump.log CONTENT=DATA_ONLY
オブジェクト型TABLE_EXPORT/TABLE/TABLE_DATAの処理中です
. . "PUMPDEMO"."TAB_PUMP"                       190.8 KB   10000行がインポートされました
ジョブ"SYSTEM"."SYS_IMPORT_TABLE_01"が土 6月 10 16:12:36 2023 elapsed 0 00:00:02で正常に完了しました
```

先ほどと同様、`10000行がインポートされました`と出力されて正常に完了している事が確認できます。EXCLUDEタグ設定を修正による改善は確認できるでしょうか。STATSコマンドにて確認します。
```
GGSCI (db11.besite) 21> STATS EXTRACT pe1, LATEST, TOTALSONLY PDBTOKYO.PUMPDEMO.TAB_PUMP

Sending STATS request to EXTRACT PE1 ...
(省略)
    Total inserts                              10000.00
    Total updates                                  0.00
    Total deletes                                  0.00
    Total upserts                                  0.00
    Total discards                                 0.00
    Total operations                           10000.00

End of Statistics.
```
上記の通り、10000行のINSERTデータが、Captureプロセスによって抽出されている事が確認できました。

# まとめ
TRANLOGOPTIONS EXCLUDETAG 00 の場合に抽出できない動作から推測すると、impdpが自身のセッションに 00 のタグを設定しているものと考えます。00以外のタグを設定するようにしましょう。

# タグに関する補足
GoldenGateタグの用途について補足いたします。
## トランザクションのループを防止する
双方向レプリケーションを構成している環境において、Replicatが実行したトランザクションがREDOに記録されると、そのREDOデータを、Extractプロセスが抽出してしまい、トランザクションがループしてしまいます。トランザクションのループを防止するため、Replicatのトランザクションに任意のタグを設定します。また、ExtractにもReplicatに設定したタグを無視するように設定します。

## 任意のトランザクションをレプリケーションさせない
任意のセッションが実行したトランザクションをレプリケーションさせたくない場合に自身のセッションにタグを設定後にトランザクションを実行します。例えば、`TRANLOGOPTIONS EXCLUDETAG 10` (タグ10のトランザクションを無視する設定)の場合は、下記のようにタグ10を設定する事により、レプリケーション対象外にすることが可能です。
```
SYSTEM SQL> EXECUTE dbms_streams_adm.set_tag('10')

PL/SQLプロシージャが正常に完了しました。

SYSTEM SQL> SELECT dbms_streams_adm.get_tag FROM DUAL;

GET_TAG
--------------------------------------------------------------------------------
10
```

以降のセッションで実行したトランザクションはレプリケーション対象外になります。
```
SYSTEM SQL> INSERT INTO pumpdemo.tab_pump VALUES (100000, 'A');

1行が作成されました。

SYSTEM SQL> COMMIT;

コミットが完了しました。
```