Restaurar el espacio de tabla USERS no funciona. Copia de seguridad de Oracle

Nov 29 2020

Creé un esquema y my_table_test;

ALTER SESSION SET CURRENT_SCHEMA=c##wojtek_admin; 

CREATE TABLE my_table_test
( id_test INT 
);

Luego creé una copia de seguridad usando: BACKUP TABLESPACE USERS FORMAT 'c:\FRA\users%u';Luego solté my_table_test y ejecuté los siguientes comandos:

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

¿Por qué my_table_test se descarta después de restaurar USERS TABLESPACE?

Respuestas

BjarteBrandt Nov 29 2020 at 15:14

En una base de datos de varios inquilinos, tendrá varios espacios de tabla 'USERS'. Uno a nivel de CDB y uno para cada 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

¡Nota! La mejor característica de RMAN. RMAN realmente puede decirle qué hacer en diferentes escenarios.

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

Primero, es importante tener en cuenta que parece que está usando una base de datos de múltiples inquilinos, pero ha decidido colocar los datos del usuario dentro del contenedor raíz, esto generalmente es una mala idea; debería usar una base de datos conectable para casi todo ( esto también significará que no necesita prefijar sus nombres de usuario con C##.

Sus declaraciones de restauración y recuperación recuperarán el espacio de tabla hasta ahora. Si desea recuperarlo antes de soltar el espacio de tabla, Oracle también deberá trabajar en el systemespacio de tabla (para el diccionario de datos), pero no solo desea restaurar y recuperar su USERSespacio de tabla. Debería restaurar su copia de seguridad en otro lugar, recuperarla en el punto deseado, luego tomar el USERSespacio de tabla y volver a colocarlo en su base de datos original.

Esto se conoce simplemente como Tablespace Point In Time Recovery, Oracle ha hecho todo el trabajo de creación de scripts por usted, pero debe leer lo que está sucediendo. https://docs.oracle.com/cd/E11882_01/backup.112/e10642/rcmtspit.htm#BRADV89790

RECOVER TABLESPACE users
  UNTIL ?
  AUXILIARY DESTINATION '?';

(Una vez que haya leído los documentos, verá cómo completar esto).

También existe la posibilidad de hacer esto fácilmente a nivel de tabla, por lo que si solo desea recuperar esa tabla eliminada y no revertir todo lo demás en ese espacio de tabla, puede:

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

Ver https://oracle-base.com/articles/12c/rman-table-point-in-time-recovery-12cr1 para mas detalles.