Oracle Live

25/08/2016

Troubleshooting – Recover current redolog

Filed under: Troubleshooting — mogukiller @ 10:13 am
Tags:

Seguramente de lo peor que te puede ocurrir en una base de datos es que por error te borren los redolog y entre ellos el que esta current aun con transacciones pendientes. En este post indico la forma de reproducir el error y luego corregirlo.

Como se puede ver al final, la foto de los datos puede llegar a ser inconsistente, pudiendo aparecer transacciones pendientes de commit. Siempre es recomendable tomar un backup lógico y recrear nuestra base de datos.

'
- 1. Generamos transacciones.
- 2. Miramos el redo en estado current.
- 3. Shutdown abort de la instancia.
- 4. Borramos fisicamente el redo. 
- 5. startup de la base de datos.
'

-- Foto antes de la perdida
/*
 ID_NOMBRE NOMBRE     STATUS
---------- ---------- --------
		 1 Luis		  OLD
		 2 Miguel	  OLD
*/

-- Generamos transacciones pendientes de commit.
/*
 ID_NOMBRE NOMBRE     STATUS
---------- ---------- --------
         1 a          NEW
         2 b          NEW
         3 C          NEW
         2 Miguel     OLD
*/

-- Simulamos la perdida del current redolog.
SQL> shutdown abort

# rm -f /recovery_area/PRUEBA/onlinelog/PRUEBA_PF_RDO_T1G03M1.log	 
		 
-- SALIDA del Alert
/*
Beginning crash recovery of 1 threads
Started redo scan
Errors in file /export/oracle/app/oracle/diag/rdbms/prueba/PRUEBA/trace/PRUEBA_ora_5328.trc:
ORA-00313: fallo de apertura para miembros del grupo log 1 del thread 1
ORA-00312: log online 1 thread 1: '/recovery_area/PRUEBA/onlinelog/PRUEBA_PF_RDO_T1G01M1.log'
ORA-27037: no se ha podido obtener el estado del archivo
Linux-x86_64 Error: 2: No such file or directory
*/

-- Intentamos hacer un recover until cancel.

SQL> RECOVER DATABASE UNTIL CANCEL;
/*
15:14:52 Specify log: {<RET>=suggested | filename | AUTO | CANCEL}
CANCEL
ORA-01547: advertencia: RECOVER ha funcionado correctamente pero OPEN RESETLOGS obtendría el siguiente error
ORA-01194: el archivo 1 necesita más recuperación para ser consistente
ORA-01110: archivo de datos 1: '/export/oracle/app/oracle/oradata/PRUEBA/PRUEBA_PF_SYS_01.dbf'
ORA-01112: recuperación del medio físico no iniciada
*/

SQL> alter system set "_allow_resetlogs_corruption"=true scope=spfile;
SQL> alter system set undo_management='MANUAL' scope=spfile;

SQL> SHUTDOWN ABORT;
SQL> STARTUP MOUNT;

SQL> ALTER DATABASE OPEN RESETLOGS;

/* SALIDA ALERT EG
RESETLOGS is being done without consistancy checks. This may result in a corrupted database. The database should be recreated.
RESETLOGS after incomplete recovery UNTIL CHANGE 14803244

Checker run found 5 new persistent data failures

Errors in file /export/oracle/app/oracle/diag/rdbms/prueba/PRUEBA/trace/PRUEBA_smon_3973.trc  (incident=608146):
ORA-00600: internal error code, arguments: [2033], [11], [3], [20996376], [0], [14803453], [1], [0], [], [], [], []

ORACLE Instance PRUEBA (pid = 16) - Error 600 encountered while recovering transaction (9, 13) on object 24877.
Errors in file /export/oracle/app/oracle/diag/rdbms/prueba/PRUEBA/trace/PRUEBA_smon_3973.trc:
ORA-00600: internal error code, arguments: [2033], [11], [3], [20996376], [0], [14803453], [1], [0], [], [], [], []
Fri Jul 31 12:47:15 2015

Completed: alter database open resetlogs

ORA-00600: internal error code, arguments: [2662], [0], [14803337], [0], [14803453], [20996376], [], [], [], [], [], [] <<<< Muestra el GAP entre los los parametros 3 y 4.
Fatal internal error happened while SMON was doing active transaction recovery.
ORA-00600: internal error code, arguments: [2662], [0], [14803337], [0], [14803453], [20996376], [], [], [], [], [], []
SMON (ospid: 3973): terminating the instance due to error 474

Instance terminated by SMON, pid = 3973
*/

SQL> startup

/*
Block recovery from logseq 2, block 6 to scn 14823343
Block recovery completed at rba 2.6.16, scn 0.14823344
ORACLE Instance PRUEBA (pid = 16) - Error 607 encountered while recovering transaction (9, 13) on object 24877.
ORA-00607: Internal error occurred while making a change to a data block
ORA-00600: internal error code, arguments: [kdBlkCheckError], [5], [24856], [6101], [], [], [], [], [], [], [], []
*/

'-- Queremos hacer un backup o consultar los datos antiguos'

12:59:53 PRUEBA SQL>SELECT * FROM TPCC.NOMBRES;
/*
SELECT * FROM TPCC.NOMBRES
                   *
ERROR at line 1:
ORA-00607: Se ha producido un error interno al realizar un cambio en un bloque de datos
ORA-00600: código de error interno, argumentos: [kdBlkCheckError], [5], [24856], [6101], [], [], [], [], [], [], [], []
*/

create undo tablespace UNDOTBS2 datafile '/export/oracle/app/oracle/oradata/PRUEBA/PRUEBA_PF_UNDO_I2_01.dbf' size 100M;
alter system set undo_tablespace='UNDOTBS2' scope=spfile;
alter system set undo_management='AUTO' scope=spfile;
shutdown abort
startup

'nota: todos los procesos de query, expdp o exp me fallan con este error'

/*
ORA-02354: error al exportar/importar datos
ORA-00607: Se ha producido un error interno al realizar un cambio en un bloque de datos
ORA-00600: código de error interno, argumentos: [kdBlkCheckError], [5], [24856], [6101], [], [], [], [], [], [], [], [
*/

13:22:13 PRUEBA SQL>select  segment_name,status from  dba_rollback_segs where    status = 'NEEDS RECOVERY';
/*
SEGMENT_NAME                   STATUS
------------------------------ ----------------
_SYSSMU9_3677326883$           NEEDS RECOVERY
*/

select owner, segment_name, tablespace_name, status from dba_rollback_segs order by 3;

alter rollback segment "_SYSSMU15_3655531204$" offline;
alter rollback segment "_SYSSMU1_799419538$"   offline;
alter rollback segment "_SYSSMU2_762752493$"   offline;
alter rollback segment "_SYSSMU3_2234984183$"  offline;
alter rollback segment "_SYSSMU4_1747850823$"  offline;
alter rollback segment "_SYSSMU5_3980295112$"  offline;
alter rollback segment "_SYSSMU6_2657453794$"  offline;
alter rollback segment "_SYSSMU7_206424761$"   offline;
alter rollback segment "_SYSSMU8_572335496$"   offline;
alter rollback segment "_SYSSMU9_3677326883$"  offline; <<<<<<<
alter rollback segment "_SYSSMU14_2565333778$" offline;
alter rollback segment "_SYSSMU13_1877795591$" offline;
alter rollback segment "_SYSSMU12_2493254171$" offline;
alter rollback segment "_SYSSMU11_2969317523$" offline;
alter rollback segment "_SYSSMU10_1222709279$" offline;

13:33:51 PRUEBA SQL>drop tablespace UNDOTBS01 including contents and datafiles;
/*
drop tablespace UNDOTBS01 including contents and datafiles
*
ERROR at line 1:
ORA-01548: encontrado segmento de rollback activo '_SYSSMU9_3677326883$'; termine el borrado del tablespace
*/

*.undo_management='MANUAL'
*.undo_tablespace='SYSTEM'
*._offline_rollback_segments='_SYSSMU9_3677326883$'
*_corrupted_rollback_segments'_SYSSMU9_3677326883$'

SQL>startup pfile='/tmp/initPRUEBA.ora';

13:55:49 PRUEBA SQL>select owner, segment_name, tablespace_name, status from dba_rollback_segs order by 3;

OWNER  SEGMENT_NAME                   TABLESPACE_NAME                STATUS
------ ------------------------------ ------------------------------ ----------------
SYS    SYSTEM                         SYSTEM                         ONLINE
PUBLIC _SYSSMU15_3655531204$          UNDOTBS01                      OFFLINE
PUBLIC _SYSSMU10_1222709279$          UNDOTBS01                      OFFLINE
PUBLIC _SYSSMU11_2969317523$          UNDOTBS01                      OFFLINE
PUBLIC _SYSSMU12_2493254171$          UNDOTBS01                      OFFLINE
PUBLIC _SYSSMU13_1877795591$          UNDOTBS01                      OFFLINE
PUBLIC _SYSSMU14_2565333778$          UNDOTBS01                      OFFLINE
PUBLIC _SYSSMU18_2576346761$          UNDOTBS2                       OFFLINE
PUBLIC _SYSSMU17_3662071219$          UNDOTBS2                       OFFLINE
PUBLIC _SYSSMU19_3289349665$          UNDOTBS2                       OFFLINE
PUBLIC _SYSSMU20_1043400825$          UNDOTBS2                       OFFLINE
PUBLIC _SYSSMU21_999573600$           UNDOTBS2                       OFFLINE
PUBLIC _SYSSMU22_3981902809$          UNDOTBS2                       OFFLINE
PUBLIC _SYSSMU23_2417896396$          UNDOTBS2                       OFFLINE
PUBLIC _SYSSMU16_3284331143$          UNDOTBS2                       OFFLINE
PUBLIC _SYSSMU25_2001940114$          UNDOTBS2                       OFFLINE
PUBLIC _SYSSMU24_79372491$            UNDOTBS2                       OFFLINE

drop tablespace UNDOTBS01 including contents and datafiles;

Tablespace dropped.

shutdown abort

*.undo_management='AUTO'
*.undo_tablespace='UNDOTBS2'

startup pfile='/tmp/initPRUEBA.ora';


/*
 ID_NOMBRE NOMBRE     STATUS      ID_NOMBRE NOMBRE      STATUS
---------- ---------- ------     ------------ ----------- ---------
         1 a          NEW              1 a           NEW
         2 b          NEW              3 C           NEW
         3 C          NEW              1 Luis        OLD
         2 Miguel     OLD              2 Miguel      OLD
*/

Dejar un comentario »

Aún no hay comentarios.

RSS feed for comments on this post. TrackBack URI

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s

Crea un blog o un sitio web gratuitos con WordPress.com.

A %d blogueros les gusta esto: