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 の緊急対処手順
・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コマンドで自動化できるため、削除忘れによるディスク枯渇を防げます。日次バックアップスクリプトには常にこのパターンを使いましょう。
バックアップから削除まで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 コマンドを使うのが正しい手順です。
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 のバックアップ・復元」も併せて参照してください。

