【Oracle】RMAN でアーカイブログを自動削除する方法|DELETE ARCHIVELOG・PLUS ARCHIVELOG・FRA 自動管理・ORA-00257 対処まで解説

【Oracle】RMAN でアーカイブログを自動削除する方法|DELETE ARCHIVELOG・PLUS ARCHIVELOG・FRA 自動管理・ORA-00257 対処まで解説 Oracle

ARCHIVELOG モードで運用している Oracle データベースでは、アーカイブログが際限なく蓄積されます。放置するとディスクが満杯になり、ORA-00257 が発生して全 DML が停止します。

本記事では、RMAN でアーカイブログを安全に削除する方法と、BACKUP PLUS ARCHIVELOG DELETE INPUTFRA の自動管理cron による定期自動化ORA-00257 の緊急対処まで解説します。

この記事でわかること
・DELETE ARCHIVELOG の全パターン(ALL / 日数 / バックアップ済み)
・BACKUP PLUS ARCHIVELOG DELETE INPUT でバックアップ後に自動削除
・RETENTION POLICY と DELETE OBSOLETE の連携
・FRA(高速リカバリ領域)の自動管理
・cron / DBMS_SCHEDULER による定期自動化
・ORA-00257 / ORA-19815 の緊急対処手順
スポンサーリンク

アーカイブログの確認

SQL(現在のアーカイブログ状況)
-- アーカイブログの合計サイズ
SELECT COUNT(*) AS file_count,
       ROUND(SUM(blocks * block_size)/1024/1024/1024, 2) AS total_gb
FROM v$archived_log WHERE deleted = 'NO';

-- 直近 10 件の一覧
SELECT * FROM (
    SELECT name, sequence#,
           ROUND(blocks * block_size / 1024 / 1024, 1) AS size_mb,
           first_time
    FROM v$archived_log WHERE deleted = 'NO'
    ORDER BY sequence# DESC
) WHERE ROWNUM <= 10;

DELETE ARCHIVELOG の全パターン

Shell(日数指定で削除: 最も一般的)
rman target /

# 7 日以上前のアーカイブログを削除
RMAN> DELETE NOPROMPT ARCHIVELOG ALL COMPLETED BEFORE 'SYSDATE-7';

# 3 日以上前を削除
RMAN> DELETE NOPROMPT ARCHIVELOG ALL COMPLETED BEFORE 'SYSDATE-3';
Shell(バックアップ済みのみ削除: 最も安全)
# RMAN バックアップに含まれているログだけ削除
RMAN> DELETE NOPROMPT ARCHIVELOG ALL BACKED UP 1 TIMES TO DEVICE TYPE DISK;

# 2 回以上バックアップされたものだけ削除(より安全)
RMAN> DELETE NOPROMPT ARCHIVELOG ALL BACKED UP 2 TIMES TO DEVICE TYPE DISK;
Shell(全アーカイブログを削除: 緊急時のみ)
# 全削除(リカバリ不可になるリスク)
RMAN> DELETE NOPROMPT ARCHIVELOG ALL;
パターン 安全性 用途
BACKED UP N TIMES 最も安全 バックアップ済みのみ削除。リカバリに必要なログを保護
COMPLETED BEFORE SYSDATE-N 最も一般的。N 日分のリカバリ可能期間を確保
ALL 低い 緊急時のディスク解放のみ。リカバリ不可になるリスク
DELETE OBSOLETE 安全 RETENTION POLICY に基づいて不要分を一括削除
BACKED UP 1 TIMES が最も推奨
バックアップに含まれているアーカイブログだけ削除するため、リカバリに必要なログが失われるリスクがありません。

BACKUP PLUS ARCHIVELOG DELETE INPUT

Shell(バックアップ + アーカイブログ自動削除)
# 増分バックアップ + アーカイブログバックアップ + 削除
RMAN> BACKUP INCREMENTAL LEVEL 1 DATABASE
      PLUS ARCHIVELOG DELETE INPUT;

# 動作の流れ:
# (1) アーカイブログをバックアップ
# (2) データベースの増分バックアップを実行
# (3) バックアップ中に生成されたアーカイブログもバックアップ
# (4) バックアップ完了後にアーカイブログを自動削除
PLUS ARCHIVELOG DELETE INPUT が最も実用的
バックアップから削除まで1コマンドで自動化できるため、削除忘れによるディスク枯渇を防げます。日次バックアップスクリプトには常にこのパターンを使いましょう。

RETENTION POLICY と DELETE OBSOLETE

Shell(保持ポリシーの設定と OBSOLETE 削除)
rman target /

# 保持ポリシー: 7 日間のリカバリを保証
RMAN> CONFIGURE RETENTION POLICY TO RECOVERY WINDOW OF 7 DAYS;

# ポリシー外を一括削除
RMAN> DELETE NOPROMPT OBSOLETE;

# 日次バックアップスクリプトの定番パターン
# BACKUP ... PLUS ARCHIVELOG DELETE INPUT;
# DELETE NOPROMPT OBSOLETE;
# CROSSCHECK ARCHIVELOG ALL;

FRA(高速リカバリ領域)の自動管理

SQL(FRA の状態確認)
-- FRA の使用状況
SELECT name,
       ROUND(space_limit/1024/1024/1024, 1) AS limit_gb,
       ROUND(space_used/1024/1024/1024, 1) AS used_gb,
       ROUND(space_reclaimable/1024/1024/1024, 1) AS reclaimable_gb
FROM v$recovery_file_dest;

-- FRA 内のファイル種別ごとの使用状況
SELECT * FROM v$flash_recovery_area_usage;

FRA は空き容量が不足すると、バックアップ済みの古いアーカイブログを自動削除します。ただし FRA サイズが小さすぎると ORA-19815 警告が頻発します。

SQL(FRA サイズの拡大)
-- FRA のサイズを 50GB から 100GB に拡大
ALTER SYSTEM SET db_recovery_file_dest_size = 100G SCOPE=BOTH;

cron による定期自動化

Shell(日次バックアップ + クリーンアップスクリプト)
#!/bin/bash
# daily_backup.sh
export ORACLE_HOME=/oracle/product/19c/dbhome_1
export ORACLE_SID=ORCL

rman target / <<EOF
CROSSCHECK ARCHIVELOG ALL;
BACKUP INCREMENTAL LEVEL 1 DATABASE
    PLUS ARCHIVELOG DELETE INPUT;
DELETE NOPROMPT OBSOLETE;
EOF
Shell(crontab 登録)
# 毎日 2:00 に実行
0 2 * * * /home/oracle/scripts/daily_backup.sh >> /home/oracle/logs/backup.log 2>&1
Shell(バックアップなしのアーカイブログだけ定期削除)
#!/bin/bash
# archivelog_cleanup.sh(6 時間ごとに実行)
rman target / <<EOF
CROSSCHECK ARCHIVELOG ALL;
DELETE NOPROMPT ARCHIVELOG ALL BACKED UP 1 TIMES TO DEVICE TYPE DISK;
EOF

# crontab: 0 */6 * * * /home/oracle/scripts/archivelog_cleanup.sh
CROSSCHECK を忘れない
CROSSCHECK ARCHIVELOG ALL は RMAN カタログとディスクの整合性を確認します。OS コマンドで手動削除した場合、CROSSCHECK なしだとカタログが不整合になります。自動化スクリプトには常に CROSSCHECK を含めてください。

ORA-00257 の緊急対処

ORA-00257: archiver error. Connect internal only, until freed. はアーカイブログの書き込み先ディスクが満杯のときに発生します。全 DML が停止する緊急事態です。

Shell(緊急対処手順)
# (1) SYSDBA で接続
sqlplus / as sysdba

# (2) RMAN でアーカイブログを緊急削除
rman target /
RMAN> DELETE NOPROMPT ARCHIVELOG ALL COMPLETED BEFORE 'SYSDATE-1';

# (3) FRA の場合はサイズを拡大
SQL> ALTER SYSTEM SET db_recovery_file_dest_size = 50G SCOPE=BOTH;

# (4) アーカイバーを再開
SQL> ALTER SYSTEM ARCHIVE LOG START;
Shell(OS コマンドで緊急削除: 最終手段)
# RMAN で削除できないほど逼迫している場合
find /oracle/archive -name '*.arc' -mtime +7 -delete

# OS 削除後は必ず RMAN で整合性を戻す
rman target /
RMAN> CROSSCHECK ARCHIVELOG ALL;
RMAN> DELETE NOPROMPT EXPIRED ARCHIVELOG ALL;
OS の rm / find での直接削除は最終手段
OS で直接削除すると RMAN カタログと不整合になります。削除後に必ず CROSSCHECK + DELETE EXPIRED で同期してください。通常は RMAN の DELETE コマンドを使うのが正しい手順です。

肥大化の予防策

予防策 設定
日次バックアップで自動削除 BACKUP … PLUS ARCHIVELOG DELETE INPUT
RETENTION POLICY + DELETE OBSOLETE CONFIGURE RETENTION POLICY + DELETE NOPROMPT OBSOLETE
FRA の十分なサイズ db_recovery_file_dest_size を適切に設定
cron で定期クリーンアップ CROSSCHECK + DELETE BACKED UP 1 TIMES
FRA 使用率の監視 v$recovery_file_dest の space_used を監視

よくある質問

Qアーカイブログを全部削除してもリカバリできますか?
A最新のフルバックアップ以降のアーカイブログを削除すると、そのバックアップ以降の変更をリカバリできなくなります。DELETE ALL は緊急時の最終手段です。通常は BACKED UP 1 TIMES が安全です。
QPLUS ARCHIVELOG DELETE INPUT と DELETE ALL の違いは?
APLUS ARCHIVELOG DELETE INPUT はバックアップしてから削除するため安全です。DELETE ALL はバックアップの有無に関係なく全削除するため危険です。日常運用では PLUS ARCHIVELOG DELETE INPUT を推奨します。
QOS の find コマンドで削除しても大丈夫ですか?
ARMAN カタログと不整合が生じるため推奨しません。OS で削除した場合は必ず CROSSCHECK + DELETE EXPIRED でカタログを同期してください。通常は RMAN の DELETE を使うのが正しい手順です。
QFRA を使っていれば手動削除は不要ですか?
AFRA は空き容量不足時に古いファイルを自動削除しますが、FRA サイズが小さいと ORA-19815 警告が頻発します。FRA を使っていても日次バックアップで PLUS ARCHIVELOG DELETE INPUT を実行するのが安全です。
QDELETE NOPROMPT の NOPROMPT とは?
ANOPROMPT は確認プロンプトを表示せずに即実行するオプションです。スクリプトで自動実行する場合は NOPROMPT が必須です。手動実行時は NOPROMPT を外して確認してから削除することを推奨します。
QNOARCHIVELOG モードならこの問題は起きませんか?
Aはい。NOARCHIVELOG ではアーカイブログが生成されません。ただしメディアリカバリができないため、本番環境では ARCHIVELOG モードが必須です。

まとめ

アーカイブログ管理の要点をまとめます。

やりたいこと コマンド
バックアップ済みログだけ削除(最も安全) DELETE NOPROMPT ARCHIVELOG ALL BACKED UP 1 TIMES TO DEVICE TYPE DISK
N 日以前のログを削除 DELETE NOPROMPT ARCHIVELOG ALL COMPLETED BEFORE ‘SYSDATE-N’
バックアップ + 自動削除(日次の定番) BACKUP … PLUS ARCHIVELOG DELETE INPUT
保持ポリシー外を一括削除 DELETE NOPROMPT OBSOLETE
カタログ整合性の確認 CROSSCHECK ARCHIVELOG ALL
OS 削除後のカタログ同期 CROSSCHECK ARCHIVELOG ALL; DELETE NOPROMPT EXPIRED ARCHIVELOG ALL
FRA サイズの拡大 ALTER SYSTEM SET db_recovery_file_dest_size = 100G SCOPE=BOTH

増分バックアップは「RMAN 増分バックアップ完全ガイド」、バックアップの自動化は「RMAN バックアップを自動化する方法」、制御ファイルのバックアップは「制御ファイルと SPFILE のバックアップ・復元」も併せて参照してください。