Uso de logminer.
– Usuario borra una fila.
– Por accidente.
– No sabe de qué fila se trata, pero ‘algo’ ha dicho «registro borrado».
– (…borrado y validado).
– Ni idea de qué datos tenía la fila.
– Ni él, ni nadie.
– Desde ese momento, la fila X ha desaparecido sin rastro.
Con variaciones, éste caso es bastante frecuente, y si el usuario que ha borrado el registro es lo suficientemente rápido, existe una posibilidad de recuperar los datos perdidos.
Generalmente, todas las transacciones convencionales procesan la información pasando por las áreas de redo log. En estos archivos está toda la información correspondiente al nuevo cambio. Oracle basa toda su actividad en el buen funcionamiento del registro de redo log y, por tanto, en esta área únicamente almacena los datos físicos elementales para rehacer la operación. Por tanto, no se almacena información sobre los valores anteriores.
Lo cual sí sucede en el área de rollback, y ¡la gestión de rollback también pasa por redolog!.
Oracle dispone de un paquete, el LOG MINER que permite rastrear los redo logs (online y archivados) junto con la información de rollback disponible también en éstos. Una vez ejecutado el paquete que crea el fichero de diccionario de objetos, Oracle es capaz de interpretar esos redologs y mostrar información tan válida como el SQL generado y el SQL inverso para «reparar» la acción.
SQL> connect / as sysdba
Conectado.
SQL> show parameters utl
NAME TYPE VALUE
———————————— ———– ——————————
utl_file_dir string c:oraclefiles
SQL> exec DBMS_LOGMNR_D.BUILD( DICTIONARY_FILENAME =>’dictionary.ora’, DICTIONARY_LOCATION => ‘c:oraclefiles’);
Procedimiento PL/SQL terminado correctamente.
SQL> select member from v$logfile;
MEMBER
——————————————————————————–
C:ORACLEORADATAORCLREDO04A.LOG
C:ORACLEORADATAORCLREDO04B.LOG
C:ORACLEORADATAORCLREDO05A.LOG
C:ORACLEORADATAORCLREDO05B.LOG
C:ORACLEORADATAORCLREDO06A.LOG
C:ORACLEORADATAORCLREDO06B.LOG
6 filas seleccionadas.
SQL> exec DBMS_LOGMNR.add_logfile(‘C:ORACLEORADATAORCLREDO04A.LOG’);
Procedimiento PL/SQL terminado correctamente.
SQL> exec DBMS_LOGMNR.add_logfile(‘C:ORACLEORADATAORCLREDO05A.LOG’);
Procedimiento PL/SQL terminado correctamente.
SQL> exec DBMS_LOGMNR.add_logfile(‘C:ORACLEORADATAORCLREDO06A.LOG’);
Procedimiento PL/SQL terminado correctamente.
SQL> EXECUTE DBMS_LOGMNR.START_LOGMNR(DICTFILENAME =>’c:oraclefilesdictionary.ora’);
Procedimiento PL/SQL terminado correctamente.
SQL> set pages 100
SQL> set lines 120
SQL> column sql_redo format a50
SQL> column sql_undo format a50
SQL> select sql_redo, sql_undo from v$logmnr_contents where rownum<10;
SQL_REDO SQL_UNDO
————————————————– ————————————————–
insert into «DISCOVERER9I».»EUL5_MV101651″(«Import delete from «DISCOVERER9I».»EUL5_MV101651″ where «
e SUM»,»Importe COUNT»,»Importe MAX»,»Importe MIN» Importe SUM» = ‘170,01’ and «Importe COUNT» = ‘1’
,»Importe AVG»,»Ciudad»,»Pais»,»Rango Edad»,»Sexo» and «Importe MAX» = ‘170,01’ and «Importe MIN» = ‘
,»Detalle Vuelo») values (‘170,01′,’1′,’170,01′,’1 170,01’ and «Importe AVG» = ‘170,01’ and «Ciudad»
70,01′,’170,01′,’Madeira’,’Portugal’,’Mayores de 5 = ‘Madeira’ and «Pais» = ‘Portugal’ and «Rango Eda
0 a±os’,’Mujer’,’VUELO52149′); d» = ‘Mayores de 50 a±os’ and «Sexo» = ‘Mujer’ and
«Detalle Vuelo» = ‘VUELO52149’ and ROWID = ‘AAALV
mAAPAAAAn8AAA’;
insert into «DISCOVERER9I».»EUL5_MV101651″(«Import delete from «DISCOVERER9I».»EUL5_MV101651″ where «
e SUM»,»Importe COUNT»,»Importe MAX»,»Importe MIN» Importe SUM» = ‘112,95’ and «Importe COUNT» = ‘1’
,»Importe AVG»,»Ciudad»,»Pais»,»Rango Edad»,»Sexo» and «Importe MAX» = ‘112,95’ and «Importe MIN» = ‘
,»Detalle Vuelo») values (‘112,95′,’1′,’112,95′,’1 112,95’ and «Importe AVG» = ‘112,95’ and «Ciudad»
12,95′,’112,95′,’Madeira’,’Portugal’,’Mayores de 5 = ‘Madeira’ and «Pais» = ‘Portugal’ and «Rango Eda
0 a±os’,’Mujer’,’VUELO52206′); d» = ‘Mayores de 50 a±os’ and «Sexo» = ‘Mujer’ and
«Detalle Vuelo» = ‘VUELO52206’ and ROWID = ‘AAALV
mAAPAAAAn8AAB’;
insert into «DISCOVERER9I».»EUL5_MV101651″(«Import delete from «DISCOVERER9I».»EUL5_MV101651″ where «
e SUM»,»Importe COUNT»,»Importe MAX»,»Importe MIN» Importe SUM» = ‘123,29’ and «Importe COUNT» = ‘1’
,»Importe AVG»,»Ciudad»,»Pais»,»Rango Edad»,»Sexo» and «Importe MAX» = ‘123,29’ and «Importe MIN» = ‘
,»Detalle Vuelo») values (‘123,29′,’1′,’123,29′,’1 123,29’ and «Importe AVG» = ‘123,29’ and «Ciudad»
23,29′,’123,29′,’Madeira’,’Portugal’,’Mayores de 5 = ‘Madeira’ and «Pais» = ‘Portugal’ and «Rango Eda
0 a±os’,’Mujer’,’VUELO52331′); d» = ‘Mayores de 50 a±os’ and «Sexo» = ‘Mujer’ and
«Detalle Vuelo» = ‘VUELO52331’ and ROWID = ‘AAALV
mAAPAAAAn8AAC’;
insert into «DISCOVERER9I».»EUL5_MV101651″(«Import delete from «DISCOVERER9I».»EUL5_MV101651″ where «
e SUM»,»Importe COUNT»,»Importe MAX»,»Importe MIN» Importe SUM» = ‘178,55’ and «Importe COUNT» = ‘1’
,»Importe AVG»,»Ciudad»,»Pais»,»Rango Edad»,»Sexo» and «Importe MAX» = ‘178,55’ and «Importe MIN» = ‘
,»Detalle Vuelo») values (‘178,55′,’1′,’178,55′,’1 178,55’ and «Importe AVG» = ‘178,55’ and «Ciudad»
78,55′,’178,55′,’Madeira’,’Portugal’,’Mayores de 5 = ‘Madeira’ and «Pais» = ‘Portugal’ and «Rango Eda
0 a±os’,’Mujer’,’VUELO52419′); d» = ‘Mayores de 50 a±os’ and «Sexo» = ‘Mujer’ and
«Detalle Vuelo» = ‘VUELO52419’ and ROWID = ‘AAALV
mAAPAAAAn8AAD’;
insert into «DISCOVERER9I».»EUL5_MV101651″(«Import delete from «DISCOVERER9I».»EUL5_MV101651″ where «
e SUM»,»Importe COUNT»,»Importe MAX»,»Importe MIN» Importe SUM» = ‘107,36’ and «Importe COUNT» = ‘1’
,»Importe AVG»,»Ciudad»,»Pais»,»Rango Edad»,»Sexo» and «Importe MAX» = ‘107,36’ and «Importe MIN» = ‘
,»Detalle Vuelo») values (‘107,36′,’1′,’107,36′,’1 107,36’ and «Importe AVG» = ‘107,36’ and «Ciudad»
07,36′,’107,36′,’Madeira’,’Portugal’,’Mayores de 5 = ‘Madeira’ and «Pais» = ‘Portugal’ and «Rango Eda
0 a±os’,’Mujer’,’VUELO52488′); d» = ‘Mayores de 50 a±os’ and «Sexo» = ‘Mujer’ and
«Detalle Vuelo» = ‘VUELO52488’ and ROWID = ‘AAALV
mAAPAAAAn8AAE’;
insert into «DISCOVERER9I».»EUL5_MV101651″(«Import delete from «DISCOVERER9I».»EUL5_MV101651″ where «
e SUM»,»Importe COUNT»,»Importe MAX»,»Importe MIN» Importe SUM» = ‘120,5’ and «Importe COUNT» = ‘1’ a
,»Importe AVG»,»Ciudad»,»Pais»,»Rango Edad»,»Sexo» nd «Importe MAX» = ‘120,5’ and «Importe MIN» = ’12
,»Detalle Vuelo») values (‘120,5′,’1′,’120,5′,’120 0,5’ and «Importe AVG» = ‘120,5’ and «Ciudad» = ‘M
,5′,’120,5′,’Madeira’,’Portugal’,’Mayores de 50 a± adeira’ and «Pais» = ‘Portugal’ and «Rango Edad» =
os’,’Mujer’,’VUELO52561′); ‘Mayores de 50 a±os’ and «Sexo» = ‘Mujer’ and «De
talle Vuelo» = ‘VUELO52561’ and ROWID = ‘AAALVmAAP
AAAAn8AAF’;
insert into «DISCOVERER9I».»EUL5_MV101651″(«Import delete from «DISCOVERER9I».»EUL5_MV101651″ where «
e SUM»,»Importe COUNT»,»Importe MAX»,»Importe MIN» Importe SUM» = ‘109,01’ and «Importe COUNT» = ‘1’
,»Importe AVG»,»Ciudad»,»Pais»,»Rango Edad»,»Sexo» and «Importe MAX» = ‘109,01’ and «Importe MIN» = ‘
,»Detalle Vuelo») values (‘109,01′,’1′,’109,01′,’1 109,01’ and «Importe AVG» = ‘109,01’ and «Ciudad»
09,01′,’109,01′,’Madeira’,’Portugal’,’Mayores de 5 = ‘Madeira’ and «Pais» = ‘Portugal’ and «Rango Eda
0 a±os’,’Mujer’,’VUELO52690′); d» = ‘Mayores de 50 a±os’ and «Sexo» = ‘Mujer’ and
«Detalle Vuelo» = ‘VUELO52690’ and ROWID = ‘AAALV
mAAPAAAAn8AAG’;
insert into «DISCOVERER9I».»EUL5_MV101651″(«Import delete from «DISCOVERER9I».»EUL5_MV101651″ where «
e SUM»,»Importe COUNT»,»Importe MAX»,»Importe MIN» Importe SUM» = ‘174,91’ and «Importe COUNT» = ‘1’
,»Importe AVG»,»Ciudad»,»Pais»,»Rango Edad»,»Sexo» and «Importe MAX» = ‘174,91’ and «Importe MIN» = ‘
,»Detalle Vuelo») values (‘174,91′,’1′,’174,91′,’1 174,91’ and «Importe AVG» = ‘174,91’ and «Ciudad»
74,91′,’174,91′,’Madeira’,’Portugal’,’Mayores de 5 = ‘Madeira’ and «Pais» = ‘Portugal’ and «Rango Eda
0 a±os’,’Mujer’,’VUELO52693′); d» = ‘Mayores de 50 a±os’ and «Sexo» = ‘Mujer’ and
«Detalle Vuelo» = ‘VUELO52693’ and ROWID = ‘AAALV
mAAPAAAAn8AAH’;
insert into «DISCOVERER9I».»EUL5_MV101651″(«Import delete from «DISCOVERER9I».»EUL5_MV101651″ where «
e SUM»,»Importe COUNT»,»Importe MAX»,»Importe MIN» Importe SUM» = ‘131,5’ and «Importe COUNT» = ‘1’ a
,»Importe AVG»,»Ciudad»,»Pais»,»Rango Edad»,»Sexo» nd «Importe MAX» = ‘131,5’ and «Importe MIN» = ’13
,»Detalle Vuelo») values (‘131,5′,’1′,’131,5′,’131 1,5’ and «Importe AVG» = ‘131,5’ and «Ciudad» = ‘M
,5′,’131,5′,’Madeira’,’Portugal’,’Mayores de 50 a± adeira’ and «Pais» = ‘Portugal’ and «Rango Edad» =
os’,’Mujer’,’VUELO52951′); ‘Mayores de 50 a±os’ and «Sexo» = ‘Mujer’ and «De
talle Vuelo» = ‘VUELO52951’ and ROWID = ‘AAALVmAAP
AAAAn8AAI’;
9 filas seleccionadas.