Не могу поднять базу по архивлогам, ошибка ORA-01547, ORA-01245

c0re
Дата: 08.10.2015 19:03:28
Oracle 9i on Linux RHEL 4
имеются старе холодные копии от 2015-05-08 и старее + архивлоги
копия от 2015-05-08 нормальная, проверено, поднимается работает.
текущее состояние базы так же сохранил.

случилось...
"упал" один из винтов и унес с собой все индексы + реду на этом диске (redo2)
автор
LOGFILE
GROUP 1 (
'/oradata/KTSR/redo/redo01.log',
'/oradata/KTSR/redo2/redo01.log',
'/oradata/KTSR/redo3/redo01.log'
) SIZE 100M,
GROUP 2 (
'/oradata/KTSR/redo/redo02.log',
'/oradata/KTSR/redo2/redo02.log',
'/oradata/KTSR/redo3/redo02.log'
) SIZE 100M,
GROUP 3 (
'/oradata/KTSR/redo/redo03.log',
'/oradata/KTSR/redo2/redo03.log',
'/oradata/KTSR/redo3/redo03.log'
) SIZE 100M


но я так понимаю они дублируются по другим местоположениям.

распаковываю старую холодную копию от 2015-05-08, пытаюсь накатить архивлоги,
recover automatic database until time '2015-08-DD:HH:MM:SS';

но восстановление на любой момент времени, даже за пару недель до предполагаемого краха, всегда заканчивается подобной ошибкой:

автор
ORA-01547: warning: RECOVER succeeded but OPEN RESETLOGS would get error below
ORA-01245: offline file 8 will be lost if RESETLOGS is done
ORA-01110: data file 8: '/oradata/KTSR/idx/saridx01.dbf'


в алертлоге на этот момент:
автор
ORA-00313: open failed for members of log group 3 of thread 1
Thu Oct 8 13:51:42 2015
Recovery of Online Redo Log: Thread 1 Group 3 Seq 1270 Reading mem 0
Mem# 0 errs 0: /oradata/KTSR/redo/redo03.log
Mem# 2 errs 0: /oradata/KTSR/redo3/redo03.log
Terminal Recovery: done UNTIL CHANGE 604656662
ORA-1547 signalled during: ALTER DATABASE RECOVER automatic database until t...


попробовал ее открыть в NORESETLOGS

SQL> ALTER DATABASE OPEN;
ALTER DATABASE OPEN
*
ERROR at line 1:
ORA-01589: must use RESETLOGS or NORESETLOGS option for database open


SQL> alter database open noresetlogs;
alter database open noresetlogs
*
ERROR at line 1:
ORA-01113: file 1 needs media recovery
ORA-01110: data file 1: '/oradata/KTSR/data/system01.dbf'


SQL> recover datafile 1;
Media recovery complete.
SQL> alter database open;
alter database open
*
ERROR at line 1:
ORA-01113: file 2 needs media recovery
ORA-01110: data file 2: '/oradata/KTSR/undo/undotbs01.dbf'


SQL> recover datafile 2;
Media recovery complete.
SQL> alter database open;
alter database open
*
ERROR at line 1:
ORA-01113: file 3 needs media recovery
ORA-01110: data file 3: '/oradata/KTSR/data/drsys01.dbf'


SQL> recover datafile 3
Media recovery complete.
SQL> alter database open;
alter database open
*
ERROR at line 1:
ORA-01113: file 4 needs media recovery
ORA-01110: data file 4: '/oradata/KTSR/data/tools01.dbf'


SQL> recover datafile 4
Media recovery complete.
SQL> alter database open;
alter database open
*
ERROR at line 1:
ORA-01113: file 5 needs media recovery
ORA-01110: data file 5: '/oradata/KTSR/data/users01.dbf'


SQL> recover datafile 5;
Media recovery complete.
SQL> alter database open;
alter database open
*
ERROR at line 1:
ORA-01113: file 6 needs media recovery
ORA-01110: data file 6: '/oradata/KTSR/data/xdb01.dbf'


SQL> recover datafile 6
Media recovery complete.
SQL> alter database open
  2  ;
alter database open
*
ERROR at line 1:
ORA-01113: file 7 needs media recovery
ORA-01110: data file 7: '/oradata/KTSR/data/sardata01.dbf'


SQL> recover datafile 7;
Media recovery complete.
SQL> alter database open;
alter database open
*
ERROR at line 1:
ORA-01113: file 9 needs media recovery
ORA-01110: data file 9: '/oradata/KTSR/data/sarlog01.dbf'


SQL> recover datafile 9;
Media recovery complete.
SQL> alter database open;
alter database open
*
ERROR at line 1:
ORA-01113: file 10 needs media recovery
ORA-01110: data file 10: '/oradata/KTSR/data/sarprov01.dbf'


SQL> recover datafile 10
Media recovery complete.
SQL> alter database open;
alter database open
*
ERROR at line 1:
ORA-01113: file 11 needs media recovery
ORA-01110: data file 11: '/oradata/KTSR/data/sartc01.dbf'


SQL> recover datafile 11
Media recovery complete.
SQL> alter database open;

Database altered.


вроде открылась, но... индексы не подхватились, клиент не подключается.
в TOADовском запросе
SELECT   t.tablespace_name "Tablespace", 'Datafile' "File Type",
         t.status "Tablespace Status", d.status "File Status",
         ROUND ((d.max_bytes - NVL (f.sum_bytes, 0)) / 1024 / 1024,
                2
               ) "Used MB",
         ROUND (NVL (f.sum_bytes, 0) / 1024 / 1024, 2) "Free MB",
         t.initial_extent "Initial Extent", t.next_extent "Next Extent",
         t.min_extents "Min Extents", t.max_extents "Max Extents",
         t.pct_increase "Pct Increase",
         SUBSTR (d.file_name, 1, 80) "Datafile name"
    FROM (SELECT   tablespace_name, file_id, SUM (BYTES) sum_bytes
              FROM dba_free_space
          GROUP BY tablespace_name, file_id) f,
         (SELECT   tablespace_name, file_name, file_id, MAX (BYTES) max_bytes,
                   status
              FROM dba_data_files
          GROUP BY tablespace_name, file_name, file_id, status) d,
         dba_tablespaces t
   WHERE t.tablespace_name = d.tablespace_name
     AND f.tablespace_name(+) = d.tablespace_name
     AND f.file_id(+) = d.file_id
GROUP BY t.tablespace_name,
         d.file_name,
         t.initial_extent,
         t.next_extent,
         t.min_extents,
         t.max_extents,
         t.pct_increase,
         t.status,
         d.max_bytes,
         f.sum_bytes,
         d.status
UNION ALL
SELECT   h.tablespace_name, 'Tempfile', ts.status, t.status,
         ROUND (SUM (NVL (p.bytes_used, 0)) / 1048576, 2),
         ROUND (  SUM ((h.bytes_free + h.bytes_used) - NVL (p.bytes_used, 0))
                / 1048576,
                2
               ),
         -1,                                                 -- initial extent
            -1,                                              -- initial extent
               -1,                                              -- min extents
                  -1,                                           -- max extents
                     -1,                                       -- pct increase
                        t.file_name
    FROM SYS.v_$temp_space_header h,
         SYS.v_$temp_extent_pool p,
         SYS.dba_temp_files t,
         SYS.dba_tablespaces ts
   WHERE p.file_id(+) = h.file_id
     AND p.tablespace_name(+) = h.tablespace_name
     AND h.file_id = t.file_id
     AND h.tablespace_name = t.tablespace_name
     AND ts.tablespace_name = h.tablespace_name
GROUP BY h.tablespace_name, t.status, t.file_name, ts.status
ORDER BY 1, 5 DESC


для файлов SAR_IDX все размеры по нулям, буд-то их нет, но они есть и читаются и пишутся прекрасно (на уровне файловой системы)
думается что какая-то бодяга с контроллами... ? :(
как вылечить?
klrwmtoim
Дата: 08.10.2015 19:31:50
c0re,

Вытащить структуру индексов, дропнуть потерянное табличное пространство, пересоздать его, пересоздать индексы.
mefman
Дата: 08.10.2015 20:28:14
klrwmtoim
c0re,

Вытащить структуру индексов, дропнуть потерянное табличное пространство, пересоздать его, пересоздать индексы.


если там только индексы...
Victor V
Дата: 08.10.2015 21:38:53
recover ..... using backup controlfile;
пробовали?
постит тривиальное
Дата: 09.10.2015 00:35:00
Не очень понятно, почему Oracle считает датафайл 8 офлайн? Он появился после создания майской копии? И ещё непонятна ругань на "ORA-00313: open failed for members of log group 3 of thread 1" - надо дохлые копии redo удалить перед восстановлением.

Вообще, при archive log если ТП SYSTEM, UNDO, хотя бы по одной реплике контрольных файлов с redo остались живыми, то можно восстановить дохлые датафайлы прямо на работающем экземпляре.
постит тривиальное
Дата: 09.10.2015 00:43:16
Собственно, вся процедура: http://docs.oracle.com/cd/B10501_01/server.920/a96572/osrestore.htm#16817

Перевести ТП в офлайн, скопировать датафайл с бекапа, recover tablespace X (потребуются логи с момента бекапа) и перевести ТП в онлайн.

Если дисковый диск под /oradata/KTSR/idx дохлый, то датафайл можно переименовать в базе (ALTER DATABASE RENAME FILE 'X' to 'Y') или сделать симлинк