Инкарнации базы данных

$ rman target / catalog [email protected]

Новая инкарнация создается при неполном восстановлении базы, когда база открывается с опцией resetlogs. Т.е. данные из redologs удаляются. Вроде как у базы, начинается новая жизнь. Историю жизней базы, можно посмотреть следующими способами.

RMAN> LIST INCARNATION OF DATABASE;


List of Database Incarnations
DB Key  Inc Key DB Name  DB ID            STATUS  Reset SCN  Reset Time
------- ------- -------- ---------------- --- ---------- ----------
1       16      ORCL12   3487575625       PARENT  1          07/07/2014 05:38:47
1       2       ORCL12   3487575625       CURRENT 1594143    16/08/2015 21:29:45


    SQL> select incarnation#, resetlogs_change# from v$database_incarnation;

    INCARNATION# RESETLOGS_CHANGE#
    ------------ -----------------
    	   1		     1
    	   2	       1594143

В общем смысл инкарнаций в том, что база откатывается на какое-то состояние в прошлом и уже с этого состояния идет новая жизнь. Как снапшоты на виртуалках, когда то к одному состоянию откатился, потом к другому. В результате получается какое-то дерево с разными ветками. Насколько это часто используется в базах? нечасто. Ну вот сами подумайте, как можно на production базе делать какие-то откаты и работать с какой-то точки? Должны быть серьезные причины для этого. Видел один или два раза давно как потерян был архив лог а база требовала восстановления. Вот откатывали на состояние предшествующее этому архивлогу и делали инкарнацию. Но, как мне видится, это все были костыли из за того, что не подготовили сервер с доп избыточностью. И делали это исколючительно для того, чтобы не потерять всю базу.


RMAN> backup database;


SQL> create table test as select * from all_objects;


SQL> select count(1) from test;

  COUNT(1)
----------
     89402


 SQL> select current_scn from v$database;

 CURRENT_SCN
 -----------
     1891044


SQL> delete from test;


SQL> commit;


SQL> select current_scn from v$database;

CURRENT_SCN
-----------
    1891093


SQL> drop table test;


SQL> select current_scn from v$database;

CURRENT_SCN
-----------
1891136


SQL> alter system switch logfile;


SQL> select incarnation#, resetlogs_change# from v$database_incarnation;

INCARNATION# RESETLOGS_CHANGE#
------------ -----------------
   1		     1
   2	       1594143


Восстановление к определенному scn в прошлом

SQL> shutdow immediate;
SQL> startup mount;


$ rman target / catalog [email protected]


Восстановление на момент предшествующий удалению таблицы test.
Т.е. должна быть восстановлена таблица, но данных в ней не должно быть.

RUN {
    set until scn=1891093;
    restore database;
    recover database;
}


SQL> select status from v$instance;

STATUS
------------
MOUNTED


SQL> alter database open resetlogs;


SQL> desc test;
 Name					   Null?    Type
 ----------------------------------------- -------- ----------------------------
 OWNER					   NOT NULL VARCHAR2(128)
 OBJECT_NAME				   NOT NULL VARCHAR2(128)
 SUBOBJECT_NAME 				    VARCHAR2(128)
 OBJECT_ID				   NOT NULL NUMBER
 DATA_OBJECT_ID 				    NUMBER
 OBJECT_TYPE					    VARCHAR2(23)
 CREATED				   NOT NULL DATE
 LAST_DDL_TIME				   NOT NULL DATE
 TIMESTAMP					    VARCHAR2(19)
 STATUS 					    VARCHAR2(7)
 TEMPORARY					    VARCHAR2(1)
 GENERATED					    VARCHAR2(1)
 SECONDARY					    VARCHAR2(1)
 NAMESPACE				   NOT NULL NUMBER
 EDITION_NAME					    VARCHAR2(128)
 SHARING					    VARCHAR2(13)
 EDITIONABLE					    VARCHAR2(1)
 ORACLE_MAINTAINED				    VARCHAR2(1)


SQL> select count(1) from test;

  COUNT(1)
----------
	 0


Теперь откатываемся на момент предшествующий удалению данных из таблицы.

RUN {
    set until scn=1891044;
    restore database;
    recover database;
}


executing command: SET until clause
new incarnation of database registered in recovery catalog
starting full resync of recovery catalog
full resync complete

Starting restore at 18/08/2015 08:31:19
RMAN-00571: ===========================================================
RMAN-00569: =============== ERROR MESSAGE STACK FOLLOWS ===============
RMAN-00571: ===========================================================
RMAN-03002: failure of restore command at 08/18/2015 08:31:19
RMAN-06004: ORACLE error from recovery catalog database: RMAN-20208: UNTIL CHANGE is before RESETLOGS change


RMAN> LIST INCARNATION OF DATABASE;


List of Database Incarnations
DB Key  Inc Key DB Name  DB ID            STATUS  Reset SCN  Reset Time
------- ------- -------- ---------------- --- ---------- ----------
1       16      ORCL12   3487575625       PARENT  1          07/07/2014 05:38:47
1       2       ORCL12   3487575625       PARENT  1594143    16/08/2015 21:29:45
1       255     ORCL12   3487575625       CURRENT 1891094    18/08/2015 08:26:32


// пример который должен быть выполнен

RMAN> reset database to incarnation "Inc Key";

// выполняю

RMAN> reset database to incarnation 2;


Повторяю попытку.

RUN {
    set until scn=1891044;
    restore database;
    recover database;
}


SQL> alter database open resetlogs;


SQL> slect count(1) from test;


SQL> select count(1) from test;

  COUNT(1)
----------
     89402


 RMAN> LIST INCARNATION OF DATABASE;

 new incarnation of database registered in recovery catalog
 starting full resync of recovery catalog
 full resync complete

 List of Database Incarnations
 DB Key  Inc Key DB Name  DB ID            STATUS  Reset SCN  Reset Time
 ------- ------- -------- ---------------- --- ---------- ----------
 1       16      ORCL12   3487575625       PARENT  1          07/07/2014 05:38:47
 1       2       ORCL12   3487575625       PARENT  1594143    16/08/2015 21:29:45
 1       335     ORCL12   3487575625       CURRENT 1891045    18/08/2015 08:38:31
 1       255     ORCL12   3487575625       ORPHAN  1891094    18/08/2015 08:26:32