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 ログ完全ガイドも参照してください。