« 皆既月食、次は「2014年10月8日」 | トップページ | TIPS : Oracleの統計情報ハンドリング関係。 »

2011年12月18日 (日)

TIPS : Oracleのimpdp/expdpで、特定テーブルのみ取込/除外したい場合の対処方法

今回は、あまりにデータが大きすぎて、取り込むと時間がかかりすぎるテーブルを
除外しようとしたときに発生したエラーについて、記録。
(ちなみに、OSはLinuxです。)

1.USER_Aのスキーマダンプから、USER_Bスキーマに対してテーブルデータ以外を取り込む。

シェススクリプト(概要)は以下のように作りました。

impdp USER_B/PASSWORD_B@SERVICE_B \
dumpfile=DATA_PUMP_DIR:USER_A.dmp \
logfile=DATA_PUMP_DIR:impdp_METADATAONLY.log \
remap_schema=USER_A:USER_B \
content=METADATA_ONLY \
transform=oid:n

2.できあがったUSER_Bスキーマ(およびテーブル構造)に対して、テーブルデータのみを取り込む。

その際に、特定のテーブルについては、取り込まない。

シェススクリプト(概要)は以下のように作りました。

impdp USER_B/PASSWORD_B@SERVICE_B \
dumpfile=DATA_PUMP_DIR:USER_A.dmp \
logfile=DATA_PUMP_DIR:impdp_DATAONLY.log \
remap_schema=USER_A:USER_B \
table_exists_action=truncate \
content=DATA_ONLY \
exclude=TABLE:"TABLE_A",\
TABLE:"TABLE_B",\
TABLE:"TABLE_C" \
transform=oid:n

でそれぞれ実行すると、「1」は問題なく終わるのですが、「2」ででエラーが発生しました。

Import: Release 11.2.0.1.0 - Production

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

接続先: Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - 64bit Production
ORA-39001: 引数値が無効です
ORA-39071: EXCLUDEの値の形式が正しくありません。
ORA-00936: 式がありません。

初めて使うオプションなので、文法間違えたかな?と思い、いろいろ試す。

複数テーブル指定の時は、TABLE句が使えないかもと思ってテーブル指定方法を変えた。

impdp USER_B/PASSWORD_B@SERVICE_B \
dumpfile=DATA_PUMP_DIR:USER_A.dmp \
logfile=DATA_PUMP_DIR:impdp_DATAONLY.log \
remap_schema=USER_A:USER_B \
table_exists_action=truncate \
content=DATA_ONLY \
exclude=TABLE:"IN 'TABLE_A','TABLE_B','TABLE_C'" \
transform=oid:n

でもだめ。

マニュアル見ても、記述方法は問題ないんだが?と思い、実験することしばし。

結局「"」「'」「(」などの文字をエスケープすると、問題なく処理されました。

impdp USER_B/PASSWORD_B@SERVICE_B \
dumpfile=DATA_PUMP_DIR:USER_A.dmp \
logfile=DATA_PUMP_DIR:impdp_DATAONLY.log \
remap_schema=USER_A:USER_B \
table_exists_action=truncate \
content=DATA_ONLY \
exclude=TABLE:\" IN \( \'TABLE_A\',\'TABLE_B\',\'TABLE_C\' \)\" \
transform=oid:n

めでたし、めでたし。

ちょっとだけ、「content=DATA_ONLY」と「table_exists_action」や「transform」句の共存に意味はあるのか?

とも思いましたが、まあ動いたからいいことにしました。実験の時間も、もうないし。

今回はimpdpで使用しましたが、expdpでも使えるオプションなので、

ダンプファイルサイズを小さくしたい場合などに使えるかも。

あと気をつけるべき重要なことが1点。

これ(METADATA_ONLY)で取り込んだテーブルの統計情報はロックされてしまうので、

後ほど、解除を忘れないように。

一括解除のスクリプトもUPしようと思ったが、この件は来週。

|

« 皆既月食、次は「2014年10月8日」 | トップページ | TIPS : Oracleの統計情報ハンドリング関係。 »

パソコン・インターネット」カテゴリの記事

コメント

コメントを書く



(ウェブ上には掲載しません)


コメントは記事投稿者が公開するまで表示されません。



トラックバック

この記事のトラックバックURL:
http://app.cocolog-nifty.com/t/trackback/538346/53515669

この記事へのトラックバック一覧です: TIPS : Oracleのimpdp/expdpで、特定テーブルのみ取込/除外したい場合の対処方法:

« 皆既月食、次は「2014年10月8日」 | トップページ | TIPS : Oracleの統計情報ハンドリング関係。 »