Re: que hay de PITR ... ?

From: Alvaro Herrera <alvherre(at)commandprompt(dot)com>
To: Andrés Aquino <andres(dot)aquino(at)gmail(dot)com>
Cc: pgsql-es-ayuda(at)postgresql(dot)org
Subject: Re: que hay de PITR ... ?
Date: 2006-02-24 03:05:25
Message-ID: 20060224030525.GC9837@surnet.cl
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-es-ayuda

Andrés Aquino escribió:

> Uhmmmm, dejame ver si entendí..
>
> En parte de la muestra del dump que envié
> <snip>
> <Data> ------
> Item 1 -- Length: 132 Offset: 8060 (0x1f7c) Flags: USED
> XID: min (330466371) CMIN|XMAX: 0 CMAX|XVAC: 330474520
> {
> el valor aquí mencionado, XMAX: 0, indica que la tupla no ha
> sido aun eliminada y es posible recuperarla ?

No, indica que la tupla es visible en un SELECT, puesto que no ha sido
eliminada. Claro que en realidad no hay ninguna tupla que tenga XMAX=0;
es posible que esto sea un artefacto de la incompatiblidad de versiones
entre Postgres y filedump. O la otra alternativa es que la transaccion
330466371 no fue comprometida (XMIN).

> }
> Block Id: 0 linp Index: 0 Attributes: 0 Size: 13
> 3 infomask: 0x0001 (HASNULL)
> Error: Computed header length not equal to header size.
> Computed <24> Header: <13>
> {
> supongo que esta es la tupla _eliminada_ ...

Aca no hay ninguna tupla :-) esta es la informacion del bloque.

> bueno, en honor a la verdad; acabo de recuperar los datos de un backup
> anterior, el problema fue ejecutar ciertos procesos para dejarla tal
> y como estaba antes de mi pequeño error ...

Bien!

> Sin embargo, si no tienes inconveniente sería muy útil conocer el
> procedimiento para recuperar la información, sea usando la versión
> hackeada o el PITR...

Bueno, PITR ya no puedes usarlo. La idea es
1. marcar la transaccion XMAX como aborted
2. ignorar los hint bits de manera que siempre se chequee el XMAX

Una tupla tiene varios datos en un encabezado. En particular nos
interesan XMIN y XMAX, que son los Xid (identificadores de transaccion)
que correspondian a las transacciones que crearon y destruyeron la
tupla, respectivamente. El Xmin siempre es valido, puesto que la tupla
necesariamente ha de haber sido creada en algun momento. Pero puede
pertenecer a una transaccion que fue abortada (rollback), en cuyo caso
la tupla no es visible. El Xmax no siempre es valido -- de hecho
siempre sera invalido hasta que la tupla es destruida. Al destruir una
tupla, lo que se hace es poner el Xid en el XMAX de la tupla. Toda
transaccion posterior que quiera saber si la tupla esta viva tiene que
examinar el XMAX; si es invalido, entonces la tupla esta viva. Si es
valido, puede corresponder a una transaccion que fue comprometida (en
cuyo caso la tupla no es visible), o bien que fue abortada (en cuyo caso
es lo mismo que si nadie la hubiera tratado de borrar; por lo tanto la
tupla es visible). Finalmente puede corresponder a una transaccion en
curso, pero ese caso no nos interesa en este momento y es mas
complicado.

> Qué son los "hint bits" ?

"Hint bits" son bits de una mascara de bits que dan hints al ejecutor de
consultas. Si una tupla tiene el bit "XMAX committed" quiere decir que
se sabe que la transaccion que destruyo la tupla fue comprometida -- por
lo tanto la tupla no es visible para nadie, y no es necesario examinar
el XMAX. Por lo tanto no es suficiente con marcar el XMAX como que fue
abortado -- tambien hay que hackear Postgres para que no considere los
hint bits.

Los hint bits son una optimizacion, para ahorrar I/O al hacer recorridos
de tablas. El chequeo de transacciones se tiene que hacer solo una vez;
esa primera vez, se marca el hint bit. Recorridos subsiguientes solo
necesitan examinar el hint bit.

Suficientemente confundido?

--
Alvaro Herrera http://www.CommandPrompt.com/
The PostgreSQL Company - Command Prompt, Inc.

In response to

Responses

Browse pgsql-es-ayuda by date

  From Date Subject
Next Message Juan Martínez 2006-02-24 03:27:55 Re: pregunta importacion con copy
Previous Message Alvaro Herrera 2006-02-24 02:50:24 Re: obtener el valor de una secuencia sin hacer antes nextval()