12 февраля 2013

Восстановление части БД (отдельных tablespace) на момент времени при недостатке места. Простая альтернатива TSPITR

Задача:

Восстановить удалённые данные в таблице, при том, что в UNDO её уже нет и воспользоваться flashback мы уже не можем.
Восстановить данные нужно из backup и archivelog, но нет сервера, где можно восстановить БД полностью (нет места). На доступном свободном сервере мы можем поднять только часть БД -- нужное нам табличное простанство.

Этот сценарий является ручной альтернативой процедуре "Tablespace Point-in-Time Recovery (TSPITR)", описанной в главе 21 книги Oracle® Database Backup and Recovery User's Guide
http://docs.oracle.com/cd/E11882_01/backup.112/e10642/rcmtspit.htm 
Отличия этого метода в его простоте и в том, что метод свободен от всех ограничений, присущих TSPITR с auxiliary DB.


Решение:

Клонируем экземпляр, восстанавливаем БД из BACKUP как обычно средствами RMAN.
RECOVERY выполняем частично (ненужные нам табличные простанства переводим в оффлайн) средствами SQL*PLUS

Шаги:
(Далее я предполагаю, что имя экземпляра ORCL на резервном сервере совпадает с именем экземпляра на боевом, иначе -- придется подкорректировать spfile и параметры запуска экземпляра)

Эти шаги выполняются на вспомогательном (не боевом) сервере

1. Подключитесь к БД в RMAN

RMAN> connect target SYS/пароль@ORCL_LOCALHOST

2. Восстановите SPFILE
Обратите внимание, что имя восстановленного файла отличается на символ "1". RMAN не будет востанавливать spfile в тот путь, который был использован при старте экземпляра

RMAN> restore spfile to 'C:\ORACLE\product\11.2.0\dbhome_1\database\SPFILEORCL.ORA1' from '<путь ко FRA>\ORCL\<путь>\<имя файла бэкапа с спфайлом>';

3. Подменим SPFILE -- восстановленный сделаем активным

RMAN> shutdown immediate;

RMAN> host 'copy C:\ORACLE\product\11.2.0\dbhome_1\database\SPFILEORCL.ORA1 C:\ORACLE\product\11.2.0\dbhome_1\database\SPFILEORCL.ORA';

4. Стартуем БД

RMAN> set dbid 3344205742 # укажите ваш DBID -- на боевом select DBID from V$DATABASE

RMAN> startup nomount;

RMAN> restore controlfile from '\\<путь ко FRA>\ORCL\BACKUPSET или AUTOBACKUP\<дата>\<имя файла бэкапа с контролфайлом>'; -- обычно из autobackup

RMAN> alter database mount;

5. Каталогизируем бэкапы и архивлоги, удалив прежние пути:

RMAN> crosscheck backup;

RMAN> delete noprompt expired backup;

RMAN> crosscheck archivelog all;

RMAN> delete noprompt expired archivelog all;

RMAN> catalog start with '<путь ко FRA>\ORCL\';

Проверим, что всё правильно закаталогировалось.
В TOAD, SQL Navigator, SQL Developer или пр., что может отобразить сетку

select * from V$ARCHIVED_LOG where DELETED = 'NO' order by RESETLOGS_CHANGE#, SEQUENCE#
select * from V$BACKUP_PIECE where DELETED = 'NO' order by START_TIME

6. Определяем список номеров датафайлов, которые нужно восстановить.
Это удобно сделать через запросы к V$DATAFILE и V$TABLESPACE
В моем случае -- восстанавливаем # 1, 2, 9, 71 (SYSTEM, SYSAUX, UNDO, нужный мне тейблспейс). Первые три файла (ТП) обязательны к восстановлению.

7. Восстанавливаем нужные датафайлы

RMAN> restore datafile 1,2,9,71;

Далее работаем в SQL*Plus

8. Формируем список отключаемых датафайлов через запрос

select 'alter database datafile '||FILE#||' offline;' from V$DATAFILE where file# not in (1, 2, 9, 71) order by FILE#

Получившийся результат копируем и выполняем в "плюсе":

SQL> alter database datafile 3 offline;
SQL> alter database datafile 4 offline;
...

SQL> alter database datafile 99 offline;
SQL> alter database datafile 100 offline;


9. Приступаем собственно к восстановлению:
Формат даты только такой YYYY-MM-DD:HH24:MI:SS. Также можно сделать until change (в этом случае имеется ввиду номер SCN), until consistent, until cancel.
SQL> recover database until time '2013-02-11:08:00:00' using backup controlfile;

ORA-00279: change 3177249496 generated at 02/10/2013 18:13:54 needed for thread 1
ORA-00289: suggestion : \\<путь>\13_02_10\O1_MF_1_144_8KHKZG55_.ARC
ORA-00280: change 3177249496 for thread 1 is in sequence #144

Specify log: {<RET>=suggested | filename | AUTO | CANCEL}

В ответ на это сообщение набираем
auto
для того, чтобы сервер автоматические выбирал архивлоги для восстановления -- мы все их правильно закаталогизировали на шаге 5. Альтернатива -- набирать путь к каждому архивлогу.
Сообщение:
Log applied.
Media recovery complete.

говорит о том, что всё ОК.

10. Создаём redo-логи, если необходимо:

SQL> alter database clear logfile group 1;
SQL> alter database clear logfile group 2;
SQL> alter database clear logfile group 3;


11. Открываем БД с опцией resetlogs, обязательной для неполного восстановления:

SQL> alter database open resetlogs;

Сообщение:
Database altered.
говорит о том, что всё ОК.

Добавлю, что уже после открытия БД, если нужны другие ТП, можно их восстановить в RMAN:
RMAN> restore datafile 3;
RMAN> recover datafile 3;
RMAN> sql 'alter database datafile 3 online';



Комментариев нет:

Отправить комментарий