【Oracle】ORA-00257 完全ガイド|アーカイブログ満杯・FRA 不足の原因・空き確保・RMAN 削除手順まで解説

ORA-00257: archiver error. Connect internal only, until freed.は、Oracle のアーカイブログ先(アーカイブログディレクトリまたは FRA)のディスク容量が不足したときに発生します。このエラーが発生すると、SYSDBA 以外の接続が拒否されます。つまり、アプリケーションからの接続が完全にできなくなります。

緊急対応として、まず SYSDBA で接続してアーカイブログを削除するか、ディスク容量を確保する必要があります。その後、再発を防ぐために RMAN の保持ポリシーや FRA サイズの設定を見直します。

この記事でわかること

  • ORA-00257 が発生する原因(ディスク満杯・FRA 超過)
  • SYSDBA で接続してアーカイブログの状態を確認する方法
  • RMAN で古いアーカイブログを削除して空き確保する緊急手順
  • FRA(高速リカバリ領域)のサイズを拡張する方法
  • RMAN 保持ポリシーと自動削除を設定して再発を防ぐ方法
  • アーカイブ先が複数ある場合(LOG_ARCHIVE_DEST_n)の確認方法
スポンサーリンク

ORA-00257 が発生する原因と状態確認

ORA-00257 の主な原因は以下の2つです。

  • アーカイブログ先のディスクが満杯:LOG_ARCHIVE_DEST_n で指定したディレクトリが満杯になった
  • FRA(高速リカバリ領域)が超過:DB_RECOVERY_FILE_DEST_SIZE の上限に達した
アーカイブログの状態を確認するクエリ(SYSDBA で接続して実行)
-- まず SYSDBA で接続する(ORA-00257 中も内部接続は可能)
-- SQL*Plus: sqlplus / as sysdba
-- または: sqlplus sys/password@orcl as sysdba

-- アーカイブログの宛先と状態を確認する
SELECT dest_id, dest_name, status, target,
       archiver, schedule, destination, error
FROM   V$ARCHIVE_DEST
WHERE  status != 'INACTIVE'
ORDER BY dest_id;
-- status: VALID(正常), ERROR(エラー), FULL(満杯)
-- error 列にエラーメッセージが表示される

-- FRA(高速リカバリ領域)の使用状況を確認する
SELECT name,
       ROUND(space_limit / 1073741824, 2) AS limit_gb,
       ROUND(space_used  / 1073741824, 2) AS used_gb,
       ROUND(space_reclaimable / 1073741824, 2) AS reclaimable_gb,
       ROUND(space_used / NULLIF(space_limit, 0) * 100, 2) AS pct_used
FROM   V$RECOVERY_FILE_DEST;
-- pct_used が 100% に近い場合は FRA 超過が原因

-- FRA 内のファイル種類別の使用量を確認する
SELECT file_type,
       ROUND(PERCENT_SPACE_USED, 2) AS pct_used,
       ROUND(PERCENT_SPACE_RECLAIMABLE, 2) AS pct_reclaimable,
       NUMBER_OF_FILES
FROM   V$RECOVERY_AREA_USAGE
ORDER BY PERCENT_SPACE_USED DESC;
-- ARCHIVED LOG が大量にある場合はアーカイブログの削除が有効

-- アーカイブログの一覧を確認する(サイズと日時)
SELECT sequence#, first_time, next_time,
       ROUND(blocks * block_size / 1073741824, 3) AS size_gb,
       name, deleted
FROM   V$ARCHIVED_LOG
WHERE  standby_dest = 'NO'
  AND  deleted = 'NO'
ORDER BY first_time;

-- アーカイブログ先のディスク使用量を確認する(OS コマンド)
-- SELECT value FROM V$PARAMETER WHERE name = 'log_archive_dest_1';
-- → 取得したパスで OS 側のディスク使用量を確認する

緊急対応:RMAN でアーカイブログを削除して空き確保する

注意:アーカイブログを削除すると、削除した時点以前へのポイント・イン・タイム・リカバリができなくなります。削除前にバックアップ状況(RMAN のバックアップ済みアーカイブログ)を確認してから削除することを推奨します。
RMAN でアーカイブログを削除する(緊急対応)
# RMAN に SYSDBA で接続する
rman target /

# ① まず CROSSCHECK でアーカイブログの状態を確認する
RMAN> CROSSCHECK ARCHIVELOG ALL;

# ② バックアップ済みのアーカイブログをすべて削除する(推奨)
# バックアップされていないログは削除されないため安全
RMAN> DELETE ARCHIVELOG ALL BACKED UP 1 TIMES TO DISK;

# ③ より古いアーカイブログを削除する(日時指定)
# 例: 3日より前のアーカイブログをすべて削除する
RMAN> DELETE ARCHIVELOG ALL COMPLETED BEFORE 'SYSDATE-3';

# ④ EXPIRED のアーカイブログをカタログから削除する
RMAN> DELETE EXPIRED ARCHIVELOG ALL;

# ⑤ すべてのアーカイブログを削除する(最終手段・リカバリ不能になる可能性あり)
# ※ 直前にフルバックアップを取得した直後でないと使用禁止
# RMAN> DELETE NOPROMPT ARCHIVELOG ALL;

# 削除後に FRA の使用状況を再確認する
RMAN> LIST ARCHIVELOG ALL;

FRA のサイズを拡張して再発を防ぐ

FRA サイズを拡張する
-- 現在の FRA 設定を確認する
SHOW PARAMETER DB_RECOVERY_FILE_DEST;
SHOW PARAMETER DB_RECOVERY_FILE_DEST_SIZE;

-- FRA のサイズを拡張する(例: 50GB → 100GB)
-- ※ この変更は即時に有効になり、DB の再起動は不要
ALTER SYSTEM SET DB_RECOVERY_FILE_DEST_SIZE = 100G SCOPE=BOTH;

-- FRA の場所を変更する(別ディスクに移す場合)
ALTER SYSTEM SET DB_RECOVERY_FILE_DEST = '/u02/fra' SCOPE=BOTH;

-- FRA を使用せず、固定ディレクトリにアーカイブする場合の設定
-- LOG_ARCHIVE_DEST_1 に明示的なパスを設定する
ALTER SYSTEM SET LOG_ARCHIVE_DEST_1 = 'LOCATION=/u01/archive' SCOPE=BOTH;

-- FRA を無効にする場合(FRA を使っていない場合は関係なし)
ALTER SYSTEM SET DB_RECOVERY_FILE_DEST = '' SCOPE=BOTH;

-- アーカイブログの保持期間と自動削除を設定する
-- RMAN の保持ポリシー: 7日以内にリカバリできるように保持する
-- アーカイブログは RMAN バックアップ後に自動で削除可能にする

RMAN の保持ポリシーと自動削除で再発を防ぐ

RMAN の保持ポリシーを設定する
# RMAN に接続する
rman target /

# 保持ポリシーを設定する(7日以内のリカバリを保証する)
RMAN> CONFIGURE RETENTION POLICY TO RECOVERY WINDOW OF 7 DAYS;

# バックアップ後のアーカイブログを自動削除する設定
# DELETE INPUT: バックアップ時にアーカイブログを自動削除する
RMAN> CONFIGURE ARCHIVELOG DELETION POLICY TO BACKED UP 1 TIMES TO DISK;

# バックアップスクリプトに DELETE INPUT を追加する
# 毎日のバックアップにアーカイブログの削除を組み込む
RMAN> RUN {
    BACKUP ARCHIVELOG ALL DELETE INPUT;  # アーカイブログのバックアップと削除
    BACKUP DATABASE;                     # データベースのフルバックアップ
    DELETE NOPROMPT OBSOLETE;            # 保持ポリシー外のバックアップを削除
}

# 現在の保持ポリシーを確認する
RMAN> SHOW ALL;

アーカイブ先が複数ある場合(LOG_ARCHIVE_DEST_n)の確認

複数のアーカイブ先を確認する
-- アーカイブ先の設定をすべて確認する
SELECT name, value FROM V$PARAMETER
WHERE  name LIKE 'log_archive_dest%'
ORDER BY name;
-- log_archive_dest_1: メインのアーカイブ先(ローカルまたは FRA)
-- log_archive_dest_2: Data Guard スタンバイなどの追加宛先
-- log_archive_dest_state_n: ENABLE / DEFER / ALTERNATE(宛先の状態)

-- 複数宛先のうち特定の宛先を一時的に無効にする
ALTER SYSTEM SET LOG_ARCHIVE_DEST_STATE_2 = 'DEFER';  -- 宛先2を一時停止
-- ※ Data Guard 構成では宛先2を無効にするとスタンバイへのログ転送が止まるため注意

-- 代替宛先を設定する(メイン宛先が満杯になったら代替先にアーカイブする)
ALTER SYSTEM SET LOG_ARCHIVE_DEST_1 =
    'LOCATION=/u01/archive REOPEN=30 MAX_FAILURE=5 ALTERNATE=LOG_ARCHIVE_DEST_2';
ALTER SYSTEM SET LOG_ARCHIVE_DEST_2 =
    'LOCATION=/u02/archive_alt';  -- 代替先

-- アーカイブログのディレクトリの使用量をOS側で確認する(SQL*Plus から)
-- ホスト側では df -h /u01/archive でディスク使用量を確認する

ARCHIVELOG モードを一時的に無効にする手順(最終手段)

警告:ARCHIVELOG モードを無効にすると、障害発生時にバックアップ時点にしかリカバリできなくなります。本番環境では原則として使用しないでください。ディスク追加や RMAN での削除で対処できない場合の最終手段です。
ARCHIVELOG モードを一時的に無効にする(最終手段)
-- ①. 現在のモードを確認する
SELECT log_mode FROM V$DATABASE;

-- ②. データベースを停止する
SHUTDOWN IMMEDIATE;

-- ③. MOUNT モードで起動する
STARTUP MOUNT;

-- ④. NOARCHIVELOG モードに変更する(アーカイブログが作成されなくなる)
ALTER DATABASE NOARCHIVELOG;

-- ⑤. 通常起動する
ALTER DATABASE OPEN;

-- ⑥. ディスクの空き確保後(古いアーカイブログを手動削除後)、ARCHIVELOG に戻す
SHUTDOWN IMMEDIATE;
STARTUP MOUNT;
ALTER DATABASE ARCHIVELOG;
ALTER DATABASE OPEN;
-- ARCHIVELOG に戻したら、すぐにフルバックアップを取得する
-- rman target / <<EOF
-- BACKUP DATABASE;
-- EOF

まとめ

  • ORA-00257 の原因:アーカイブログ先のディスク満杯または FRA の使用量が上限に達した場合。SYSDBA のみ接続可能になり、通常のアプリケーション接続は拒否される
  • 緊急対応:SYSDBA で接続 → V$RECOVERY_FILE_DEST / V$RECOVERY_AREA_USAGE で状態確認 → RMAN で DELETE ARCHIVELOG ALL BACKED UP 1 TIMES TO DISK で安全に削除
  • FRA サイズの拡張:ALTER SYSTEM SET DB_RECOVERY_FILE_DEST_SIZE = 新しいサイズ で即時反映。別ディスクに FRA 先を変更することも可能
  • 再発防止:RMAN で CONFIGURE ARCHIVELOG DELETION POLICY TO BACKED UP 1 TIMES TO DISK を設定する。毎日のバックアップに DELETE INPUT を組み込んでアーカイブログを自動削除する
  • 複数アーカイブ先:LOG_ARCHIVE_DEST_n を確認して満杯になっている宛先を特定する。Data Guard がある場合は宛先2の無効化に注意する

ORA-00257 が発生した場合、RMAN でのアーカイブログ削除が最も安全な対処法です。RMAN の操作全般については Oracle RMAN 完全ガイドを参照してください。FRA やアーカイブログの仕組みについてはOracle REDO ログ完全ガイドも参照してください。