前回の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