Re: Re: FEHLER: konnte auf den Status von Transaktion XY nicht zugreifen

From: "Albe Laurenz" <laurenz(dot)albe(at)wien(dot)gv(dot)at>
To: "Susanne Ebrecht *EXTERN*" <susanne(at)2ndquadrant(dot)com>
Cc: <pgsql-de-allgemein(at)postgresql(dot)org>
Subject: Re: Re: FEHLER: konnte auf den Status von Transaktion XY nicht zugreifen
Date: 2012-02-20 14:26:11
Message-ID: D960CB61B694CF459DCFB4B0128514C2077EC929@exadv11.host.magwien.gv.at
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-de-allgemein

Susanne Ebrecht schrieb:
>> Susanne Ebrecht schrieb:
>>> Am 14.02.2012 10:53, schrieb Andreas Tille:
>>>> Was sind das für Dateien ig pg_clog und warum können die verschwinden?
>>>> Viele Grüße Andreas.

>>> pg_clog ist in der Regel leer. Da werden nur dann Commit-Logs
>>> ausgelagert, wenn der RAM nicht reicht.

>> Wenn das war wäre, und es gäbe einen Crash, wie würde das System
>> dann den Commit-Status von Transaktionen herausfinden, die vor dem
>> letzten Checkpoint passiert sind?

> Lass es mich mal von vorne erkläre:
>
> Von prepared Transactions abgesehen ist, arbeitet SQL nach dem
> Ein-Phasen-Commit-Prinzip. Heisst Du schickt "Commit" und bekommst "ACK"
> zurück,
> wenn es geklappt hat.
>
> Du startest eine Transaktion -
> Zwischenschritte und so weiter werden im RAM festgehalten und wenn RAM
> nicht reicht,
> in pg_clog bzw. pg_subtrans ausgelagert. Subtransaktionen werden - je
> nach Art der Subtransaktion
> entweder in pg_clog oder in pg_subtrans ausgelagert. Das kommt auf die
> Subtransaktion an.
>
> Wenn Du das Commit abfeuerst - dann wird alles permanent in pg_xlog
> gespeichert.
[...]

Lies Die Antwort von Nicolas Barbier.
Lies auch http://wiki.postgresql.org/wiki/Hint_Bits
Und src/backend/access/transam/xlog.c und src/backend/access/transam/clog.c

Wenn eine Transaktion abgeschlossen wird, wird WAL in pg_xlog geschrieben,
das beschreibt, wie die Änderungen der Transaktion nachgespielt
werden können.

Die Datenblöcke (buffer) selber werden dabei nicht berührt, stattdessen wird
das CLOG für die Transaktion aktualisiert (das daweil noch in RAM ist).
Darin sieht man, in welchem Zustand die Transaktion ist.

Spätestens bei einem Checkpoint (siehe CheckPointGuts() und
CheckPointCLOG() im Code) werden CLOG-Einträge auf Platte geschrieben.

Erst wenn alle Transaktionen in einer CLOG-Page "frozen" sind,
kann die CLOG-Page entfernt werden (siehe TruncateCLOG()).

Wer als erstes nach Transaktionsende die neue Tabellenzeile lesen
kommt, stellt fest, daß die Hint Bits nicht gesetzt sind und geht
im CLOG nachschauen, wie die Transaktion, die die Zeile geschrieben
hat, abgeschlossen wurde. Dann werden die Hint Bits für zukünftige Leser
als Abkürzung gesetzt.

Darauf zielte meine Frage, die Du wahrscheinlich mißverstanden hast, ab:
Wenn es einen Crash gibt, wird ab dem letzten Checkpoint das WAL
nachgespielt. Was vor dem letzten Checkpoint war, muß auf Platte sein,
also auch CLOG, denn sonst könne man von so einer Transaktion nicht
mehr sagen, wie sie abgeschlossen wurde. Das WAL zu durchstöbern,
wäre nicht nur entsetzlich langwierig, sondern es ist auch gar nicht
garantiert, daß es das entsprechende WAL-Segment überhaupt noch gibt.

Liebe Grüße,
Laurenz

In response to

Responses

Browse pgsql-de-allgemein by date

  From Date Subject
Next Message Susanne Ebrecht 2012-02-20 19:21:53 Re: Re: FEHLER: konnte auf den Status von Transaktion XY nicht zugreifen
Previous Message Nicolas Barbier 2012-02-20 12:24:30 Re: Re: FEHLER: konnte auf den Status von Transaktion XY nicht zugreifen