Oracle Data Pump の INCLUDE 句と EXCLUDE 句同時使用を試す（Oracle Database 21c)

# Oracle Database 21 の Data Pump 
Data Pump は Oracle Database の標準的なデータ移行ツールです。Data Pump はデータベース全体、スキーマ、テーブル、表領域等様々な単位でデータのエクスポート／インポートを行うことができます。本記事では Oracle Database 21c で利用できるようになった Data Pump の expdp コマンド、impdp コマンドの INCLUDE 句と EXCLUDE 句を同時に使用した場合の動作について説明します。

# INCLUDE句とEXCLUDE句
　expdp コマンド、impdp コマンドの INCLUDE 句と EXCLUDE 句は、指定した条件に合致するオブジェクトをインポートまたはエクスポートするために指定します。expdp コマンドに INCLUDE 句を指定した時は条件に一致するオブジェクトだけがエクスポートされ、impdp コマンドに EXCLUDE 句を指定した時は条件に合致したオブジェクト以外がインポートされます。
　INCLUDE 句と EXCLUDE 句を同時に指定すると従来のバージョンではエラーになっていました。下記は Oracle Database 19c の expdp コマンドで INCLUDE 句と EXCLUDE 句を同時に指定した例です。
UDE-00011 エラーが発生して、処理が停止しています。

```SHELL:
$ expdp userid=system/{password} schemas=SCOTT INCLUDE=TABLE:\"LIKE \'DATA%\'\" EXCLUDE=INDEX dumpfile=scott.dmp

Export: Release 19.0.0.0.0 - Production on 月 10月 10 15:57:52 2022
Version 19.14.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
UDE-00011: パラメータincludeがパラメータexcludeと一貫性がありません

```

# 同時使用
Oracle Database 21c では、INCLUDE 句と EXCLUDE 句が同時に指定できるようになりました。Oracle Database 19cでエラーになった構文も正常に実行されます。

```
$ expdp userid=system/{password}@rel83-1:1521/o21apdb1 schemas=SCOTT INCLUDE=TABLE:\"LIKE \'DATA%\'\" EXCLUDE=INDEX dumpfile=scott.dmp

Export: Release 21.0.0.0.0 - Production on 月 10月 10 21:57:17 2022
Version 21.3.0.0.0

Copyright (c) 1982, 2021, Oracle and/or its affiliates.  All rights reserved.

接続先: Oracle Database 21c Enterprise Edition Release 21.0.0.0.0 - Production
"SYSTEM"."SYS_EXPORT_SCHEMA_01"を起動しています: userid=system/********@rel83-1:1521/o21apdb1 schemas=SCOTT INCLUDE=TABLE:"LIKE 'DATA%'" EXCLUDE=INDEX dumpfile=scott.dmp
オブジェクト型SCHEMA_EXPORT/TABLE/TABLE_DATAの処理中です
オブジェクト型SCHEMA_EXPORT/TABLE/STATISTICS/TABLE_STATISTICSの処理中です
オブジェクト型SCHEMA_EXPORT/TABLE/TABLEの処理中です
. . "SCOTT"."DATA1"                                 0 KB       0行がエクスポートされました
. . "SCOTT"."DATA2"                                 0 KB       0行がエクスポートされました
マスター表"SYSTEM"."SYS_EXPORT_SCHEMA_01"は正常にロード/アンロードされました
******************************************************************************
SYSTEM.SYS_EXPORT_SCHEMA_01に設定されたダンプ・ファイルは次のとおりです:
  /u01/app/oracle/admin/O21A/dpdump/D3B2F4649E0E214BE053E101A8C02AB3/scott.dmp
ジョブ"SYSTEM"."SYS_EXPORT_SCHEMA_01"が月 10月 10 21:57:26 2022 elapsed 0 00:00:07で正常に完了しました
```

INCLUDE 句と EXCLUDE 句が同時に指定された場合、まず INCLUDE 句が検証され対象となるオブジェクトが特定されます。EXCLUDE 句はその後にチェックされます。

下記の例では INCLUDE 句で全テーブルを指定し、DATA1 テーブルだけを EXCLUDE 句で除外しています。
その結果、SCOTT スキーマの中から DATA2, TABLE1 テーブルのみがエクスポートされ、DATA1 テーブルは除外されています。

```
$ cat example1.par
userid=system/{password}@rel83-1:1521/o21apdb1
schemas=SCOTT
INCLUDE=TABLE
EXCLUDE=TABLE:"='DATA1'"
dumpfile=scott.dmp

$ expdp parfile=example1.par

Export: Release 21.0.0.0.0 - Production on 月 10月 10 22:03:27 2022
Version 21.3.0.0.0

Copyright (c) 1982, 2021, Oracle and/or its affiliates.  All rights reserved.

接続先: Oracle Database 21c Enterprise Edition Release 21.0.0.0.0 - Production
"SYSTEM"."SYS_EXPORT_SCHEMA_01"を起動しています: system/********@rel83-1:1521/o21apdb1 parfile=example1.par
オブジェクト型SCHEMA_EXPORT/TABLE/TABLE_DATAの処理中です
オブジェクト型SCHEMA_EXPORT/TABLE/STATISTICS/TABLE_STATISTICSの処理中です
オブジェクト型SCHEMA_EXPORT/TABLE/TABLEの処理中です
. . "SCOTT"."DATA2"                                 0 KB       0行がエクスポートされました
. . "SCOTT"."TABLE1"                                0 KB       0行がエクスポートされました
マスター表"SYSTEM"."SYS_EXPORT_SCHEMA_01"は正常にロード/アンロードされました
******************************************************************************
SYSTEM.SYS_EXPORT_SCHEMA_01に設定されたダンプ・ファイルは次のとおりです:
  /u01/app/oracle/admin/O21A/dpdump/D3B2F4649E0E214BE053E101A8C02AB3/scott.dmp
ジョブ"SYSTEM"."SYS_EXPORT_SCHEMA_01"が月 10月 10 22:03:33 2022 elapsed 0 00:00:05で正常に完了しました

```