Oracle   expとパラメータファイル
  2024/03/20


expとパラメータファイル

Oracle表のエクスポートには、expコマンドを使います。 ここではパラメータファイルを使った例をメモっておきます。 パラメータファイルは、次のように書きます。

cat > $PARFILE << EOF
userid=dev/password
tables=(ITEMS)
query="where item_number like 'R9%'"
direct=n
buffer=1000000
file=items.dmp
log=items.log
※queryオプションを指定したときには、direct=yは使用できません。
そして、コマンドラインのparfileオプションで上のパラメータファイル名を指定します。
% exp scott/tiger parfile=exp.par


エクスポート時とは別のユーザでインポートする

運用環境のデータをテスト環境で使うためにコピーする場合など、 運用時の表の持ち主とインポート先の表の持ち主の名前が異なる場合があります。 そのときには、次のようにimpのパラメータで fromuserとtouserを使います。

% exp userid=honuser/honpass direct=y tables='(ORDERS)' grants=no \
 buffer=10000000 file=orders.dmp

% imp userid=devuser/devpass file=orders.dmp ignore=y \
  fromuser=honuser touser=devuser tables='(ORDERS)'
エクスポートのgrantsオプションは、表が他ユーザに何かのオブジェクト権限をGRANTしている場合、 それらも含めて保存するオプションで、デフォルトはyesですが、 テスト環境にGRANT相手のユーザが居ない場合、警告が発生します (データはインポートされる)。そのことがあらかじめ分かっている場合には、 grants=noとしておくとよいでしょう。


コマンドラインでqueryを指定する

パラメータファイルを作成せず、コマンドラインでquery=を指定する際にはエスケープが必要です。

% exp userid=honuser/honpass tables='(ORDERS)' grants=no file=orders.dmp \
  query=\" WHERE ORDER_NO \> \'A2000\' \"
エスケープが必要な文字はOS環境によって異なるそうです。私のUNIX環境では上のようになりました。
つまりWHERE句を囲む二重引用符自身と、その中に含まれる一重引用符および不等号文字にはエスケープが必要で、 空白文字には不要でした。


テーブル別にエクスポートする汎用スクリプト

以下のスクリプトを実行すると、引数で指定したテーブルを、 拡張子.dmpをつけてダウンロードし、さらにcompressで圧縮します。

#! /bin/sh
# exptab.sh
ORA_USR=orauser/orapas
BINDIR=${HOME}/bin

if test "x$1" = "x" ; then
  echo "usage: exptab.sh {TABLE_NAME}"
  exit 1
fi
TABLE_NAME=$1
OUTFILE=exp_${TABLE_NAME}.dmp
PARFILE=exp_${TABLE_NAME}.par
cat > $PARFILE << EOF
userid=${ORA_USR}
file=${OUTFILE}
direct=y
tables=(
  ${TABLE_NAME}
)
EOF
$ORACLE_HOME/bin/exp parfile=$PARFILE
compress $OUTFILE
/bin/rm $PARFILE
対になるインポートのスクリプトです。 コマンドライン引数でテーブル名を指定して実行すると、 カレントディレクトリに置かれている「テーブル名.dmp.Z」 を展開し、インポートします。
#! /bin/sh
# imptab.sh
ORA_USR=orauser/orapas

if test "x$1" = "x" ; then
  echo "usage: imptab.sh {TABLE_NAME}"
  exit 1
fi
TABLE_NAME=$1

INFILE=exp_${TABLE_NAME}.dmp
uncompress $INFILE

PARFILE=imp_${TABLE_NAME}.par
cat > $PARFILE << EOF
userid=${ORA_USR}
file=${INFILE}
ignore=y
tables=(
  ${TABLE_NAME}
)
EOF
$ORACLE_HOME/bin/imp parfile=$PARFILE
/bin/rm $PARFILE

  もくじ
Oracle   (C) 2002-2023 MISUMI URANO (2002/11/11 - 2024/03/20)