« 道路情報 国道4号線 | トップページ | Microlonて効くのか?? その後1 »

2011年5月 8日 (日)

TIPS : Oracleのimpdpで、remap_schemaとtablesオプションを併用したい場合の対処方法

Oracleを使用していると、データをエクスポート/インポートする機会は結構頻繁にあります。
従来はexp/impコマンドでしたが、現在推奨されているのは、expdp/impdpコマンドです。
使い方や、オプション指定の方法は、
http://download.oracle.com/docs/cd/E16338_01/server.112/b56303/part_dp.htm
あたりを参照いただくとして、オプションの組み合わせではまった(というか気付いた)のでメモ。

「remap_schema」オプションと「tables」オプションが同時に使用できない場合がある

それは以下の条件を満たす場合に起こりました。
・異なるDB_NAME間、かつ、異なるスキーマ間で、expdp/impdpを行う。
・expdpコマンドを「schemas」オプションをつけて使用する。
・impdpコマンドを「remap_schema」オプションと「tables」オプションをつけて使用する。
・expdpを行うデータベース側にあるスキーマが、impdpを行うテータベース側にない。
・impdpを行うデータベース側にあるスキーマに、対象のtablesが存在しない。

実際にやってみると、
【expdp側】
DB_NAME「A」に接続するためのネットサービス名「SERVICE_A」
こちらのデータベースに「USER_A」というユーザが存在する。
以下のコマンドで「USER_A.dmp」を生成する。
このユーザの「TABLE_A」テーブルを持って行きたい。
イメージとしては、スキーマ単位でのバックアップから、
特定のテーブルを調査目的で他のデータベース・ユーザにリストアする感じ。

$ expdp USER_A/PASSWORD_A@SERVICE_A \
> dumpfile=DATA_PUMP_DIR:USER_A.dmp \
> logfile=DATA_PUMP_DIR:expdp_USER_A.log \
> schemas=USER_A

【impdp側】
DB_NAME「B」に接続するためのネットサービス名「SERVICE_B」
こちらのデータベースに「USER_B」というユーザが存在する。
「USER_B」は、「TABLE_A」というテーブルを持たない。
こちらのデータベースに「USER_A」というユーザは存在しない。

$ impdp USER_B/PASSWORD_B@SERVICE_B \
> dumpfile=DATA_PUMP_DIR:USER_A.dmp \
> logfile=DATA_PUMP_DIR:impdp_USER_A.log \
> remap_schema=USER_A:USER_B \
> tables=TABLE_A

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-39002: 操作が無効です
ORA-39166: オブジェクトSCHEMA_B.TABLE_Aが見つかりません。

確かに、「オブジェクトSCHEMA_B.TABLE_Aが見つかりません。」は当たり前。
だから、remap_schema指定でimpdpしたのに・・・
一応念のため、これも試してみよう。

$ impdp USER_A/PASSWORD_A@SERVICE_B \
> dumpfile=DATA_PUMP_DIR:USER_A.dmp \
> logfile=DATA_PUMP_DIR:impdp_USER_A.log \
> remap_schema=USER_A:USER_B \
> tables=TABLE_A

Import: Release 11.2.0.1.0 - Production

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

UDI-01017: 操作でOracleエラー1017が発生しました
ORA-01017: ユーザー名/パスワードが無効です。ログオンは拒否されました。

そりゃそうだ。「SERVICE_B」側には、「USER_A」は存在しない・・・
ということで、苦肉の策。「SERVICE_B」側で、ユーザを作成。

create user USER_A identified by PASSWORD_X;

んでもって、もう一度。
あ、適切に権限は与えてくださいね。
それか、impdpをsystemユーザで行うというのもありかも。

$ impdp USER_A/PASSWORD_X@SERVICE_B \
> dumpfile=DATA_PUMP_DIR:USER_A.dmp \
> logfile=DATA_PUMP_DIR:impdp_USER_A.log \
> remap_schema=USER_A:USER_B \
> tables=TABLE_A

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
【~省略~】
ジョブ"USER_A"."SYS_IMPORT_TABLE_01"が正常に完了しました

うまくいきました。
当然「USER_A」の所有するテーブルは空のままで、「USER_B」側にきちんと復元されました。
「USER_A」は、名前解決?の為に必要とされただけのようです。
パスワードは異なっていてもいいようです。
でも、こんなことしなくても、なんとかならんもんかな。。。

なお、「USER_B」が「TABLE_A」をもっていたらどうなるか、は実験しませんでした。。。

|

« 道路情報 国道4号線 | トップページ | Microlonて効くのか?? その後1 »

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

コメント

コメントを書く



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


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



トラックバック

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

この記事へのトラックバック一覧です: TIPS : Oracleのimpdpで、remap_schemaとtablesオプションを併用したい場合の対処方法:

« 道路情報 国道4号線 | トップページ | Microlonて効くのか?? その後1 »