Reenvío la respuesta ya que no aparece en los email de la lista (y creo q sería 
una respuesta ), excepto en 
http://web.archiveorange.com/archive/v/dFNxkHpJO8h9alMLvR0w

Muchas gracias amigo. Busque ese valor 02 05 en el editor 
hexadecimal XVI32, le cambie el 05 por 01, reinicie el servidor de 
postgresql y funcionó perfectamente. Eso era lo que me hacia falta, 
incluso soporta hacerle vacuum a la tabla y no me borra ese registro.

Pasos:
--1) Buscar el oid de la BD
select oid from pg_database d where d.datname ='pruebas';
--2) Buscar la ruta del archivo donde se encuentra la tabla, el OID de la BD 
debe coincidir con el OID de la ruta
SELECT pg_relation_filenode('gps_datos'),pg_relation_filepath('gps_datos');
--3) Buscar esa ruta en el directorio data de la carpeta donde se encuentra 
postgresql
--4) Abrir el archivo donde se encuentra la tabla con un editor hexadecimal 
(pueden usar el de su preferencia)
--5) Instalar la extensión
 pageinspect
CREATE EXTENSION pageinspect;
--6) Usar las funciones heap_page_items y get_raw_page para obtener información 
de los registros en la tabla. 
---- Los registros a recuperar contienen un valor diferente a 0 en la columna 
t_xmax (transacción que eliminó el registro)
select * from heap_page_items(get_raw_page('gps_datos',0));
--7) Usando el editor hexadecimal, ir a la posicion que esta en la columna 
lp_off del registro a recuperar
--7.1)
 Los primeros 4 bytes son el t_xmin, los siguientes 4 bytes son t_xmax, 
se debe cambiar el valor de cada uno de estos 4 bytes (t_xmax) a 
cero(00). Ambos se leen de derecha a izquierda.
--7.2) Es necesario 
resetear los bits XMAX_COMMITTED, para ello se toma el valor de la 
columna t_infomask, obtenida del query en el punto 6, para el registro a
 recuperar(en mi caso 1282)
-----  y se convierte el valor de esa 
columna a hexadecimal (0502 en mi caso), luego cuenta 13 bytes hacia
 adelante para llegar al infomask, el cual permite visualizar el 
registro (posiciones: 
http://www.postgresql.org/docs/9.0/interactive/storage-page-layout.html)
----- 
 por ultimo, se le resta 0x0400(XMAX_COMMITTED) al valor hexa (0502 en 
mi caso) y el resultado (0102 en mi caso), se coloca reemplazando el 
valor del infomask actual (se escribe de derecha a izquierda, 02 01 en 
mi caso).

Estos pasos se deben hacer para cada registro a recuperar.



>________________________________
> De: Alejandro Carrillo <[email protected]>
>Para: SQL Ayuda Postgre <[email protected]> 
>CC: Herrera Alvaro <[email protected]>; Casanova Jaime 
><[email protected]> 
>Enviado: Jueves 5 de abril de 2012 21:56
>Asunto: [pgsql-es-ayuda] Recuperar borrado físico de registro.
> 
>
>Hola,
>
>
>Alguno sabe como recuperar (sin backups, sin pg_audit, sin borrado logico), un 
>registro de una tabla de la BD. He estado investigando y al parecer todo 
>apunta a HeapTupleSatisfiesVisibility(), que debe estar en true para ver los 
>registros borrados de todas las tablas, que no se le han hecho vacuum. El lio 
>radica, en que no se puede volver a compilar postgresql para hacer esta 
>maniobra. 
>
>
>
>Gracias
>
>
>

Responder a