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: Alvaro Herrera <alvhe...@alvh.no-ip.org> >Para: Alejandro Carrillo <faster...@yahoo.es> >CC: Ayuda <pgsql-es-ayuda@postgresql.org>; Casanova Jaime ><ja...@2ndquadrant.com>; Quijada Edwin <listas_quij...@hotmail.com>; Gonzalez >Rodrigo <lis...@estrads.com.ar> >Enviado: Martes 29 de Mayo de 2012 15:10 >Asunto: Re: [pgsql-es-ayuda] Re: [pgsql-es-ayuda] [pgsql-es-ayuda] Recuperar >borrado físico de registro. > > >Excerpts from Alejandro Carrillo's message of mar may 29 15:59:41 -0400 2012: >> Hola >> >> Ya coloque con un editor hexadecimal el valor de xmax en 0 (LO SÉ poque >> reemplacé el archivo y volvi a consultar select * from >> heap_page_items(get_raw_page('gps_datos',0))), sin embargo no me sale el >> dato eliminado. Creo que me falta el bit con xmax commited en el registro >> eliminado, pero no sé donde ponerlo en el archivo. > >El numero que dice 1282 debe ser el infomask; en hex es 502. >XMAX_COMMITTED es 0x0400, así que debes cambiar el 502 por 102 para >resetear ese bit. > >-- >Álvaro Herrera <alvhe...@alvh.no-ip.org> > > >