72186
**実行環境:**  
Windows 10  
Oracle Database 19c (Cloud)

大規模な基幹系システムのDBバックアップ/リストア方法について検討しています。  
Oracle RMANなどは利用せずダンプのインポート/エクスポートにてDBバックアップを想定しています。

**対象のテーブル構造:**

  * 500ほどのテーブルが存在し、そのほとんどのテーブルに企業コードを持っている
  * `企業コード = 1` のとき、Aの企業に関するデータ
  * `企業コード = 2` のとき、Bの企業に関するデータ

バックアップ時は企業コードに関係なく「expdp」でDBをまるまるエクスポートしたいと考えています。

そして、今回お聞きしたいのが以下のリストア部分になります。  
DBの復元時は企業コードを指定し、コードに関するデータのみ個別に復元させられないかと考えています。

一度、一時テーブルにインポートしてから企業コードごとにインサートし直せば良いとは思うのですが、もっと効率的にできないものかと検討しています。

何かいい手段があればご教授頂けませんでしょうか？
CC BY-SA 4.0
2020-11-24T14:15:18.453
72182
2020-11-25T00:45:27.590
2020-11-24T16:45:49.650
3060
42857
question
oracle
OracleDB のリストア時、条件に一致するデータのみをインポートしたい
impdpには[QUERY](https://docs.oracle.com/cd/E15817_01/server.111/e05768/dp_import.htm#11809)オプションがあります。

[使用例](https://www.sql-dbtips.com/expdp-impdp/datapump-impdp-error/#keni-
toc1)をリンク先から抜粋:

```

    impdp oracle/oracle \
     DIRECTORY=DMPDIR \
     TABLES=TEST \
     TABLE_EXISTS_ACTION=append \
     QUERY=\"WHERE ID \>= 10\" \
     CONTENT=data_only \
     DUMPFILE=TEST.dmp \
     LOGFILE=TEST_IMP.log
    
```

パラメータファイルを使わないと記号のエスケープが必要になる点や、表別名として`KU$`を用いるTipsを意識しないと思わぬ結果になりかねない点にご注意ください。

また、[DATA_OPTIONS](https://docs.oracle.com/cd/E15817_01/server.111/e05768/dp_import.htm#6865)オプションに`SKIP_CONSTRAINT_ERRORS`を指定することで対応可能かもしれません。  
リストア先の企業テーブルを特定の企業コードに絞って配置し、リストアテーブルに企業テーブルの外部キーを作成することで意図的に制約エラーを発生されることができます。

このパラメータを使ったことがないので推測ですが、企業テーブルを書き換えるだけで外部キーをつけた全テーブルが対応可能です。  
しかしログがエラーで大変な長さになりそうです。  
また素直に考えると全行インサートしてエラーを発生させるこちらよりもQUERYの方が高速と予想されます。

※QUERY使用例のリンク先も、対象が明確な時は`QUERY`オプションが、そうでない時は`DATA_OPTIONS`オプションの方が実用的だと[まとめ](https://www.sql-
dbtips.com/expdp-impdp/datapump-impdp-error/#keni-toc5)ています。
CC BY-SA 4.0
2020-11-25T00:45:27.590
72186
2020-11-25T00:45:27.590
9820
72182
answer