Июн 022011
 

Кто-то навредил в схеме так, что восстановлению она не подлежит. Flashback на базе не используется, поэтому единственный выход - TSPITR (Tablespace point-in-time recovery), т.е. восстановление табличного пространства на определённый момент времени в прошлом. С помощью ретроспективного терморектального аудита (этот способ я пока не описывал, вот всё, что у меня есть по данной тематике) определён момент в прошлом, когда всё было нормально: 26 мая, 00:00.

Приступим:

  1. Первым делом создадим новый ORACLE_HOME на другом сервере, просто скопируем файлы с основного:

    cd $ORACLE_HOME
    tar -cvf - . | ssh oracle@srv2 'cd /orabackup; tar xf -'
  2. У меня путь ORACLE_HOME на новом сервере отличается, поэтому мне пришлось создать софтлинк на новый каталог по старому пути, чтобы не перелинковывать бинарники.
  3. Копируем контрольный файл из бэкапа (backup controlfile) поверх существующих.
  4. База у нас временная, поэтому у нас все файлы данных будут безобразно валяться прямо в ORACLE_HOME, туда же будут писаться архивные логи, трейсы, и alert log.

    STARTUP NOMOUNT;
    ALTER SYSTEM SET background_dump_dest = '?';
    ALTER SYSTEM SET core_dump_dest = '?';
    ALTER SYSTEM SET user_dump_dest = '?';
    ALTER SYSTEM SET log_archive_dest_1 = 'location=? mandatory';
  5. Путь к файлам данных поменялся, поэтому надо установить пару параметров:

    CREATE PFILE FROM SPFILE;
    SHUTDOWN ABORT;

    И в созданный pfile добавляем правила переименования:

    log_file_name_convert= ('/dev/vx/rdsk/proddb/', '/orabackup/')
    db_file_name_convert = ('/dev/vx/rdsk/proddb/', '/orabackup/')
    
  6. Запускаем базу в режиме clone:

    STARTUP NOMOUNT;
    ALTER DATABASE MOUNT CLONE DATABASE;
  7. Теперь запускаем RMAN и восстанавливаем 3 пространства: system, undo и наше испорченное - prod_ts (в этом примере используется Veritas NetBackup for Oracle):

    CONNECT CLONE sys
    RUN 
    { 
    	SET UNTIL TIME "to_date ('26-may-11 02:10:00' , 'dd-mon-yy hh24:mi:ss')" ;
    	ALLOCATE CLONE CHANNEL t1 TYPE 'sbt_tape'; 
    	ALLOCATE CLONE CHANNEL t2 TYPE 'sbt_tape'; 
    	SEND 'NB_ORA_SERV = nbsrv, NB_ORA_CLIENT = proddb';
     
    	SET NEWNAME FOR DATAFILE 1  TO '/orabackup/proddb_system01.dbf';
    	SET NEWNAME FOR DATAFILE 25 TO '/orabackup/proddb_system02.dbf';
    	SET NEWNAME FOR DATAFILE 41 TO '/orabackup/proddb_system03.dbf';
    	SET NEWNAME FOR DATAFILE 54 TO '/orabackup/proddb_system04.dbf';
    	SET NEWNAME FOR DATAFILE 4  TO '/orabackup/proddb_prod_ts_01.dbf';
    	SET NEWNAME FOR DATAFILE 78 TO '/orabackup/proddb_undo_01.dbf';
    	SET NEWNAME FOR DATAFILE 93 TO '/orabackup/proddb_undo_02.dbf';
     
    	RESTORE CLONE DATAFILE 1, 25, 41, 54, 4, 78, 93;
     
    	SWITCH CLONE DATAFILE ALL;
    	SQL CLONE "ALTER DATABASE DATAFILE 1 ONLINE";
    	SQL CLONE "ALTER DATABASE DATAFILE 25 ONLINE";
    	SQL CLONE "ALTER DATABASE DATAFILE 41 ONLINE";
    	SQL CLONE "ALTER DATABASE DATAFILE 54 ONLINE";
    	SQL CLONE "ALTER DATABASE DATAFILE 4 ONLINE";
    	SQL CLONE "ALTER DATABASE DATAFILE 78 ONLINE";
    	SQL CLONE "ALTER DATABASE DATAFILE 93 ONLINE";
     
    	RECOVER CLONE DATABASE TABLESPACE SYSTEM, undotbs, prod_ts DELETE ARCHIVELOG; 
     
    	RELEASE CHANNEL t1 ; 
    	RELEASE CHANNEL t2 ; 
    }

    Если полный бэкап был давно и на базе большая активность, то процесс может затянуться.

    * Вот ссылка на подробное объяснение, как заставить NetBackup восстанавливать данные на другой сервер (замечание относится к строке SEND 'NB_ORA_SERV = nbsrv, NB_ORA_CLIENT = proddb';)

  8. RMAN отработал нормально, но в конце выдал ошибку:

    ORA-01547: warning: RECOVER succeeded but OPEN RESETLOGS would get error below
    ORA-01152: file 1 was not restored from a sufficiently old backup
    ORA-01110: data file 1: '/orabackup/proddb_system01.dbf'

    Пересоздаём control file:

    ALTER DATABASE BACKUP CONTROLFILE TO TRACE;

    И из полученного трейса берём скрипт для пересоздания control file (нас интересует случай с RESETLOGS) и правим его, удаляя все файлы кроме тех, которые мы восстановили.

  9. Добавим временное табличное пространство:

    CREATE TEMPORARY TABLESPACE tmp TEMPFILE '/orabackup/proddb_temp.dbf' SIZE 1024m;
    ALTER DATABASE DEFAULT TEMPORARY TABLESPACE tmp;
  10. Теперь можно произвести экспорт испорченной схемы и импорт её в рабочую базу.

 Leave a Reply

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong> <pre lang="" line="" escaped="" cssfile="">

(обязательно)

(обязательно)