All Things Oracle

Desapareció mi tabla, confiesen: ¿quién fue?

Seguramente que alguna vez has pasado por algo similar, alguien eliminó alguna tabla, índice, usuario, borró información o la modificó y luego, cuando los problemas aparecen, nadie confiesa, “yo no estaba”, “yo hace tiempo que ni me conecto a la base de datos”, “debe ser un bug de Oracle”, son algunas de las cosas que nos irán respondiendo cuando hacemos las indagaciones. ¿Qué hago si no tengo la auditoria habilitada, ni triggers que hagan seguimiento? Simple: usar LogMiner.

LogMiner, que es parte de Oracle Database, permite consultar la información contenida en los online y archived redo logs haciendo uso de SQL. Recordemos que en los redo log files se registra información sobre la actividad en la base de datos.

Veamos, mediante un ejemplo, cómo podríamos beneficiarnos de él para nuestro caso hipotético:

1. Marco se conecta a desarrollo y decide borrar una tabla que había copiado para hacer unas pruebas.

MARCO@orcl> drop table oltp.importante;
Table dropped.

2. Se empiezan a recibir llamadas de queja por una aplicación fallando permanentemente y revisando los logs se encuentra que la tabla oltp.importante ha sido eliminada. Marco siente un nudo en la garganta mientras piensa “¿será posible que me haya conectado a producción en lugar de a desarrollo?”.

3. Todos niegan la autoría de tal error, habrá que investigar con LogMiner, para ello primero se registran los online redo logs.

SYS@orcl>  begin
  2  dbms_logmnr.add_logfile(
  3    '/logs/redo01.log', dbms_logmnr.new );
  4  dbms_logmnr.add_logfile(
  5    '/logs/redo02.log', dbms_logmnr.addfile );
  6  dbms_logmnr.add_logfile(
  7    '/logs/redo03.log', dbms_logmnr.addfile );
  8  end;
  9  /
PL/SQL procedure successfully completed.
4. Se activa la minería.
SYS@orcl> select scn, timestamp, username, sql_redo
  2  from v$logmnr_contents
  3  where seg_owner='OLTP'
  4  and seg_name='IMPORTANTE'
  5  and operation = 'DDL';

    SCN TIMESTAMP           USERNAME
------- ------------------- ----------
SQL_REDO
----------------------------------------------------------------------------
3720771 04/09/2008 15:16:52 MARCO
ALTER TABLE "OLTP"."IMPORTANTE" RENAME TO "BIN$VheiNLbMC5bgQKjAMndYmA==$0" ;
3720771 04/09/2008 15:16:52 MARCO
drop table oltp.importante AS "BIN$VheiNLbMC5bgQKjAMndYmA==$0" ;
5. Buscamos DDLs sobre la tabla en cuestión.
SYS@orcl>  begin
  2  dbms_logmnr.add_logfile(
  3    '/logs/redo01.log', dbms_logmnr.new );
  4  dbms_logmnr.add_logfile(
  5    '/logs/redo02.log', dbms_logmnr.addfile );
  6  dbms_logmnr.add_logfile(
  7    '/logs/redo03.log', dbms_logmnr.addfile );
  8  end;
  9  /
PL/SQL procedure successfully completed.

6. Marco, ¿qué dijiste que estabas haciendo a eso de las 3pm ?

Acabamos de ver a LogMiner en acción, pero esto es solo una fracción de lo que podemos hacer, si deseas saber más de su uso y posibilidades, encontrarás todo lo que necesitas en el manual Oracle Database Utilities.

¿Te pareció interesante este artículo?, ¿te quedaron algunas dudas?, ¿quieres sugerirme un tema a tratar?, pues déjame tus comentarios o ¡contáctame ahora mismo!

Agregue un comentario

Su dirección de correo no se hará público. Los campos requeridos están marcados *

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.

Posts Relacionados

Primer post de una serie dedicada al arte de parchar Oracle. Empezamos con el parchado in-place, la forma más común y también la más peligrosa.
Aprenda a descargar los parches de Oracle, tanto manualmente como de forma automatizada, usando el utilitario getMOSPatch.
Link a articulo publicado en Toad World, sobre como aplicar un patch out-of-place a Grid Infrastructure, usando un Golden Image.

¿Necesitas Ayuda?

Completa estos datos y estaré en contacto a la brevedad.