+1 Sin embargo, puedes cambiar ese valor por fuera con un editor hexadecimal teniendo en cuenta estos pasos: 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. O se podría hacer con estos pasos, una extensión hecha en C que permita recuperar el registro. >________________________________ > De: Jaime Casanova <ja...@2ndquadrant.com> >Para: Lazáro Rubén García Martínez <lgarc...@vnz.uci.cu> >CC: "pgsql-es-ayuda@postgresql.org" <pgsql-es-ayuda@postgresql.org> >Enviado: Lunes 30 de julio de 2012 13:20 >Asunto: Re: [pgsql-es-ayuda] Cambiar valor xmax > >2012/7/30 Lazáro Rubén García Martínez <lgarc...@vnz.uci.cu>: >> Hola a todos en la lista, es posible cambiar el valor de la tupla xmax desde >> una consulta? >> > >xmax no es una tupla sino un campo de sistema en cada tupla >y la respuesta es: NO. no puedes cambiar ese valor desde una consulta > >-- >Jaime Casanova www.2ndQuadrant.com >Professional PostgreSQL: Soporte 24x7 y capacitación >- >Enviado a la lista de correo pgsql-es-ayuda (pgsql-es-ayuda@postgresql.org) >Para cambiar tu suscripción: >http://www.postgresql.org/mailpref/pgsql-es-ayuda > > >