[Oracle] Recovery Managerを使ったバックアップの基本パターン | Archive Redo Blog

Archive Redo Blog

DBエンジニアのあれこれ備忘録

Recovery Managerを使うとOracleのオンラインバックアップが比較的容易に実行できます。


とはいうものの、このRecovery Managerというのはどうもとっつきにくいものです。


いろいろと機能が多く、何をどうすればいいのか最初はかなり戸惑ってしまいます。

しかし、たかがバックアップです。


毎回毎回、バックアップの実行方法が変わるわけではありません。


定期的に同じオペレーションでバックアップを取得し続けることさえできればいいのです。


1つのバックアップパターンを作ってしまえば、あとはそれを毎日なり毎週なり、定期的に実行するだけです。



データベースの運用環境に応じていろいろなバックアップパターンがあるとは思いますが、ここでは比較的チープなデータベース環境でのバックアップということで、アーカイブ・ログモードで運用しているデータベースをリカバリ・カタログを使用せずに、ディスクに差分増分バックアップを取るパターンをまとめてみました。

1.RMANコマンドファイルの作成
まず手始めにRecovery Managerでバックアップを実行するバックアップコマンドをひとまとめにしたRMANコマンドファイルを作成します。

差分増分バックアップの基本バックアップとなるデータベース全体のバックアップを取得するRMANコマンドファイルは以下のようになります。

rman_backup_level0.cmd
RUN {
crosscheck archivelog all;
backup incremental level = 0 database format 'E:\Oracle\Backup\%d_DBF_%U_%Y%M%D.BAK' 
  plus archivelog format 'E:\Oracle\Backup\%d_ARC_%U_%Y%M%D.BAK' delete all input;
backup current controlfile format 'E:\Oracle\Backup\%d_CTL_%U_%Y%M%D.BAK';
}


各コマンドの内容は以下の通りです。

crosscheck archivelog all

ディスク上のアーカイブ・ログの存在を確認します。

このチェックを行うことにより、OSコマンドでアーカイブ・ログファイルを削除してしまっていてもバックアップが失敗しなくなります。

backup incremental level = ? database ...

データベースのバックアップを取得します。


incremental level = ? では増分バックアップのレベルを指示します。

0と指定するとデータベース全体のバックアップを取得します。

このバックアップはレベル0バックアップと呼ばれ、増分バックアップにおける基本バックアップとなります。


database format '...'を指定するとデータベースのバックアップを取得します。

バックアップファイルはformatで指定した形式で出力されます。


plus archivelog format '...'を指定するとデータベースのバックアップに加えてアーカイブ・ログのバックアップも取得します。

バックアップファイルはformatで指定した形式で出力します。


delete all inputオプションを指定すると、バックアップ済のアーカイブ・ログをディスク上から削除します。

backup current controlfile format '...'

制御ファイルのバックアップを取得します。

バックアップファイルはformatで指定した形式で出力されます。


差分増分バックアップの差分バックアップを取得するRMANコマンドファイルは以下のようになります。

rman_backup_level1.cmd

RUN {
crosscheck archivelog all;
backup incremental level = 1 database format 'E:\Oracle\Backup\%d_DBF_%U_%Y%M%D.BAK' 
  plus archivelog format 'E:\Oracle\Backup\%d_ARC_%U_%Y%M%D.BAK' delete all input;
backup current controlfile format 'E:\Oracle\Backup\%d_CTL_%U_%Y%M%D.BAK';
}

incremental level = 1 とすることによって、最新のレベル1以下のレベルのバックアップ以降の変更のみがバックアップされます。
2.RMANコマンドファイルの実行(バックアップの実行)

RMANコマンドファイルが用意できたら、それを任意のディレクトリに保存し、そのRMANコマンドファイルを指定してRecovery Managerを実行します。


rman target 'SYS/change_on_install AS SYSDBA' 
  cmdfile 'C:\Oracle\admin\ORCL\script\rman_backup_level0.cmd' 
  log 'C:\Oracle\Backup\rman_backup.log'

cmdfile '...' には作成したRMANコマンドファイルを指定します。


log '...' にはRecovery Managerのログを出力するログファイルを指定します。

これでとりあえずはRecovery Managerを利用した手動でのバックアップができるわけですが、バックアップを定期的に自動実行したいのであれば、上記のコマンドを各種ジョブ管理ツールなどでスケジューリングしてやらなければなりません。

3.バックアップジョブのスケジューリング
差分増分バックアップを行う場合は、例えば、日曜日にレベル0のバックアップを実行し、月曜日から土曜日まではレベル1のバックアップを実行するという具合にスケジューリングを行います。

例えば、WindowsのATコマンドの場合、以下のようにしてジョブを登録します。

AT 1:00 /every:月曜日 "rman target 'SYS/change_on_install AS SYSDBA' ..."
AT 1:00 /every:火曜日 "rman target 'SYS/change_on_install AS SYSDBA' ..."
AT 1:00 /every:水曜日 "rman target 'SYS/change_on_install AS SYSDBA' ..."
AT 1:00 /every:木曜日 "rman target 'SYS/change_on_install AS SYSDBA' ..."
AT 1:00 /every:金曜日 "rman target 'SYS/change_on_install AS SYSDBA' ..."
AT 1:00 /every:土曜日 "rman target 'SYS/change_on_install AS SYSDBA' ..."

このようにバックアップの実行コマンドをスケジューリングしておけば、あとは基本的には放っておいても毎日バックアップを取ってくれるくれるということになります。
4.不要になったバックアップファイルの削除

バックアップを取得し続けていると、やがてバックアップファイルでディスクが一杯になってしまいます。


基本的にはデータベース全体のバックアップを取れば、それ以前に取ったバックアップは必要なくなるので、データベース全体のバックアップを取ったタイミングで、古いバックアップファイルを削除してしまいましょう。

バックアップファイルの削除には、以下のようなRMANコマンドファイルを用意します。

rman_backup_delete.cmd

RUN {
crosscheck backup;
delete noprompt obsolete recovery window of 7 days;
}


noprompt を指定するとファイルの削除確認のプロンプトを表示しません。


obsolete recovery window of ? days を指定すると、指定した日数の範囲内の任意の時点までリカバリするために不要なバックアップファイルが削除されます。


とまぁ、ここまでやっておけば、毎日勝手にバックアップを取ってくれて、しかも古いバックアップファイルはどんどん削除してくれます。


大規模なデータベースなどではちょっと工夫しないといけないかもしれませんが、小規模なデータベースや開発・テスト環境であれば、この程度のバックアップで十分でしょう。