Skip site navigation (1) Skip section navigation (2)

Re: Cambiar valor xmax

From: Alejandro Carrillo <fasterzip(at)yahoo(dot)es>
To: Jaime Casanova <jaime(at)2ndquadrant(dot)com>, Lazáro Rubén García Martínez <lgarciam(at)vnz(dot)uci(dot)cu>
Cc: "pgsql-es-ayuda(at)postgresql(dot)org" <pgsql-es-ayuda(at)postgresql(dot)org>
Subject: Re: Cambiar valor xmax
Date: 2012-07-30 19:02:19
Message-ID: 1343674939.22184.YahooMailNeo@web171502.mail.ir2.yahoo.com (view raw or flat)
Thread:
Lists: pgsql-es-ayuda
+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 <jaime(at)2ndquadrant(dot)com>
>Para: Lazáro Rubén García Martínez <lgarciam(at)vnz(dot)uci(dot)cu> 
>CC: "pgsql-es-ayuda(at)postgresql(dot)org" <pgsql-es-ayuda(at)postgresql(dot)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 <lgarciam(at)vnz(dot)uci(dot)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(at)postgresql(dot)org)
>Para cambiar tu suscripción:
>http://www.postgresql.org/mailpref/pgsql-es-ayuda
>
>
>

In response to

pgsql-es-ayuda by date

Next:From: =?iso-8859-1?Q?Laz=E1ro_Rub=E9n_Garc=EDa_Mart=EDnez?=Date: 2012-07-30 19:40:15
Subject: RE: Cambiar valor xmax
Previous:From: =?iso-8859-1?Q?Laz=E1ro_Rub=E9n_Garc=EDa_Mart=EDnez?=Date: 2012-07-30 18:32:13
Subject: Cambiar valor xmax

Privacy Policy | About PostgreSQL
Copyright © 1996-2014 The PostgreSQL Global Development Group