シェルスクリプト:oracleのバックアップスクリプト「GNU oraback.sh」の使用

はじめに

このエントリに書かれているスクリプト安易に使用するのはとても危険です
(指定の仕方によっては、いきなりoracleをシャットダウンしようとします)
スクリプト内容をよく理解し、テスト環境で十分試験を実施し、その上で使用すべきです。

このエントリの内容が正確である保証はありません。
スクリプトの使用も、その過程で起こったことやその結末も、全て使用者の自己責任でお願いします。

oraback.shについて

OSコマンドでoracleのデータファイルをコピーしてバックアップするシェルスクリプト
ホットバックアップ、コールドバックアップの両方に対応。
複数ファイルを同時にコピーすることにより、処理速度を上げる機能も持つ(バグッてたけど)。

使おうと思った主な理由。

  • ツールとか使わずに
  • oracleのことがそれなりにわかるようになれる
  • きちんとリカバーできるものが採取できる

入手先→ http://examples.oreilly.com/9781565926424/
※「A hot backup script for Oracle: oraback.sh」から落とせます

おおよその動き

・環境のチェックと動作の決定

  • oracleアーカイブログモードで運用されているか?
  • いま稼働中か?
  • 定義ファイルにコールドバックアップが指定されており、それをする日時か?

とかをチェックしてホットバックアップかコールドバックアップかを決めている。
※このスクリプトは、単体でホットバックアップとコールドバックアップの両方に対応している

V$表dba_tablespaces,dba_data_filesから、バックアップ対象となるテーブルスペースとそれに含まれるデータファイルの一覧をテンポラリファイルに作成

・ホットバックアップの場合

  1. テーブルスペースをバックアップモードに変更する
  2. データファイルを順次退避先へコピーしていく
  3. 処理中のテーブルスペースの全てのデータファイルの退避が終了したら、バックアップモードを解除する

これをテーブルスペースの数だけ行う

・コールドバックアップの場合 ※使わないからちゃんとコード読んでない。なのでざっくりと。

  1. DBをシャットダウンする(immediateだったような気がする)
  2. データファイルをガシガシとコピー
  3. DBをオープン(してくれるのか?)

redoファイル、アーカイブログファイル、制御ファイル、TNSネーミングファイル、初期化ファイル、などのコピーを取る

・メールを投げて終了

その他の仕様

自分で設定したログ保存先にログを掃く。
自分で設定したテンポラリファイルの出力先に プロセスID.いろんな名前 の作業ファイル(?)を掃く。
※この作業ファイルは、削除する部分がコメント化されているため、そのままでは消されない(小さいけど)
指定によって、バックアップされるファイルは compress や gzip で圧縮される。
※圧縮はファイル単位。対象ファイルがアーカイブされるわけではない。
ホットバックアップの際、テーブルスペースがバックアップモードに移行したかチェックしているようだが、バックアップモードへ移行していなくてもバックアップ作業自体は続行されるように見える(自信なし)。

構成ファイル

ファイル 用途 ユーザ環境に合わせた修正
config.guess 実行システムを返す 不要
localpath.sh 環境固有のコマンドパスを返す 不要
oraback.conf 定義ファイル
oraback.sh スクリプト本体
rempath.sh 環境固有のコマンドパスを返す 不要
oraback.html ドキュメント 不要

修正点

・oraback.sh
最初の方にある環境変数を、自分の環境に合わせて修正する。
ウチでは、なぜか結構奥の方の「ORACLE_BASE」もデフォと違っていた。
ALERTログの場所を示す「ALERT=〜〜」が正しくセットされていないと、バックアップモードに移行できませんでした的な心臓に悪いメッセージを大量に掃いてメールで送ってくるので、ここは注目しておいた方がよい。

・oraback.conf
1行に「:」つなぎで設定を書く。
メインになる「<ホスト名>.master:ほにゃらら〜」が1行と、もう1行、設定行を書く。
書式と内容は定義ファイルのコメントに書いてある。

2010.03.15 追記:
iFileを使用していない構成の場合は、最初の方の「IFILE=<iFileのパス>」の行をコメント化すると、エラーを掃かなくなる。

起動方法

二通りある。
・ダイレクトにバックアップを走らせる方法

./oraback.sh ORALCEのSID

そのSIDをターゲットとしてバックアップが行われる。

・タイマーをセットするだけ

./oraback.sh at

oraback.confの定義内容に従って、atコマンドを利用してスケジュール設定する。
なんか、こなれてない利用方法だと思うし、atはcronに統合されるべきってどこかに書いてあったような気がするので、ウチでは使っていない。

そんなわけで、SIDを引数で渡す方法で週一回ホットバックアップを取るようセットして利用。

運用上の問題

週一回のホットバックアップ+適当な間隔でアーカイブログファイルを取得する運用を想定していたが、このスクリプトはホットバックアップが常に走ってしまう。
ホットバックアップも完全にセーフティな方法ではないので(バックアップモード中に大量の更新があった場合)、毎日は現実的ではない。
ところが、それでは、この方法の生命線の1つであるアーカイブログファイルのバックアップが取れないことになる。
そもそもアーカイブログファイルの取得に否定的なコメントがコード中に書いてあったりして、その辺だけイマイチ充実してない気がする。
実際、このスクリプトで取得されるアーカイブログファイルは(あくまで自分的に)使えないと判断した。

その解決方法として、アーカイブログだけを全然別にバックアップするスクリプトを作成し、別途cronにセットした。
ついでといっては何だけど、バックアップを世代で保存しておくスクリプトも作成し、oraback.sh から呼ぶようにした。

既知のバグ

(最新のバージョン?はどうか不明だが)拾ったスクリプトにはバグがあった。
もともと、このスクリプトには、ファイルコピーを同時並行で行って、特定の環境下で処理を高速化できる機構を内包している(利用はconfigファイルで指定する)。
だが、その機能を使おうとすると、ファイルコピーが一向に終わらない事態に陥る。

この機能を利用していないので試してはいないが、下記サイトに解決方法らしき記述があった。

How to fix it

The fix is short and sweet!
LINE 276 (touch $TMP/$X.$ORACLE_SID.$TBS.files.$DBF_BASENAME) should be move to just prior to LINE 205 just before the Copy_one_database_file &.

By creating the 'begin copy' file prior to spawning the copy process (and without the ampersand on the touch command) we are guaranteed the script won't proceed untill the create file command is complete.

このスクリプトで取得したバックアップからリカバリする方法

また別の機会に書く予定。

おやくそく

この手のスクリプトをいきなり本番で実行するのはご法度。
テスト環境を用意して十分にテストするのが前提。
その前に、スクリプトをよく理解することも重要。
さらにその前に、oracleのバックアップについて、まずは学ぶべし。

参考リンク

バックアップとリカバリの基礎を学ぶにあたり、@ITのDatabase Expert「Oracleバックアップ/リカバリ講座(連載もの)」が大変役に立ちました。
※持っているなら、純正マニュアルも読むべし