Ошибка ORA-00257: archiver error — переполнение архивов Redo Log в Oracle
- Все пользовательские подключения блокируются с ошибкой
ORA-00257: archiver error. Connect internal only, until freed. - База данных переходит в состояние 'заморозки' (Hang): процессы DML зависают в ожидании освобождения журналов Redo.
- Фоновый процесс
ARCH(Archiver) не может записать архивный лог из-за отсутствия места на диске или превышения лимита FRA.
1. Аварийное подключение через SYSDBA
sqlplus / as sysdba2. Проверка заполненности Fast Recovery Area (FRA)
SELECT name,
ROUND(space_limit / 1024 / 1024 / 1024, 2) AS limit_gb,
ROUND(space_used / 1024 / 1024 / 1024, 2) AS used_gb,
ROUND(space_reclaimable / 1024 / 1024 / 1024, 2) AS reclaimable_gb,
ROUND((space_used - space_reclaimable) / space_limit * 100, 2) AS pct_used
FROM v$recovery_file_dest;3. Вариант решения А: Увеличение лимита FRA
Если на физическом диске есть свободное место, увеличьте размер recovery dest:
ALTER SYSTEM SET db_recovery_file_dest_size = 500G SCOPE=BOTH;4. Вариант решения Б: Очистка старых архивлогов через RMAN
Запустите Recovery Manager и выполните бэкап с удалением перенесенных архивов:
rman target /
-- Проверка целостности каталога
CROSSCHECK ARCHIVELOG ALL;
-- Удаление устаревших архлогов, которые уже забэкаплены
DELETE NOPROMPT EXPIRED ARCHIVELOG ALL;
DELETE NOPROMPT ARCHIVELOG ALL COMPLETED BEFORE 'SYSDATE-2';
-- Или принудительный бэкап с освобождением места:
BACKUP ARCHIVELOG ALL DELETE INPUT;5. Проверка восстановления работы процесса ARCH
ALTER SYSTEM ARCHIVE LOG CURRENT; Частые вопросы (FAQ)
Почему удаление архивлогов через операционную систему (rm / del) не убирает ORA-00257?
Oracle хранит метаданные о занятом месте в представлении v$recovery_file_dest. Если удалить файлы напрямую через ОС, база продолжит считать их существующими, пока вы не выполните CROSSCHECK ARCHIVELOG ALL и DELETE EXPIRED в RMAN.
Могут ли обычные пользователи подключиться к базе при ошибке ORA-00257?
Нет. Вход разрешен исключительно сессиям с привилегией SYSDBA (connect internal) для выполнения экстренных административных процедур.
Почему база данных полностью зависает при сбое архиватора?
Если Online Redo Log группы заполнены, а процесс ARCH не может заархивировать хотя бы одну группу, процесс LGWR не имеет права перезаписывать неархивированные журналы, что полностью останавливает фиксацию транзакций (COMMIT).
Как перенаправить архивные логи в альтернативный каталог без перезагрузки?
Измените параметр log_archive_dest: ALTER SYSTEM SET LOG_ARCHIVE_DEST_2='LOCATION=/new/disk/arch' SCOPE=BOTH; и включите его: ALTER SYSTEM SET LOG_ARCHIVE_DEST_STATE_2=ENABLE SCOPE=BOTH;.