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.
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" ;
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.