viernes, 17 de octubre de 2008

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

Seguramente que alguna vez has pasado 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, ques 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 como 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.
  2. MARCO@orcl> drop table oltp.importante;
    Table dropped.
  3. 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?".
  4. Todos niegan la autoría de tal error, habrá que investigar con LogMiner, para ello primero se registran los online redo logs.
  5. 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. Se activa la minería.
  7. SYS@orcl> execute dbms_logmnr.start_logmnr;
    PL/SQL procedure successfully completed.
  8. Buscamos DDLs sobre la tabla en cuestión.
  9. 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" ;
  10. 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 prodemos 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 envíame un email y para que NO te pierdas ningún Post, suscríbete por email ahora mismo!

3 comentarios, agrega el tuyo!

Willyberto dijo...

Hola Enrique,

Probe tu solución pero no me arrojo ningun resultado, que más puedo hacer????...
te dejo el codigo que utilice para que veas los resultados que obtuve

SQL> begin
2 dbms_logmnr.add_logfile(
3 '/smart/oradata/SMART/redo03.log', dbms_logmnr.new );
4 dbms_logmnr.add_logfile(
5 '/smart/oradata/SMART/redo02.log', dbms_logmnr.addfile );
6 dbms_logmnr.add_logfile(
7 '/smart/oradata/SMART/redo01.log', dbms_logmnr.addfile );
8 end;
9 /

PL/SQL procedure successfully completed.

SQL> execute dbms_logmnr.start_logmnr;

PL/SQL procedure successfully completed.

SQL> select scn, timestamp, username, sql_redo
2 from v$logmnr_contents
3 where seg_owner='SMART'
4 and seg_name='GPRS_SGSN_MM2'
5 and operation = 'DDL';

no rows selected

SQL>

Saludos!!!!!

Enrique Orbegozo dijo...

Hola Willyberto, es posible que la información ya no se encuentre en los online redo logs, recuerda que son sobre-escritos conforme se realizan transacciones. Si tienes tu base de datos en modo archivelog (que deberia estarlo si tiene algo de importancia), entonces adicionalmente registra los archive logs y continua con la busqueda. Saludos y gracias por participar.

Anónimo dijo...

Saludos, a mi si me retorna registros pero con un usuario unknown,fecha sin hora, numero de objeto, numero de columa...en fin nada concreto a simple vista. Uso 11gR2