前回のSUZ-LAB AMI(CentOS 5.6)にOracle Clientをインストールで、expコマンドが利用出来るEC2インスタンスが準備できたので、Oracle RDSをエクスポートしてみたいと思います。

その前に、oracleユーザーの.bash_profileは下記のようにしておきます。

...
ORACLE_HOME=/opt/oracle/product/11.2
NLS_LANG=JAPANESE_JAPAN.AL32UTF8
PATH=$PATH:$ORACLE_HOME/bin:$HOME/bin
export ORACLE_HOME NLS_LANG PATH

そして、実際にoracleユーザーでエクスポートしてみます。

$ exp user/pass@suzlab.xxxxxxxx.ap-northeast-1.rds.amazonaws.com:1521/suzlab owner=user

Export: Release 11.2.0.1.0 - Production on 金 7月 1 13:26:57 2011

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


接続先: Oracle Database 11g Release 11.2.0.2.0 - 64bit Production
AL32UTF8キャラクタ・セットおよびAL16UTF16 NCHARキャラクタ・セットでエクスポートを実行します

指定されたユーザーをエクスポートします...
. プリスキーマ・プロシージャ型オブジェクトとアクションをエクスポート中
. ユーザーSUZUKIの外部関数ライブラリ名をエクスポート中
. PUBLICタイプのシノニムをエクスポート中
. プライベート・タイプのシノニムをエクスポート中
. ユーザーSUZUKIのオブジェクト型定義をエクスポート中
SUZUKIのオブジェクトをエクスポートします...
. データベース・リンクをエクスポート中
. 順序番号をエクスポート中
. クラスタ定義をエクスポート中
. SUZUKIの表をエクスポートします... 従来型パス経由...
. シノニムをエクスポート中
. ビューをエクスポート中
. ストアド・プロシージャをエクスポート中
. 演算子をエクスポート中
. 参照整合性制約をエクスポート中
. トリガーをエクスポート中
. 索引タイプをエクスポート中
. ビットマップ、ファンクションおよび拡張可能索引をエクスポート中
. ポスト可能なアクションをエクスポート中
. マテリアライズド・ビューをエクスポート中
. スナップショット・ログをエクスポート中
. ジョブ・キューをエクスポート中
. リフレッシュ・グループと子をエクスポート中
. ディメンションをエクスポート中
. ポストスキーマ・プロシージャ型オブジェクトとアクションをエクスポート中
. 統計をエクスポート中
エクスポートは警告なしで正常終了しました。

ついでに日時のファイル名でエクスポートし、s3fsなどでマウントしたバックアップ領域に、ダンプファイルをコピーするスクリプトも作成しました。
(引数に残す世代も指定できます)

#!/bin/sh

# RDSの接続先情報
RDS=user/pass@suzlab.xxxxxxxxxxxx.ap-northeast-1.rds.amazonaws.com:1521/suzlab
# エクスポート対象オーナー
OWNER=user
# 一時出力ディレクトリ
BASE_TMP=/tmp/oracle/tmp
# ("s3fs"でマウントした)出力ディレクトリ
BASE_S3=/tmp/oracle/s3

# Oracle系環境変数
ORACLE_HOME=/opt/oracle/product/11.2
NLS_LANG=JAPANESE_JAPAN.AL32UTF8
PATH=$PATH:$ORACLE_HOME/bin:$HOME/bin
export ORACLE_HOME NLS_LANG PATH

# 変数定義
GENERATION=$1
TIMESTAMP=`date +"%Y%m%d%H%M%S"`
FILE_TMP=$BASE_TMP/$TIMESTAMP.dmp
LOG_TMP=$BASE_TMP/$TIMESTAMP.log
FILE_S3=$BASE_S3/$TIMESTAMP.dmp
LOG_S3=$BASE_S3/$TIMESTAMP.log

# エクスポート
exp $RDS owner=$OWNER file=$FILE_TMP log=$LOG_TMP
# ダンプファイルを一時出力先から移動
mv $FILE_TMP $FILE_S3
# ログファイルを一時出力先から移動
mv $LOG_TMP $LOG_S3

# 引数(世代)が指定されていたら実行
if [ $# -eq 1 ]; then

    # ダンプファイルの削除(世代を残して)
    COUNT_LOG=`ls -1 $BASE_S3/*.log | wc -l`
    COUNT_LOG_DELETE=`expr $COUNT_LOG - $GENERATION`
    if [ $COUNT_LOG_DELETE -ge 0 ]; then
        ls -1 $BASE_S3/*.log | sort -r | tail -$COUNT_LOG_DELETE | xargs rm -f
    fi

    # ログファイルの削除(世代を残して)
    COUNT_FILE=`ls -1 $BASE_S3/*.dmp | wc -l`
    COUNT_FILE_DELETE=`expr $COUNT_FILE - $GENERATION`
    if [ $COUNT_FILE_DELETE -ge 0 ]; then
        ls -1 $BASE_S3/*.dmp | sort -r | tail -$COUNT_FILE_DELETE | xargs rm -f
    fi

fi

ダンプファイルを3世代残す場合は、下記のように実行することができ、スクリプト上で定義している出力フォルダ(/tmp/oracle/s3/)に、3世代残っていることが確認できると思います。

$ ./oracle-export.sh 3
...
$ ls -1 /tmp/oracle/s3/
20110630192144.dmp
20110630192144.log
20110701140804.dmp
20110701140804.log
20110701140810.dmp
20110701140810.log

こちらの記事はなかの人(suz-lab)監修のもと掲載しています。
元記事は、こちら