[Pgsql-ayuda] Log de transacciones

Alvaro Herrera alvherre@dcc.uchile.cl
Thu, 8 Jan 2004 08:40:34 -0300


On Thu, Jan 08, 2004 at 10:04:31AM +0100, Jose Joaquin Lorente Garcia wrote:

> ¿Existe la posibilidad de conocer el 'timestamp' de una transacción en
> postgresql?  Bueno, les explico. Deseamos llevar un log de las
> transacciones mediante programación para realizar posibles auditorías
> y diseñar un sistema de recuperación o backup  incremental o más
> eficiente que un dump completo. 

Si ese es el objetivo final, creo que es mucho mas conveniente que
pensar en "point-in time recovery"; lo que esto hace es usar los
registros de WAL para actualizar una base de datos (a partir de un dump
completo, por ejemplo, aunque creo que tambien podria ser un snapshot de
PGDATA).  Aun no esta implementado en Postgres, aunque algo hay de
trabajo hecho ...

> De esta manera, registramos cada sentencia SQL de una transacción en
> una tabla pero para garantizar la seriabilidad, es decir, que la
> reproducción de esas sentencias tal y como se han producido en tiempo
> real, necesitamos el 'instante' o 'timestamp' de inicio de cada
> transacción.

Te falta un supuesto: que las transacciones se pueden serializar de esta
manera.  Para eso necesitas que todas tus transacciones corran con
TRANSACTION ISOLATION LEVEL SERIALIZABLE.  Por omision corren en T.I.L.
READ COMMITTED, el cual no te garantiza serializabilidad.

Ejecutandolas de este modo disminuyes la concurrencia (y posiblemente
vas a necesitar mas bucles de reintento para todo, debido a las
transacciones que fallen por inserializabilidad), pero garantizas
serializabilidad.  Claro que no estoy seguro si necesitas el timestamp
del inicio de la transaccion o el del momento del compromiso (COMMIT).

Suerte ...

-- 
Alvaro Herrera (<alvherre[a]dcc.uchile.cl>)
"Use it up, wear it out, make it do, or do without"