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!

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

This site uses Akismet to reduce spam. Learn how your comment data is processed.

Posts Relacionados

if there is an unusable index when analyze is executed, expect ORA-1502
Sobre cómo un error causado por ejecutar analyze a una tabla con indices unusable es resuelto con expresiones regulares y dbms_stats.
We need to add new disks to Disk Group
¿Estás por añadir, remover o reemplazar discos en ASM? Puede que no estés haciéndolo de la forma más eficiente. Aprende cómo.
Case sensitive comparison
Sabias que AutoUpgrade falla si los nombres de los servidores no están en minúsculas y estás trabajando con una base de datos RAC One Node.

¿Necesitas Ayuda?

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