【完全ガイド】ORA-00257: archiver error. Connect internal only, until freed の原因と解決方法|FRA フル・RMAN・Data Guard 徹底解説

【完全ガイド】ORA-00257: archiver error. Connect internal only, until freed の原因と解決方法|FRA フル・RMAN・Data Guard 徹底解説

Oracle DBA が本番緊急事態で真っ先に対応する最重要エラー:

$ sqlplus scott/tiger
ERROR:
ORA-00257: archiver error. Connect internal only, until freed.

「アーカイバでエラー、内部接続のみ、解放されるまで」というシンプルなメッセージ。しかし、これは本番システムの完全停止を意味します:

  • 全ての新規トランザクションが停止
  • 一般ユーザーの接続不可
  • SYSDBA のみ接続可能
  • アプリ全体が業務停止
  • 緊急対応必須

このエラーの本質は、Oracle のアーカイバプロセス(ARCn)がアーカイブログを書き込めない:

1. Oracle は REDO ログを ARCHIVELOG モードで保管
2. オンライン REDO ログが埋まる → アーカイブ先にコピー
3. アーカイブ先が満杯 → コピー失敗
4. Oracle がデータ保護のため書き込み停止
5. → ORA-00257 発生

現場で最も典型的なのは、FRA (Fast Recovery Area) のフル:

SELECT space_limit, space_used, 
       ROUND(space_used * 100 / space_limit) AS pct
FROM v$recovery_file_dest;
-- SPACE_USED >= SPACE_LIMIT なら満杯
-- PCT が 100 に近い = ORA-00257 の原因

このエラーは時限爆弾として知られています:

  • RMAN バックアップが数日間失敗
  • Data Guard スタンバイが数時間遅延
  • CROSSCHECK 未実施でファイル削除不整合
  • DBA 監視の空白で FRA 満杯到達
  • 急激な大量トランザクションで予想外に消費

多くの日本語記事が「アーカイブを削除せよ」で終わりますが、実務では:

  • FRA vs LOG_ARCHIVE_DEST の違いと使い分け
  • V$RECOVERY_FILE_DEST / V$FLASH_RECOVERY_AREA_USAGE での正確な診断
  • RMAN CROSSCHECK + DELETE EXPIRED の重要性
  • CONFIGURE ARCHIVELOG DELETION POLICY による自動化
  • Data Guard 環境での APPLIED ON STANDBY 設定
  • DELETE INPUT によるバックアップ+削除
  • 緊急対応ALTER SYSTEM SET db_recovery_file_dest_size
  • Rails / Java アプリでの動作待機ロジック
  • 監視・アラート設計(80% 到達時に予告
  • DR 環境での特殊な考慮

さらに、ORA-00257 は必ず併発する追加エラーが原因特定の鍵:

ORA-00257: archiver error. Connect internal only, until freed.
ORA-16038: log X sequence# N cannot be archived      ← 補助情報
ORA-19809: limit exceeded for recovery files          ← FRA フル
ORA-19804: cannot reclaim N bytes disk space          ← 領域確保失敗
ORA-00312: online log X thread N                      ← REDO ログ情報

併発する ORA-xxxxx で状況判別が可能。

本記事では、ORA-00257: archiver error完全な原因と解決方法を、リファレンスとして実用的に整理します。10大発生パターン、FRA と LOG_ARCHIVE_DEST の違い、6つの解決策、緊急対応手順、Rails/Java/Python 対応、実践シナリオ、FAQまで完全網羅。この1本で ORA-00257 に冷静に的確に対処できるようになります。


目次

結論:アーカイブ領域を確保

時間がない方向けに、最速の対処を先に示します。

エラーメッセージの読み方

ORA-00257: archiver error. Connect internal only, until freed.
             ↑                    ↑
        アーカイバエラー        SYSDBA のみ接続可、解放待ち

= REDO ログの archive 保管領域が満杯

最速の緊急対応

# STEP 1: SYSDBA で接続
sqlplus / as sysdba

# STEP 2: FRA 使用状況確認
SELECT space_limit / 1024/1024/1024 AS limit_gb,
       space_used / 1024/1024/1024 AS used_gb,
       ROUND(space_used * 100 / space_limit) AS pct
FROM v$recovery_file_dest;

# STEP 3: RMAN で古いアーカイブ削除
rman target /
RMAN> DELETE ARCHIVELOG ALL COMPLETED BEFORE 'SYSDATE-2';

# STEP 4: 状態確認
SELECT * FROM v$recovery_file_dest;

6つの解決策

#手法使う場面
RMAN DELETE ARCHIVELOG緊急対応
FRA サイズ拡張恒久対応
LOG_ARCHIVE_DEST 変更場所変更
自動削除ポリシー予防
CROSSCHECK + DELETE EXPIRED不整合解消
Data Guard 遅延解消DG 環境

併発エラーで原因特定

エラー意味
ORA-16038ログをアーカイブできない
ORA-19809FRA 上限超過
ORA-19804領域確保失敗
ORA-00312オンライン REDO ログ情報

詳細は以下で解説します。


Oracle アーカイブ仕組み

ARCHIVELOG モード

REDO ログの流れ:

トランザクション → REDO ログバッファ → オンライン REDO ログ (循環)
                                        ↓
                    ARCH プロセスがアーカイブ (保管)
                                        ↓
                      アーカイブログファイル
                                        ↓
                      RMAN バックアップ / Data Guard 転送
                                        ↓
                          削除(不要になったら)

FRA (Fast Recovery Area) とは

Oracle 10g+ の統合リカバリ領域:

FRA に含まれるもの:
- アーカイブログ
- RMAN バックアップ
- フラッシュバックログ
- コントロールファイルコピー
- REDO ログのマルチプレクスコピー

サイズ管理DB_RECOVERY_FILE_DEST_SIZE で。

LOG_ARCHIVE_DEST_n

アーカイブ先の指定:

-- FRA を使用(デフォルト)
LOG_ARCHIVE_DEST_1 = 'LOCATION=USE_DB_RECOVERY_FILE_DEST'

-- 個別ディレクトリ
LOG_ARCHIVE_DEST_1 = 'LOCATION=/u01/arch'

-- 複数先(冗長化)
LOG_ARCHIVE_DEST_2 = 'LOCATION=/u02/arch'

-- Data Guard 送信
LOG_ARCHIVE_DEST_3 = 'SERVICE=standby_db'

【原因①】FRA フル(最頻出)

症状

ORA-00257: archiver error. Connect internal only, until freed.
ORA-19809: limit exceeded for recovery files
ORA-19804: cannot reclaim 904507904 bytes disk space

診断

SQL> CONNECT / AS SYSDBA

SELECT space_limit / 1024/1024/1024 AS limit_gb,
       space_used / 1024/1024/1024 AS used_gb,
       space_reclaimable / 1024/1024/1024 AS reclaimable_gb,
       ROUND(space_used * 100 / space_limit) AS pct_used
FROM v$recovery_file_dest;

-- 詳細
SELECT file_type, 
       percent_space_used, 
       percent_space_reclaimable,
       number_of_files
FROM v$flash_recovery_area_usage;

解決A: RMAN で古いアーカイブ削除(最速)

rman target /

# 過去2日より古いアーカイブ削除
RMAN> DELETE ARCHIVELOG ALL COMPLETED BEFORE 'SYSDATE-2';

# 確認
SQL> SELECT * FROM v$recovery_file_dest;

解決B: FRA サイズ拡張

-- 250GB に拡張
ALTER SYSTEM SET db_recovery_file_dest_size = 250G;

-- 場所変更
ALTER SYSTEM SET db_recovery_file_dest = '/new/large/path';

FRA 関連は ORA-01034: ORACLE not available の記事も参照してください。


【原因②】LOG_ARCHIVE_DEST ディスクフル

症状

ORA-00257: archiver error
ORA-16014: log 1 sequence# 280 not archived, no available destinations
ORA-00312: online log 1 thread 1: '/data/oradata/orcl/redo01.log'

診断

# アーカイブ先確認
SQL> SHOW PARAMETER log_archive_dest_1

# ディスク使用量
df -h /archive/POCD

解決A: アーカイブ削除

rman target /
RMAN> DELETE ARCHIVELOG ALL COMPLETED BEFORE 'SYSDATE-3';

解決B: アーカイブ場所変更

-- 新しい場所へ
ALTER SYSTEM SET log_archive_dest_1 = 'LOCATION=/dump/arch' SCOPE=BOTH;

【原因③】RMAN バックアップ滞留

シナリオ

RMAN バックアップジョブ:
- 通常 毎日 03:00 実行
- 3日間 失敗(cron エラー / 権限問題)
- アーカイブが削除されず蓄積
- FRA 満杯 → ORA-00257

解決

バックアップ実施:

rman target /

RMAN> BACKUP ARCHIVELOG ALL DELETE INPUT;
-- バックアップ + 削除(推奨)

# または明示的
RMAN> BACKUP ARCHIVELOG ALL;
RMAN> DELETE ARCHIVELOG ALL COMPLETED BEFORE 'SYSDATE-1';

【原因④】Data Guard スタンバイ遅延

シナリオ

Primary DB がスタンバイに転送する ARCHIVELOG が
スタンバイの適用遅延で削除されず蓄積
→ Primary の FRA フル
→ ORA-00257

診断

-- スタンバイの適用状況
SELECT thread#, max(sequence#) applied
FROM v$archived_log
WHERE applied = 'YES'
GROUP BY thread#;

-- 未適用のログ
SELECT * FROM v$archive_gap;

解決

A. 適用ポリシー設定:

-- Primary で
RMAN> CONFIGURE ARCHIVELOG DELETION POLICY TO APPLIED ON STANDBY;
-- スタンバイ適用済みなら削除可

B. スタンバイの遅延解消:

-- スタンバイ側で MRP 状態
SELECT process, status FROM v$managed_standby WHERE process LIKE 'MRP%';

【原因⑤】CROSSCHECK 未実施

シナリオ

OS レベルでアーカイブファイルを手動削除
→ Oracle のカタログには残る
→ 実際はディスクにないが空き扱いされない
→ FRA フル

診断

-- カタログとファイル不整合
SELECT * FROM v$archived_log 
WHERE status IN ('X', 'D')   -- X: expired, D: deleted
  AND deleted = 'NO';

解決

rman target /

# ファイル存在チェック
RMAN> CROSSCHECK ARCHIVELOG ALL;

# EXPIRED をカタログから削除
RMAN> DELETE EXPIRED ARCHIVELOG ALL;

【原因⑥】DELETE INPUT 忘れ

シナリオ

バックアップ時に DELETE INPUT 未指定
→ バックアップ後もアーカイブが残る
→ 徐々に FRA フル

解決

バックアップ + 削除セット:

RMAN> BACKUP ARCHIVELOG ALL DELETE INPUT;
-- バックアップ完了後、元アーカイブを自動削除

【原因⑦】自動削除ポリシー未設定

解決

削除ポリシー設定:

rman target /

# バックアップ済みかつスタンバイ適用済みなら削除可
RMAN> CONFIGURE ARCHIVELOG DELETION POLICY 
      TO APPLIED ON STANDBY BACKED UP 1 TIMES TO DISK;

# 現状確認
RMAN> SHOW ARCHIVELOG DELETION POLICY;

【原因⑧】ASM ディスクグループフル

シナリオ(ASM 環境)

+FRA ディスクグループが 100% 到達
→ ORA-00257

診断

-- ASM 使用状況
SELECT name, 
       total_mb / 1024 AS total_gb,
       free_mb / 1024 AS free_gb,
       ROUND((total_mb - free_mb) * 100 / total_mb) AS pct
FROM v$asm_diskgroup;

解決

A. ディスク追加:

ALTER DISKGROUP fra ADD DISK '/dev/oracleasm/disks/DISK5';

B. アーカイブ削除(前述)。


【原因⑨】急激な大量トランザクション

シナリオ

バッチ処理で通常の 10 倍のトランザクション
→ REDO ログ生成速度上昇
→ アーカイブ生成速度上昇
→ FRA 予想より早く枯渇
→ ORA-00257

解決

A. 事前予測:

-- 過去のログ生成量
SELECT TRUNC(completion_time) AS day,
       COUNT(*) AS logs,
       ROUND(SUM(blocks * block_size) / 1024/1024/1024, 2) AS gb
FROM v$archived_log
WHERE completion_time > SYSDATE - 30
GROUP BY TRUNC(completion_time)
ORDER BY 1 DESC;

B. 事前 FRA 拡張:

ALTER SYSTEM SET db_recovery_file_dest_size = 500G;

【原因⑩】NFS / ストレージ障害

シナリオ

アーカイブ先が NFS マウント
→ NFS 障害でアクセス不可
→ アーカイブ書き込み失敗
→ ORA-00257

診断

# マウント確認
mount | grep archive
df /archive
ls -la /archive

解決

A. NFS 修復 or 一時的にローカルへ:

ALTER SYSTEM SET log_archive_dest_1 = 'LOCATION=/local/arch' SCOPE=BOTH;

診断ツール完全リファレンス

V$RECOVERY_FILE_DEST

SELECT name,
       space_limit / 1024/1024/1024 AS limit_gb,
       space_used / 1024/1024/1024 AS used_gb,
       space_reclaimable / 1024/1024/1024 AS reclaimable_gb,
       number_of_files
FROM v$recovery_file_dest;

V$FLASH_RECOVERY_AREA_USAGE

SELECT file_type,
       percent_space_used,
       percent_space_reclaimable,
       number_of_files
FROM v$flash_recovery_area_usage;

V$ARCHIVED_LOG

-- 最近のアーカイブ
SELECT sequence#, first_time, next_time, blocks * block_size / 1024/1024 AS mb, deleted
FROM v$archived_log
ORDER BY sequence# DESC
FETCH FIRST 20 ROWS ONLY;

-- 削除されていない古いアーカイブ
SELECT COUNT(*), ROUND(SUM(blocks * block_size) / 1024/1024/1024, 2) AS gb
FROM v$archived_log
WHERE completion_time < SYSDATE - 7
  AND deleted = 'NO';

アラートログ

# 場所確認
SQL> SELECT value FROM v$diag_info WHERE name = 'Diag Trace';

# 最新
tail -100 alert_orcl.log | grep -E "(ORA-00257|ORA-16038|ORA-19809)"

archive log list

SQL> ARCHIVE LOG LIST
Database log mode              Archive Mode
Automatic archival             Enabled
Archive destination            USE_DB_RECOVERY_FILE_DEST
Oldest online log sequence     8910
Next log sequence to archive   8910
Current log sequence           8912

6つの解決策 完全リファレンス

解決策① RMAN DELETE ARCHIVELOG

rman target /

# 過去2日より古い削除
RMAN> DELETE ARCHIVELOG ALL COMPLETED BEFORE 'SYSDATE-2';

# 特定シーケンス
RMAN> DELETE ARCHIVELOG UNTIL SEQUENCE 100;

# 全削除(危険、慎重に)
RMAN> DELETE ARCHIVELOG ALL;

解決策② FRA サイズ拡張

-- 現在のサイズ
SHOW PARAMETER db_recovery_file_dest_size;

-- 拡張
ALTER SYSTEM SET db_recovery_file_dest_size = 500G;

-- 場所変更
ALTER SYSTEM SET db_recovery_file_dest = '/new/large/mount';

解決策③ LOG_ARCHIVE_DEST 変更

-- 一時的な場所変更
ALTER SYSTEM SET log_archive_dest_1 = 'LOCATION=/emergency/arch' SCOPE=BOTH;

-- 元に戻す
ALTER SYSTEM SET log_archive_dest_1 = 'LOCATION=USE_DB_RECOVERY_FILE_DEST' SCOPE=BOTH;

解決策④ 自動削除ポリシー

rman target /

# バックアップ済みなら削除可
RMAN> CONFIGURE ARCHIVELOG DELETION POLICY 
      TO BACKED UP 1 TIMES TO DISK;

# スタンバイ適用済みで削除可(Data Guard)
RMAN> CONFIGURE ARCHIVELOG DELETION POLICY 
      TO APPLIED ON STANDBY BACKED UP 1 TIMES TO DISK;

解決策⑤ CROSSCHECK + DELETE EXPIRED

rman target /

# カタログとファイル整合性チェック
RMAN> CROSSCHECK ARCHIVELOG ALL;

# 存在しないファイルをカタログから削除
RMAN> DELETE EXPIRED ARCHIVELOG ALL;

# EXPIRED バックアップも
RMAN> CROSSCHECK BACKUP;
RMAN> DELETE EXPIRED BACKUP;

解決策⑥ Data Guard 遅延解消

-- スタンバイの状態
SELECT process, status, sequence#
FROM v$managed_standby
WHERE process LIKE 'MRP%';

-- ギャップ確認
SELECT * FROM v$archive_gap;

-- 手動転送 & 適用
-- (複雑、手順あり)

Rails / Java / Python 対応

アプリからのアクセス

ORA-00257 発生中:

  • 既存の接続: 読み取りのみ、書き込み不可
  • 新規接続: 拒否(SYSDBA のみ可)
  • 待機ロジックが必要

Rails ActiveRecord

begin
  User.create!(name: 'John')
rescue ActiveRecord::StatementInvalid => e
  if e.message.include?("ORA-00257")
    Rails.logger.fatal "ORA-00257: DB archive full"
    # 監視アラート
    NotifyOps.critical("Oracle archive space exhausted")
    # 一定時間待機してリトライ
    sleep(30)
    retry if (attempt ||= 0) < 3 && (attempt += 1)
  else
    raise
  end
end

Rails 8 系の詳細は Rails 8 アップグレードガイドの記事も参照してください。

Java (JDBC)

try {
    stmt.executeUpdate(sql);
} catch (SQLException e) {
    if (e.getErrorCode() == 257) {
        logger.fatal("ORA-00257: Archive area full");
        // 監視ツール通知
        alertingService.critical("Oracle archive exhausted");
        // 一定時間待機
        Thread.sleep(30000);
    }
}

Python (oracledb)

import oracledb
import time

def with_retry_on_archive_error(func, max_retries=3):
    for attempt in range(max_retries):
        try:
            return func()
        except oracledb.DatabaseError as e:
            error_obj, = e.args
            if error_obj.code == 257:
                print(f"ORA-00257 detected, retry {attempt + 1}")
                time.sleep(30)
            else:
                raise
    raise Exception("ORA-00257 not resolved")

実践シナリオ

シナリオ1:本番緊急対応(10分で復旧)

# 1. サーバー接続
ssh dbserver

# 2. SYSDBA 接続
sqlplus / as sysdba

# 3. FRA 状況確認
SQL> SELECT space_limit/1024/1024/1024 AS gb_limit,
            space_used/1024/1024/1024 AS gb_used
     FROM v$recovery_file_dest;
-- gb_limit: 200, gb_used: 199 → 99%

# 4. アラートログ確認
exit
tail -50 /u01/app/oracle/diag/rdbms/orcl/orcl/trace/alert_orcl.log

# 5. RMAN で削除
rman target /
RMAN> BACKUP ARCHIVELOG ALL DELETE INPUT;
-- または
RMAN> DELETE ARCHIVELOG ALL COMPLETED BEFORE 'SYSDATE-2';

# 6. 空き確認
sqlplus / as sysdba
SQL> SELECT * FROM v$recovery_file_dest;
-- 空きが増えているか確認

# 7. サービス確認
SQL> ALTER SYSTEM ARCHIVE LOG CURRENT;
-- 現在のログを強制アーカイブ

シナリオ2:予防的な自動削除ポリシー

# 削除ポリシー設定(一度だけ)
rman target /

RMAN> CONFIGURE ARCHIVELOG DELETION POLICY 
      TO BACKED UP 1 TIMES TO DISK;

# バックアップスクリプト(毎日)
RMAN> BACKUP ARCHIVELOG ALL DELETE INPUT;

シナリオ3:監視スクリプト

#!/bin/bash
# monitor_fra.sh

THRESHOLD=80
sqlplus -s / as sysdba <<EOF
SET HEADING OFF FEEDBACK OFF
SELECT CASE 
  WHEN ROUND(space_used * 100 / space_limit) > $THRESHOLD 
  THEN 'ALERT'
  ELSE 'OK' 
END || ':' || ROUND(space_used * 100 / space_limit)
FROM v\$recovery_file_dest;
EXIT;
EOF

crontab の詳細は crontab 使い方の記事も参照してください。

シナリオ4:Rails での監視統合

# app/services/oracle_health_check.rb
class OracleHealthCheck
  def self.check_archive_space
    result = ActiveRecord::Base.connection.select_value(<<-SQL)
      SELECT ROUND(space_used * 100 / space_limit) 
      FROM v$recovery_file_dest
    SQL
    
    if result > 80
      NotifyOps.warn("FRA usage: #{result}%")
    end
    
    result
  end
end

# cron で定期実行

シナリオ5:Docker Oracle での対応

docker exec -it oracle-xe sqlplus / as sysdba <<EOF
-- FRA 確認
SELECT space_limit, space_used FROM v\$recovery_file_dest;

-- 拡張
ALTER SYSTEM SET db_recovery_file_dest_size = 20G;
EOF

Docker 関連は docker daemon 接続エラーの記事、Docker no space left on device の記事も参照してください。

シナリオ6:Data Guard 環境での対応

-- Primary で
RMAN> CONFIGURE ARCHIVELOG DELETION POLICY 
      TO APPLIED ON STANDBY;

-- スタンバイで
SELECT thread#, MAX(sequence#) applied
FROM v$archived_log 
WHERE applied = 'YES'
GROUP BY thread#;

-- ギャップ確認
SELECT * FROM v$archive_gap;

シナリオ7:CI/CD デプロイ前チェック

- name: Check archive space
  run: |
    sqlplus -s / as sysdba <<EOF
    WHENEVER SQLERROR EXIT SQL.SQLCODE
    DECLARE
      v_pct NUMBER;
    BEGIN
      SELECT ROUND(space_used * 100 / space_limit) INTO v_pct
      FROM v\$recovery_file_dest;
      IF v_pct > 90 THEN
        RAISE_APPLICATION_ERROR(-20001, 'FRA critical: ' || v_pct || '%');
      END IF;
    END;
    /
    EOF

Kamal 2 デプロイの詳細は Kamal 2 デプロイの記事を参照してください。

シナリオ8:バックアップスクリプトの改善

#!/bin/bash
# nightly_backup.sh

rman target / log=/var/log/rman_$(date +%Y%m%d).log <<EOF
BACKUP AS COMPRESSED BACKUPSET DATABASE 
  PLUS ARCHIVELOG DELETE INPUT;

CROSSCHECK ARCHIVELOG ALL;
DELETE EXPIRED ARCHIVELOG ALL;

CROSSCHECK BACKUP;
DELETE EXPIRED BACKUP;

DELETE OBSOLETE;
EOF

# 削除ポリシー適用

シナリオ9:Python での監視

import oracledb
import logging

def monitor_fra():
    with oracledb.connect(user='monitor', password=pw, dsn=dsn) as conn:
        cursor = conn.cursor()
        cursor.execute("""
            SELECT ROUND(space_used * 100 / space_limit)
            FROM v$recovery_file_dest
        """)
        pct, = cursor.fetchone()
        
        if pct > 80:
            logging.warning(f"FRA usage: {pct}%")
        if pct > 95:
            logging.critical(f"FRA CRITICAL: {pct}%")
        
        return pct

シナリオ10:Autonomous DB

-- Autonomous DB では自動管理
-- ただし監視可能
SELECT * FROM v$recovery_file_dest;
-- 通常 Oracle が自動対応

トラブルシューティング

DELETE ARCHIVELOG が失敗

-- 権限確認
SELECT * FROM session_privs;

CROSSCHECK が遅い

大量のファイルの場合、時間がかかる。進行状況確認:

SELECT * FROM v$rman_status WHERE status = 'RUNNING';

スタンバイ環境で削除できない

APPLIED ON STANDBY 設定確認:

RMAN> SHOW ARCHIVELOG DELETION POLICY;

FRA と LOG_ARCHIVE_DEST 混在

優先度設定を明確化、片方に統一推奨。

アラート後のリカバリ時間

RMAN DELETE は数秒〜数分、大量なら並列化:

RMAN> ALLOCATE CHANNEL c1 TYPE DISK;
RMAN> ALLOCATE CHANNEL c2 TYPE DISK;
RMAN> DELETE ARCHIVELOG ALL COMPLETED BEFORE 'SYSDATE-2';

PostgreSQL からの移行

PG は WAL 管理が自動的、Oracle は明示的な設定必要。


よくある質問(FAQ)

Q1. ORA-00257 と ORA-19809 の違い

  • 00257: アーカイバエラー(一般)
  • 19809: FRA 上限超過(具体的)

Q2. FRA と LOG_ARCHIVE_DEST の違い

  • FRA: 統合リカバリ領域(10g+)
  • LOG_ARCHIVE_DEST: 個別アーカイブ先

Q3. DELETE ARCHIVELOG は安全か

バックアップ後なら安全。バックアップ前は危険(リカバリ不能)。

Q4. FRA サイズの推奨値

REDO ログ生成量の 3-7 日分、余裕を持って設定。

Q5. 自動削除ポリシー

CONFIGURE ARCHIVELOG DELETION POLICY 
  TO BACKED UP 1 TIMES TO DISK;

Q6. Data Guard 環境の考慮

APPLIED ON STANDBY 設定必須。

Q7. Rails での対応

リトライロジック + 監視アラート

Q8. Java での対応

errorCode == 257 で判定 + Thread.sleep でリトライ。

Q9. 監視の閾値

80% でアラート95% でクリティカル推奨。

Q10. NFS の推奨

ローカルディスク推奨、NFS は障害リスク。

Q11. Autonomous DB での挙動

自動管理、監視は可能。

Q12. パフォーマンスへの影響

発生中は書き込み停止、業務影響甚大。予防必須


参考リンク

Oracle 公式


まとめ

ORA-00257: archiver error. Connect internal only, until freed. の要点を再整理します。

エラーの本質

Oracle アーカイバプロセス (ARCn) が
アーカイブログを書き込めない
→ REDO 保護のため書き込み停止
→ SYSDBA のみ接続可能
→ 本番停止

併発エラーで原因特定

エラー意味
ORA-16038ログをアーカイブできない
ORA-19809FRA 上限超過
ORA-19804領域確保失敗
ORA-00312オンライン REDO ログ情報

緊急対応の5ステップ

# STEP 1: SYSDBA 接続
sqlplus / as sysdba

# STEP 2: FRA 確認
SELECT * FROM v$recovery_file_dest;

# STEP 3: アラートログ確認
tail -100 alert_orcl.log

# STEP 4: RMAN で削除
rman target /
RMAN> BACKUP ARCHIVELOG ALL DELETE INPUT;

# STEP 5: 確認
SELECT * FROM v$recovery_file_dest;

10大原因

#原因対処
FRA フルRMAN DELETE / FRA 拡張
LOG_ARCHIVE_DEST フル削除 / 場所変更
RMAN バックアップ滞留バックアップ実施
Data Guard 遅延適用進める
CROSSCHECK 未実施CROSSCHECK + DELETE EXPIRED
DELETE INPUT 忘れオプション追加
自動削除ポリシー未設定ポリシー設定
ASM フルディスク追加
急激な大量トランザクションFRA 事前拡張
NFS 障害修復 or ローカル

6つの解決策

# ① RMAN DELETE ARCHIVELOG
RMAN> DELETE ARCHIVELOG ALL COMPLETED BEFORE 'SYSDATE-2';

# ② FRA サイズ拡張
ALTER SYSTEM SET db_recovery_file_dest_size = 500G;

# ③ LOG_ARCHIVE_DEST 変更
ALTER SYSTEM SET log_archive_dest_1 = 'LOCATION=/new/path';

# ④ 自動削除ポリシー
RMAN> CONFIGURE ARCHIVELOG DELETION POLICY 
      TO BACKED UP 1 TIMES TO DISK;

# ⑤ CROSSCHECK + DELETE EXPIRED
RMAN> CROSSCHECK ARCHIVELOG ALL;
RMAN> DELETE EXPIRED ARCHIVELOG ALL;

# ⑥ Data Guard 適用ポリシー
RMAN> CONFIGURE ARCHIVELOG DELETION POLICY 
      TO APPLIED ON STANDBY;

診断クエリ Top 3

-- ① FRA 使用率
SELECT ROUND(space_used * 100 / space_limit) AS pct
FROM v$recovery_file_dest;

-- ② FRA 詳細
SELECT file_type, percent_space_used, percent_space_reclaimable
FROM v$flash_recovery_area_usage;

-- ③ アーカイブ状況
ARCHIVE LOG LIST;

予防のポイント

1. 監視ツールで FRA 80% 到達時アラート
2. 自動削除ポリシー設定
3. RMAN 定期バックアップ + DELETE INPUT
4. Data Guard 環境で APPLIED ON STANDBY
5. 定期的な CROSSCHECK 実施
6. アプリでリトライロジック実装
7. Rails / Java で健全性チェック
8. cron で監視スクリプト定期実行
9. FRA サイズは REDO 生成量の 3-7 日分
10. NFS は避けてローカルディスク使用

これらの知識は、Oracle DBA の本番運用・障害対応・DR 計画・Rails / Java / Python アプリ運用・監視設計・バックアップ戦略・Data Guard 運用・Autonomous DB 管理など、あらゆる場面で活用できます。本記事をブックマークしておけば、ORA-00257 に出会っても冷静に的確に対処できるようになります。


本記事は2026年6月時点の情報をもとに、Oracle Database 19c〜23ai での動作確認・公式ドキュメントに基づき作成しています。Oracle のバージョンにより挙動が異なる場合があるため、最新の情報は Oracle 公式ドキュメント(docs.oracle.com)もあわせてご確認ください。