27.02.2016 1 min to read

ORA-00376: file %s cannot be read at this time

Category : Статьи

Эта ошибка возникает в комплексе с другими ошибками, что полностью описывает ситуацию:

ORA-00704: bootstrap process failure
ORA-00604: error occurred at recursive SQL level 2
ORA-00376: file 2 cannot be read at this time
ORA-01110: data file 2: 'ORACLE_BASE/oradata/SID/UNDOTBS01.DBF'

Значение ошибок ORA-00704, ORA-00376, ORA-01110

ORA-00704: bootstrap process failure – это “шумная” ошибка, указывающая другую ошибку, возникшую во время запуска БД
ORA-00376: file %s cannot be read at this time – означает, что файл (значение) не может быть прочитан в настоящее время
ORA-01110: data file %s: %s – эта ошибка идет в “приложение” и служит для уточнения с каким файлом произошла основная ошибка

Причина и действия

Как видно из сообщений в приведенном примере, неполадки возникли в одном из файлов табличного пространства, отвечающего за хранение UNDO-сегментов. Из-за нарушений во внутренней структуре, попытка чтения файла прошла неудачно, что сделало запуск БД невозможным.

Для того, чтобы восстановить структуру табличного пространства, используем команду recover. Для начала, стоит посмотреть в каком состоянии находятся все файлы табличных пространств. Очевидно, что проблемный файл будет находиться в состоянии RECOVER. Делаем восстановление и переводим файл в состояние ONLINE. Для этого:

  1. соединяемся с простаивающим экземпляром и стартуем БД до этапа монтирования включительно, оставляя ее закрытой;
  2. восстанавливаем файл UNDOTBS01.DBF;
  3. переводим его в состояние ONLINE;
  4. открываем БД.
connect / as sysdba
startup mount
-- проверяем состояние файлов табличных пространств (UNDOTBS01.DBF находится в состянии RECOVER)
select file#,status,name from v$datafile;

FILE# STATUS NAME
---------- ------- ----------------------------------------------------------------------------------------
1 SYSTEM ORACLE_BASE/oradata/SID/SYSTEM01.DBF
2 RECOVER ORACLE_BASE/oradata/SID/UNDOTBS01.DBF
3 ONLINE ORACLE_BASE/oradata/SID/TOOLS01.DBF
4 ONLINE ORACLE_BASE/oradata/SID/USERS01.DBF
5 ONLINE ORACLE_BASE/oradata/SID/TEMP01.DBF
6 ONLINE ORACLE_BASE/oradata/SID/SYSAUX01.DBF
7 ONLINE ORACLE_BASE/oradata/SID/USERS01.DBF

-- восстанавливаем файл табличного пространства
recover datafile 2;
-- проверяем что получилось
SQL> select file#,status,name from v$datafile;

FILE# STATUS NAME
---------- ------- ----------------------------------------------------------------------------------------
1 SYSTEM ORACLE_BASE/oradata/SID/SYSTEM01.DBF
2 OFFLINE ORACLE_BASE/oradata/SID/UNDOTBS01.DBF
3 ONLINE ORACLE_BASE/oradata/SID/TOOLS01.DBF
4 ONLINE ORACLE_BASE/oradata/SID/USERS01.DBF
5 ONLINE ORACLE_BASE/oradata/SID/TEMP01.DBF
6 ONLINE ORACLE_BASE/oradata/SID/SYSAUX01.DBF
7 ONLINE ORACLE_BASE/oradata/SID/USERS01.DBF

-- переводим файл в состояни ONLINE
alter database datafile 2 online;
select file#,status,name from v$datafile;

FILE# STATUS NAME
---------- ------- ----------------------------------------------------------------------------------------
1 SYSTEM ORACLE_BASE/oradata/SID/SYSTEM01.DBF
2 ONLINE ORACLE_BASE/oradata/SID/UNDOTBS01.DBF
3 ONLINE ORACLE_BASE/oradata/SID/TOOLS01.DBF
4 ONLINE ORACLE_BASE/oradata/SID/USERS01.DBF
5 ONLINE ORACLE_BASE/oradata/SID/TEMP01.DBF
6 ONLINE ORACLE_BASE/oradata/SID/SYSAUX01.DBF
7 ONLINE ORACLE_BASE/oradata/SID/USERS01.DBF

-- открываем БД
alter database open;