Leer filas borradas o actualizadas en PostgreSQL

Hace un tiempo lei sobre una extensión llamada pg_dirtyread, que como su nombre indica te permite leer datos sucios de una tabla  que aun no se le ha realizado vaccum, recuerden que el vaccum elimina o permite reutilizar es espacio de las  tuplas muertas, realmente no la había probado, pero me decidí hacerlo ahora luego de mucho tiempo para ver que tal. En realidad hay que tener claro que  es solo leer datos que han sido eliminados o actualizados y que aun no has realizado vaccum en esa tabla, también aclarar que puede generar “INCONSISTENCIA EN LA BD”, pero en el algunos casos puede ser útil, pues probemos que tal funciona:

Se descarga de  aquí la extensión

Se descompacta :


unzip pgtreats-master.zip

Se va al directorio /contrib/pg_dirtyread

Se compila y se instala:


make
sudo make install

NOTA: esta prueba es con PostgreSQL 9.4 y ubuntu 14.04 , pero dice la documentación que funciona desde 9.2 

 


--Se crea  la extensión y una tabla de ejemplo

dirty=# CREATE EXTENSION pg_dirtyread;

--Se crea  la tabla y se insertan datos
dirty=# CREATE TABLE ejemplo (i int);

dirty=# INSERT INTO ejemplo VALUES (1),(2),(3),(4);
INSERT 0 4

--el resultado

dirty=# SELECT * FROM ejemplo;
i
---
1
2
3
4
(4 filas)



--eliminamos datos

dirty=# DELETE FROM ejemplo WHERE i >2;
DELETE 2

--el resultado  luego de eliminar
dirty=# select * from ejemplo ;
i
---
1
2
(2 filas)

--viene la extensión a  salvar y el resultado
dirty=# SELECT * FROM pg_dirtyread( 'ejemplo'::regclass ) 
t (valor int);
valor
-------
1
2
3
4
(4 filas)


--podemos ver los datos sucios :O

--tal vez esta pueda ser una solución a saber los datos que
-- hemos borrado,cada cual la implemente a sus necesidades
dirty=# SELECT * FROM  pg_dirtyread( 'ejemplo'::regclass )
t (valor int)  WHERE valor NOT IN (SELECT * FROM ejemplo );

valor
-------
3
4
(2 filas)

--si ejecutamos vacuum, de ahí en adelante no podemos leer 
-- nada mas borrado o eliminado 😦

dirty=# VACUUM ejemplo;
VACUUM
dirty=# SELECT * FROM pg_dirtyread( 'ejemplo'::regclass )
t (valor int);
valor
-------
1
2
(2 filas)

--probamos con un UPDATE y obtenemos:

dirty=# UPDATE ejemplo SET i =20 WHERE i =2;
UPDATE 1
dirty=# SELECT * FROM pg_dirtyread( 'ejemplo'::regclass )
t (valor int);
valor
-------
1
2
20
(3 filas)

Así que si una vez hacemos un DELETE con un  WHERE equivocado o sin WHERE, tal vez esta extensión nos pueda a ayudar a leer datos borrados, y sobre todo tener una estrategia de como recuperarlar los datos.

 

Espero que nunca tengan que utilizarla 😉

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión /  Cambiar )

Google photo

Estás comentando usando tu cuenta de Google. Cerrar sesión /  Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión /  Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión /  Cambiar )

Conectando a %s