From: | Alejandro Carrillo <fasterzip(at)yahoo(dot)es> |
---|---|
To: | Alvaro Herrera <alvherre(at)alvh(dot)no-ip(dot)org> |
Cc: | Ayuda <pgsql-es-ayuda(at)postgresql(dot)org>, Casanova Jaime <jaime(at)2ndquadrant(dot)com>, Quijada Edwin <listas_quijada(at)hotmail(dot)com>, Gonzalez Rodrigo <listas(at)estrads(dot)com(dot)ar> |
Subject: | Recuperar borrado físico de registro. |
Date: | 2012-05-29 22:20:44 |
Message-ID: | 1338330044.26838.YahooMailNeo@web171005.mail.ukl.yahoo.com |
Views: | Raw Message | Whole Thread | Download mbox | Resend email |
Thread: | |
Lists: | pgsql-es-ayuda |
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 <alvherre(at)alvh(dot)no-ip(dot)org>
>Para: Alejandro Carrillo <fasterzip(at)yahoo(dot)es>
>CC: Ayuda <pgsql-es-ayuda(at)postgresql(dot)org>; Casanova Jaime <jaime(at)2ndquadrant(dot)com>; Quijada Edwin <listas_quijada(at)hotmail(dot)com>; Gonzalez Rodrigo <listas(at)estrads(dot)com(dot)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 <alvherre(at)alvh(dot)no-ip(dot)org>
>
>
>
From | Date | Subject | |
---|---|---|---|
Next Message | Juan Gutiérrez Ortega | 2012-05-29 22:44:58 | RE: Reindexacion de Tablas |
Previous Message | ruben avila galindo | 2012-05-29 22:00:25 | Re: Reindexacion de Tablas |