Восстановить табличное пространство USERS не работает. Резервное копирование Oracle

Nov 29 2020

Я создал схему и my_table_test;

ALTER SESSION SET CURRENT_SCHEMA=c##wojtek_admin; 

CREATE TABLE my_table_test
( id_test INT 
);

Затем я создал резервную копию, используя: BACKUP TABLESPACE USERS FORMAT 'c:\FRA\users%u';Затем я сбросил my_table_test и запустил следующие команды:

RMAN> RUN{
2> SQL 'ALTER TABLESPACE USERS OFFLINE';
3> RESTORE TABLESPACE USERS;
4> RECOVER TABLESPACE USERS;
5> SQL 'ALTER TABLESPACE USERS ONLINE';
6> }

Почему my_table_test удаляется после восстановления USERS TABLESPACE?

Ответы

BjarteBrandt Nov 29 2020 at 15:14

В многопользовательской базе данных у вас будет несколько табличных пространств USERS. Один на уровне CDB и по одному для каждой PDB.

RMAN> report schema;

Report of database schema for database with db_unique_name T101N

List of Permanent Datafiles
===========================
File Size(MB) Tablespace           RB segs Datafile Name
---- -------- -------------------- ------- ------------------------
1    960      SYSTEM               YES     +DATAC4/T101N/DATAFILE/system.500.1057688607
3    620      SYSAUX               NO      +DATAC4/T101N/DATAFILE/sysaux.498.1057688643
4    840      UNDOTBS1             YES     +DATAC4/T101N/DATAFILE/undotbs1.587.1057688657
5    310      PDB$SEED:SYSTEM NO +DATAC4/T101N/86B637B62FE07A65E053F706E80A27CA/DATAFILE/system.482.1057689319 6 380 PDB$SEED:SYSAUX      NO      +DATAC4/T101N/86B637B62FE07A65E053F706E80A27CA/DATAFILE/sysaux.503.1057689319
7    5        USERS                NO      +DATAC4/T101N/DATAFILE/users.499.1057688659
8    190      PDB$SEED:UNDOTBS1 NO +DATAC4/T101N/86B637B62FE07A65E053F706E80A27CA/DATAFILE/undotbs1.489.1057689319 9 310 PDB1:SYSTEM YES +DATAC4/T101N/B52F60948095635FE053B506330A63CA/DATAFILE/system.405.1057690077 10 390 PDB1:SYSAUX NO +DATAC4/T101N/B52F60948095635FE053B506330A63CA/DATAFILE/sysaux.501.1057690077 11 195 PDB1:UNDOTBS1 YES +DATAC4/T101N/B52F60948095635FE053B506330A63CA/DATAFILE/undotbs1.497.1057690077 12 5 PDB1:USERS NO +DATAC4/T101N/B52F60948095635FE053B506330A63CA/DATAFILE/users.566.1057690091 List of Temporary Files ======================= File Size(MB) Tablespace Maxsize(MB) Tempfile Name ---- -------- -------------------- ----------- -------------------- 1 67 TEMP 32767 +DATAC4/T101N/TEMPFILE/temp.573.1057688719 2 43 PDB$SEED:TEMP        32767       +DATAC4/T101N/B52F34797E9D6750E053B506330AE7C0/TEMPFILE/temp.481.1057689337
3    43       PDB1:TEMP            32767       +DATAC4/T101N/B52F60948095635FE053B506330A63CA/TEMPFILE/temp.496.1057690079

Запись! Лучшая особенность RMAN. RMAN может сказать вам, что делать в разных сценариях.

# data recovery advisor (DRA)
list failure all;
advise failure;
repair failure preview;
repair failure;
AndrewSayer Nov 30 2020 at 00:25

Во-первых, важно отметить, что похоже, что вы используете многопользовательскую базу данных, но вы решили поместить пользовательские данные в корневой контейнер, это, как правило, плохая идея - вы должны использовать подключаемую базу данных практически для всего ( это также будет означать, что вам не нужно добавлять к своим именам пользователей префиксы C##.

Ваши операторы восстановления и восстановления будут восстанавливать табличное пространство до сих пор. Если вы хотите восстановить его до того, как вы удалили табличное пространство, Oracle также необходимо будет поработать с systemтабличным пространством (для словаря данных), но вы хотите не только восстановить и восстановить свое USERSтабличное пространство. Вам нужно будет восстановить резервную копию в другом месте, восстановить ее до нужной точки, затем взять USERSтабличное пространство и вернуть его в исходную базу данных.

Это просто называется восстановлением табличного пространства на момент времени, Oracle услужливо выполнила всю сложную работу по написанию сценариев за вас, но вы должны прочитать, что происходит https://docs.oracle.com/cd/E11882_01/backup.112/e10642/rcmtspit.htm#BRADV89790

RECOVER TABLESPACE users
  UNTIL ?
  AUXILIARY DESTINATION '?';

(После прочтения документации вы увидите, как это заполнить).

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

RECOVER TABLE c##wojtek_admin.my_table_test
UNTIL ?
AUXILIARY DESTINATION '?'  ;

Видеть https://oracle-base.com/articles/12c/rman-table-point-in-time-recovery-12cr1 для получения дополнительной информации.