Por cierto, ¿alguien sabe si esta persona subió el recuperador y donde se puede descargar? http://archives.postgresql.org/pgsql-es-ayuda/2006-02/msg00300.php German Gonzalez
>________________________________ > De: Alejandro Carrillo <[email protected]> >Para: Alejandro Carrillo <[email protected]>; SQL Ayuda Postgre ><[email protected]> >CC: Herrera Alvaro <[email protected]>; Casanova Jaime ><[email protected]> >Enviado: Martes 29 de Mayo de 2012 17:50 >Asunto: [pgsql-es-ayuda] Re: [pgsql-es-ayuda] Recuperar borrado físico de >registro. > > >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 >> >> >> > >
