seraphyの日記

日記というよりは過去を振り返るときのための単なる備忘録

Oracleをcronで定期的にexpでバックアップする方法

概要

expコマンドをcronで定期的に実行する、というだけの話。
簡単そうに思えるが、意外とハマったのでメモとして残しておく。

crontabへの登録

oracleユーザというものがすでに存在すると仮定して、以下、crontabに登録する内容。
(oracleユーザで登録する。)

SHELL=/bin/bash
MAILTO=""

0 9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,0 * * *       $HOME/bin/backup_app >> $HOME/databackup/backup_app.log  2>&1

起動されるスクリプト

#! /bin/bash

WEEKDAY=$(env LANG=C date '+%a')

export ORACLE_HOME=/opt/oracle/product/10.2.0/db_1
export ORACLE_SID=orcl
export NLS_LANG=.AL32UTF8

BACKFILE=/home/oracle/databackup/app.$WEEKDAY.exp
rm -f $BACKFILE

$ORACLE_HOME/bin/exp system/systemmanager file=$BACKFILE owner=app

本題とはあまり関係ないが、このスクリプトは業務時間内(?)で毎時expをとっている。
開発チームで共有しているデータベースで「うわー、SQL間違えてマスタごっそり消しちまったよ!!」みたいなアホミスの回復を助けられるかも、
という淡い期待を背負ったスクリプトである。(本番運用のスクリプトじゃない。)
なので、毎時とって、ファイルとしては曜日で最大7つのローテートになっている。
厳密なデータ整合性なんかは考えていない。

要点

cronで起動されるスクリプトoracleユーザと同じような環境変数を設定することが必要。
実際には、

の3つがあれば十分っぽい。

まず、SIDは忘れがちだが、当然、必要だよね?

意外なところで、NLS_LANGの指定が必要だった。
これがないと「EXP-00091: Exporting questionable statistics.」なんていう警告が出てくる。
統計情報はエクスポート時のNLS_LANGとデータベースのNLS_LANGが一致していないと駄目らしい。



以上、メモ終了。