RMANでアーカイブファイルを削除するコマンドとシェルスクリプト

RMANでアーカイブファイルを削除する手順
アーカイブファイルはRMANコマンドで削除する方がいいです。OSコマンドで削除すると制御ファイル内の情報と実在するアーカイブファイルの総合性がとれなくなり、crosscheckなどの追加作業が必要になります。
ここでは、RMANコマンドで以下の削除パターンを検証しました。
- 日数指定削除
- シーケンス指定削除
- シーケンスとスレッド指定削除
- 「YES/NO」応答を求めない削除
- 全削除
また、アーカイブ削除コマンドをスクリプトで実行する2つの方法もお伝えします。
- RMANコマンドファイルをRMANコマンドに読ませて削除する方法
- RMANコマンドをシェルスクリプトに記述して削除する方法
それでは、アーカイブファイルを削除するRMANコマンドの使い方からいきます。
RMANコマンド
まずはRMANコマンドでアーカイブファイルを削除するパターンを検証します。oracleユーザーでRMANコマンドラインを起動します。
[oracle@server01:/home/oracle] rman target / Recovery Manager: Release 11.2.0.4.0 - Production on 水 11月 13 13:58:06 2013 Copyright (c) 1982, 2011, Oracle and/or its affiliates. All rights reserved. ターゲット・データベース: DB01 (データベースID=1931198081)に接続されました RMAN>
日数指定削除
日数指定のアーカイブファイルを削除します。削除対象のアーカイブファイルは、日数 * 24時間 以前のアーカイブファイルになります。
RMAN> delete archivelog until time ‘sysdate-日数’;
5日以前のアーカイブファイルは存在しないのですが、5日以前で指定するとこのようになります。
RMAN> delete archivelog until time 'sysdate-5'; チャネル: ORA_DISK_1がリリースされました チャネル: ORA_DISK_1が割り当てられました チャネルORA_DISK_1: SID=593 インスタンス=db011 デバイス・タイプ=DISK 指定がリポジトリ内のどのアーカイブ・ログとも一致しません RMAN>
では、アーカイブファイルが存在する4日以前の削除を行います。
RMAN> delete archivelog until time 'sysdate-4';
チャネル: ORA_DISK_1がリリースされました
チャネル: ORA_DISK_1が割り当てられました
チャネルORA_DISK_1: SID=593 インスタンス=db011 デバイス・タイプ=DISK
データベースdb_unique_name DB01のアーカイブ・ログ・コピーのリスト
=====================================================================
Key Thrd Seq S Low時間
------- ---- ------- - --------
805 1 296 A 13-11-08
名前: +DATA/db01/archive2/1_296_829070404.dbf
809 1 297 A 13-11-08
名前: +DATA/db01/archive2/1_297_829070404.dbf
810 1 298 A 13-11-08
名前: +DATA/db01/archive1/1_298_829070404.dbf
(途中省略)
1010 2 148 A 13-11-09
名前: +DATA/db01/archive1/2_148_829070404.dbf
1011 2 148 A 13-11-09
名前: +DATA/db01/archive2/2_148_829070404.dbf
このオブジェクトを削除しますか(YESまたはNOを入力してください)。
削除対象のアーカイブファイルがリストされ、削除するかの応答を求められます。「YES」を入力して削除します。
このオブジェクトを削除しますか(YESまたはNOを入力してください)。 YES アーカイブ・ログを削除しました アーカイブ・ログ・ファイル名=+DATA/db01/archive2/1_296_829070404.dbf レコードID=805 スタンプ=830980199 アーカイブ・ログを削除しました アーカイブ・ログ・ファイル名=+DATA/db01/archive2/1_297_829070404.dbf レコードID=809 スタンプ=830980208 (途中省略) アーカイブ・ログを削除しました アーカイブ・ログ・ファイル名=+DATA/db01/archive1/2_148_829070404.dbf レコードID=1010 スタンプ=831298298 アーカイブ・ログを削除しました アーカイブ・ログ・ファイル名=+DATA/db01/archive2/2_148_829070404.dbf レコードID=1011 スタンプ=831298298 201オブジェクトを削除しました RMAN>
シーケンスを指定した削除
次に、シーケンス番号を指定した削除です。指定したシーケンス番号より以前のアーカイブファイルが削除されます。
RMAN> delete archivelog until sequence シーケンス番号;
シーケンス番号「375」を指定して削除します。
RMAN> delete archivelog until sequence 375;
チャネル: ORA_DISK_1がリリースされました
チャネル: ORA_DISK_1が割り当てられました
チャネルORA_DISK_1: SID=593 インスタンス=db011 デバイス・タイプ=DISK
データベースdb_unique_name DB01のアーカイブ・ログ・コピーのリスト
=====================================================================
Key Thrd Seq S Low時間
------- ---- ------- - --------
1008 1 373 A 13-11-11
名前: +DATA/db01/archive1/1_373_829070404.dbf
1009 1 373 A 13-11-11
名前: +DATA/db01/archive2/1_373_829070404.dbf
1014 1 374 A 13-11-12
名前: +DATA/db01/archive1/1_374_829070404.dbf
1015 1 374 A 13-11-12
名前: +DATA/db01/archive2/1_374_829070404.dbf
1016 1 375 A 13-11-12
名前: +DATA/db01/archive1/1_375_829070404.dbf
1017 1 375 A 13-11-12
名前: +DATA/db01/archive2/1_375_829070404.dbf
このオブジェクトを削除しますか(YESまたはNOを入力してください)。
シーケンス番号375を含むそれ以前のファイルが削除対象としてリストされました。削除の応答を求められるので「YES」で削除します。
このオブジェクトを削除しますか(YESまたはNOを入力してください)。 YES アーカイブ・ログを削除しました アーカイブ・ログ・ファイル名=+DATA/db01/archive1/1_373_829070404.dbf レコードID=1008 スタンプ=831298296 アーカイブ・ログを削除しました アーカイブ・ログ・ファイル名=+DATA/db01/archive2/1_373_829070404.dbf レコードID=1009 スタンプ=831298296 アーカイブ・ログを削除しました アーカイブ・ログ・ファイル名=+DATA/db01/archive1/1_374_829070404.dbf レコードID=1014 スタンプ=831317614 アーカイブ・ログを削除しました アーカイブ・ログ・ファイル名=+DATA/db01/archive2/1_374_829070404.dbf レコードID=1015 スタンプ=831317614 アーカイブ・ログを削除しました アーカイブ・ログ・ファイル名=+DATA/db01/archive1/1_375_829070404.dbf レコードID=1016 スタンプ=831233237 アーカイブ・ログを削除しました アーカイブ・ログ・ファイル名=+DATA/db01/archive2/1_375_829070404.dbf レコードID=1017 スタンプ=831233237 6オブジェクトを削除しました RMAN>
シーケンス番号とスレッド番号を指定した削除
指定したスレッド番号のアーカイブファイルで、指定したシーケンス番号以前のアーカイブファイルを削除します。
RMAN> delete archivelog until sequence シーケンス番号 thread スレッド番号;
シーケンス番号「150」、スレッド番号「2」を指定して削除します。
RMAN> delete archivelog until sequence 150 thread 2;
チャネル: ORA_DISK_1がリリースされました
チャネル: ORA_DISK_1が割り当てられました
チャネルORA_DISK_1: SID=593 インスタンス=db011 デバイス・タイプ=DISK
データベースdb_unique_name DB01のアーカイブ・ログ・コピーのリスト
=====================================================================
Key Thrd Seq S Low時間
------- ---- ------- - --------
1012 2 149 A 13-11-12
名前: +DATA/db01/archive1/2_149_829070404.dbf
1013 2 149 A 13-11-12
名前: +DATA/db01/archive2/2_149_829070404.dbf
1018 2 150 A 13-11-12
名前: +DATA/db01/archive1/2_150_829070404.dbf
1019 2 150 A 13-11-12
名前: +DATA/db01/archive2/2_150_829070404.dbf
このオブジェクトを削除しますか(YESまたはNOを入力してください)。
スレッド番号が「2」で、シーケンス番号「150」を含むそれ以前のアーカイブファイルが削除対象としてリストされました。削除の応答を求められるので「YES」で削除します。
このオブジェクトを削除しますか(YESまたはNOを入力してください)。 YES アーカイブ・ログを削除しました アーカイブ・ログ・ファイル名=+DATA/db01/archive1/2_149_829070404.dbf レコードID=1012 スタンプ=831317613 アーカイブ・ログを削除しました アーカイブ・ログ・ファイル名=+DATA/db01/archive2/2_149_829070404.dbf レコードID=1013 スタンプ=831317613 アーカイブ・ログを削除しました アーカイブ・ログ・ファイル名=+DATA/db01/archive1/2_150_829070404.dbf レコードID=1018 スタンプ=831233265 アーカイブ・ログを削除しました アーカイブ・ログ・ファイル名=+DATA/db01/archive2/2_150_829070404.dbf レコードID=1019 スタンプ=831233265 4オブジェクトを削除しました RMAN>
削除応答を求めない削除
deleteコマンドを実行すると、対象アーカイブファイルの削除について「YES/NO」の応答を求められてましたが、「NOPROMPT」でこの応答を省略した削除も可能です。
RMAN> delete noprompt archivelog ~
それでは NOPROMPT で削除してみます。
RMAN> delete noprompt archivelog until sequence 372 thread 1;
チャネル: ORA_DISK_1がリリースされました
チャネル: ORA_DISK_1が割り当てられました
チャネルORA_DISK_1: SID=593 インスタンス=db011 デバイス・タイプ=DISK
データベースdb_unique_name DB01のアーカイブ・ログ・コピーのリスト
=====================================================================
Key Thrd Seq S Low時間
------- ---- ------- - --------
1007 1 372 A 13-11-09
名前: +DATA/db01/archive2/1_372_829070404.dbf
1006 1 372 A 13-11-09
名前: +DATA/db01/archive1/1_372_829070404.dbf
アーカイブ・ログを削除しました
アーカイブ・ログ・ファイル名=+DATA/db01/archive2/1_372_829070404.dbf レコードID=1007 スタンプ=831179930
アーカイブ・ログを削除しました
アーカイブ・ログ・ファイル名=+DATA/db01/archive1/1_372_829070404.dbf レコードID=1006 スタンプ=831179930
2オブジェクトを削除しました
RMAN>
応答を求められずに削除されました。
全アーカイブファイル削除
全てのアーカイブファイルを削除するコマンドはこうです。
RMAN> delete archivelog all;
スクリプトにして削除する方法
RMANコマンドをスクリプトに記述してバッチ形式で削除することができます。パターンとしては2つあります。
- RMANコマンドを記述したファイルを作成し、RMANコマンドで削除する方法
- シェルスクリプトにRMANコマンドを記述して削除する方法
この2つの方法をそれぞれ試してみます。
RMANコマンドファイルを作成してRMANコマンドで削除
RMANコマンドを記述したファイル「del_archive.rman」を作成します。RUN{ } の中にRMANコマンドを記述します。
$ cat del_archive.rman
RUN
{
delete archivelog until sequence 377;
}
$
RMANコマンドにこのファイルを読み込ませて、アーカイブファイルを削除します。ファイル名は「@」の後に指定します。
[oracle@server01:/home/oracle] rman target / @del_archive.rman
Recovery Manager: Release 11.2.0.4.0 - Production on 水 11月 13 14:30:43 2013
Copyright (c) 1982, 2011, Oracle and/or its affiliates. All rights reserved.
ターゲット・データベース: DB01 (データベースID=1931198081)に接続されました
RMAN> RUN
2> {
3> delete archivelog until sequence 377;
4> }
5>
リカバリ・カタログのかわりにターゲット・データベース制御ファイルを使用しています
チャネル: ORA_DISK_1が割り当てられました
チャネルORA_DISK_1: SID=102 インスタンス=db011 デバイス・タイプ=DISK
アーカイブ・ログを削除しました
アーカイブ・ログ・ファイル名=+DATA/db01/archive1/1_376_829070404.dbf レコードID=1022 スタンプ=831236030
アーカイブ・ログを削除しました
アーカイブ・ログ・ファイル名=+DATA/db01/archive2/1_376_829070404.dbf レコードID=1023 スタンプ=831236030
アーカイブ・ログを削除しました
アーカイブ・ログ・ファイル名=+DATA/db01/archive1/1_377_829070404.dbf レコードID=1024 スタンプ=831236004
アーカイブ・ログを削除しました
アーカイブ・ログ・ファイル名=+DATA/db01/archive2/1_377_829070404.dbf レコードID=1025 スタンプ=831236004
4オブジェクトを削除しました
Recovery Managerが完了しました。
[oracle@server01:/home/oracle]
削除の応答を求められずに削除できました。
シェルスクリプトにRMANコマンドを記述して削除
RMANコマンドを記述したシェル「rman_del_archive.sh」を以下の内容で作成します。
$ cat rman_del_archive.sh rman target / << EOF delete archivelog until sequence 379; EOF $
RMANコマンドに、「EOF」までに記述されたRMANコマンドを実行する書き方です。
ちなみに、このシェルは削除に失敗します。
[oracle@server01:/home/oracle] rman_del_archive.sh
Recovery Manager: Release 11.2.0.4.0 - Production on 水 11月 13 14:35:01 2013
Copyright (c) 1982, 2011, Oracle and/or its affiliates. All rights reserved.
ターゲット・データベース: DB01 (データベースID=1931198081)に接続されました
RMAN>
リカバリ・カタログのかわりにターゲット・データベース制御ファイルを使用しています
チャネル: ORA_DISK_1が割り当てられました
チャネルORA_DISK_1: SID=102 インスタンス=db011 デバイス・タイプ=DISK
データベースdb_unique_name DB01のアーカイブ・ログ・コピーのリスト
=====================================================================
Key Thrd Seq S Low時間
------- ---- ------- - --------
1026 1 378 A 13-11-11
名前: +DATA/db01/archive1/1_378_829070404.dbf
1027 1 378 A 13-11-11
名前: +DATA/db01/archive2/1_378_829070404.dbf
1028 1 379 A 13-11-12
名前: +DATA/db01/archive1/1_379_829070404.dbf
1029 1 379 A 13-11-12
名前: +DATA/db01/archive2/1_379_829070404.dbf
このオブジェクトを削除しますか(YESまたはNOを入力してください)。
レスポンス取得中にエラーが発生しました - レスポンスなしとします
RMAN>
Recovery Managerが完了しました。
[oracle@server01:/home/oracle]
削除の応答「YES/NO」がなかった為に失敗していることがわかります。削除応答を省略するために、シェル内のRMANコマンドに NOPROMPT を追加します。
$ cat rman_del_archive.sh rman target / << EOF delete noprompt archivelog until sequence 379; EOF $
それではシェルをリランします。
[oracle@server01:/home/oracle] rman_del_archive.sh
Recovery Manager: Release 11.2.0.4.0 - Production on 水 11月 13 14:37:08 2013
Copyright (c) 1982, 2011, Oracle and/or its affiliates. All rights reserved.
ターゲット・データベース: DB01 (データベースID=1931198081)に接続されました
RMAN>
リカバリ・カタログのかわりにターゲット・データベース制御ファイルを使用しています
チャネル: ORA_DISK_1が割り当てられました
チャネルORA_DISK_1: SID=6 インスタンス=db011 デバイス・タイプ=DISK
データベースdb_unique_name DB01のアーカイブ・ログ・コピーのリスト
=====================================================================
Key Thrd Seq S Low時間
------- ---- ------- - --------
1026 1 378 A 13-11-11
名前: +DATA/db01/archive1/1_378_829070404.dbf
1027 1 378 A 13-11-11
名前: +DATA/db01/archive2/1_378_829070404.dbf
1028 1 379 A 13-11-12
名前: +DATA/db01/archive1/1_379_829070404.dbf
1029 1 379 A 13-11-12
名前: +DATA/db01/archive2/1_379_829070404.dbf
アーカイブ・ログを削除しました
アーカイブ・ログ・ファイル名=+DATA/db01/archive1/1_378_829070404.dbf レコードID=1026 スタンプ=831315792
アーカイブ・ログを削除しました
アーカイブ・ログ・ファイル名=+DATA/db01/archive2/1_378_829070404.dbf レコードID=1027 スタンプ=831315792
アーカイブ・ログを削除しました
アーカイブ・ログ・ファイル名=+DATA/db01/archive1/1_379_829070404.dbf レコードID=1028 スタンプ=831315793
アーカイブ・ログを削除しました
アーカイブ・ログ・ファイル名=+DATA/db01/archive2/1_379_829070404.dbf レコードID=1029 スタンプ=831315793
4オブジェクトを削除しました
RMAN>
今度は削除することができました。
RMANコマンドファイルを読ませる場合は、削除応答がなく、
シェル内にRMANコマンドを記述する場合は、削除応答があるので NOPROMPT が必要、
ということが分かりました。

