Re: Effect of COMMIT on WAL-Buffers + Effect of Check pointer.

Поиск
Список
Период
Сортировка
От Laurenz Albe
Тема Re: Effect of COMMIT on WAL-Buffers + Effect of Check pointer.
Дата
Msg-id ee1118fcd30c4e0c7b4dd21681a14a46a669d7be.camel@cybertec.at
обсуждение исходный текст
Ответ на Effect of COMMIT on WAL-Buffers + Effect of Check pointer.  ("Subramanian,Ramachandran" <ramachandran.subramanian@alte-leipziger.de>)
Список pgsql-admin
On Tue, 2025-10-07 at 11:22 +0000, Subramanian,Ramachandran wrote:
> Coming from a Db2 – mainframe world trying to understand Postgres.
> Kindly forgive my ignorance and the somewhat long winded question.
>
> When a particular transaction TRAN1, inserts/updates/deletes data,
> the changes are made to the memory blocks in the  Shared Buffer
> ( data buffers ) and corresponding Undo and Redo Logs are written
> to the Log buffers.  While TRAN1 is running , TRAN2 TRAN3 …. TRAN4
> can run concurrently and be writing information tot he WAL-Buffers.

There are no undo logs.  PostgreSQL doesn't ever undo work.
Otherwise, yes.

> Let us assume that TRAN1 began at 0000 Hours and at has updated 1
> rows at 0001 Hours.
>
> Let us further assume for simplicity that TRAN1 TRAN2 TRAN3 and
> TRAN4 have updated 1 row each and written 2 WAL-Records each in the
> WAL-Buffer BUT  NOT issued a COMMIT yet.
>
> Now at 0002 Hours TRAN4 alone has issued a COMMIT.
>
> Will all the 8  WAL-Buffer records be written to the WAL files?

Yes, unless "wal_writer_delay" has expired first, and the WAL
writer process has already written the data.

> Obviously TRAN1 2 and 3 are  IN-FLIGHT ( un committed ) at 0002
> Hours, while TRAN4 is committed.  ( This is how DB2 works . When a
> COMMIT is issued by any transaction ALL the log buffers are written
> to disk, immaterial of if they are commited or not. There is a BEGIN
> Unit of Recovery Log record, a END Unit of Recovery log Record
> associated with each transaction . Each Unit of Recovery is an
> unique identifier. Every log record that belongs to this Unit of
> Recovery ID has this identifier in it.  So after a crash, the logs
> are scanned forward since the last check point and only those
> logrecords with a matching BEGIN UR and END UR are redone, and
> those with just a BEGIN UR and no matching END UR are rolled back.

In PostgreSQL, *all* the WAL is replayed, even the changes from
uncommitted transactions.

Nothing is ever rolled back.

Instead, PostgreSQL records the status of all transactions in the
*commit log*.  Changes from transactions that didn't commit simple
remain invisible, and the next VACUUM run will clean them up.

> Does a COMMIT even cause the ALL the WAL-Buffers to be written to
> WAL-Files in Postgres?

All the WAL up to and including the COMMIT, yes.

> Additionally, after the check pointer externalizes all the comitted
> Shared Buffer Data to disk, does it write a check point record to
> the WAL-Buffer alone?

Yes, and that is flushed to disk.

> if the check point information is just written to the WAL-Buffer
> by the Check-Pointer background process and before it is copied down
> to a file on the disk,  Postgres crashes, is this check point not lost ?
> Does a Check point record force a WAL-Buffer write to WAL-Files ?

Sure.  Once a checkpoint is complete, all data it wrote are safely
on disk.

Yours,
Laurenz Albe



В списке pgsql-admin по дате отправления: