ARCHIVELOG モードで運用している Oracle データベースでは、アーカイブログが際限なく蓄積されます。放置するとディスクが満杯になり、ORA-00257 が発生して全 DML が停止します。
本記事では、RMAN でアーカイブログを安全に削除する方法と、BACKUP PLUS ARCHIVELOG DELETE INPUT、FRA の自動管理、cron による定期自動化、ORA-00257 の緊急対処まで解説します。
・DELETE ARCHIVELOG の全パターン(ALL / 日数 / バックアップ済み)
・BACKUP PLUS ARCHIVELOG DELETE INPUT でバックアップ後に自動削除
・RETENTION POLICY と DELETE OBSOLETE の連携
・FRA(高速リカバリ領域)の自動管理
・cron / DBMS_SCHEDULER による定期自動化
・ORA-00257 / ORA-19815 の緊急対処手順
アーカイブログの確認
-- アーカイブログの合計サイズ
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 の全パターン
rman target / # 7 日以上前のアーカイブログを削除 RMAN> DELETE NOPROMPT ARCHIVELOG ALL COMPLETED BEFORE 'SYSDATE-7'; # 3 日以上前を削除 RMAN> DELETE NOPROMPT ARCHIVELOG ALL COMPLETED BEFORE 'SYSDATE-3';
# 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;
# 全削除(リカバリ不可になるリスク) RMAN> DELETE NOPROMPT ARCHIVELOG ALL;
| パターン | 安全性 | 用途 |
|---|---|---|
| BACKED UP N TIMES | 最も安全 | バックアップ済みのみ削除。リカバリに必要なログを保護 |
| COMPLETED BEFORE SYSDATE-N | 中 | 最も一般的。N 日分のリカバリ可能期間を確保 |
| ALL | 低い | 緊急時のディスク解放のみ。リカバリ不可になるリスク |
| DELETE OBSOLETE | 安全 | RETENTION POLICY に基づいて不要分を一括削除 |
バックアップに含まれているアーカイブログだけ削除するため、リカバリに必要なログが失われるリスクがありません。
BACKUP PLUS ARCHIVELOG DELETE INPUT
# 増分バックアップ + アーカイブログバックアップ + 削除
RMAN> BACKUP INCREMENTAL LEVEL 1 DATABASE
PLUS ARCHIVELOG DELETE INPUT;
# 動作の流れ:
# (1) アーカイブログをバックアップ
# (2) データベースの増分バックアップを実行
# (3) バックアップ中に生成されたアーカイブログもバックアップ
# (4) バックアップ完了後にアーカイブログを自動削除
バックアップから削除まで1コマンドで自動化できるため、削除忘れによるディスク枯渇を防げます。日次バックアップスクリプトには常にこのパターンを使いましょう。
RETENTION POLICY と DELETE 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(高速リカバリ領域)の自動管理
-- 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 警告が頻発します。
-- FRA のサイズを 50GB から 100GB に拡大 ALTER SYSTEM SET db_recovery_file_dest_size = 100G SCOPE=BOTH;
cron による定期自動化
#!/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
# 毎日 2:00 に実行 0 2 * * * /home/oracle/scripts/daily_backup.sh >> /home/oracle/logs/backup.log 2>&1
#!/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 ARCHIVELOG ALL は RMAN カタログとディスクの整合性を確認します。OS コマンドで手動削除した場合、CROSSCHECK なしだとカタログが不整合になります。自動化スクリプトには常に CROSSCHECK を含めてください。ORA-00257 の緊急対処
ORA-00257: archiver error. Connect internal only, until freed. はアーカイブログの書き込み先ディスクが満杯のときに発生します。全 DML が停止する緊急事態です。
# (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;
# RMAN で削除できないほど逼迫している場合 find /oracle/archive -name '*.arc' -mtime +7 -delete # OS 削除後は必ず RMAN で整合性を戻す rman target / RMAN> CROSSCHECK ARCHIVELOG ALL; RMAN> DELETE NOPROMPT EXPIRED ARCHIVELOG ALL;
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 を監視 |
よくある質問
まとめ
アーカイブログ管理の要点をまとめます。
| やりたいこと | コマンド |
|---|---|
| バックアップ済みログだけ削除(最も安全) | 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 のバックアップ・復元」も併せて参照してください。

