Re: Vacuum Question

From: Ron Johnson <ronljohnsonjr(at)gmail(dot)com>
To: pgsql-admin <pgsql-admin(at)postgresql(dot)org>, Murthy Nunna <mnunna(at)fnal(dot)gov>
Subject: Re: Vacuum Question
Date: 2025-09-22 15:38:48
Message-ID: CANzqJaCVqWuiRT8jhQy+YVZvf-2aPHJt7QHGCieaLqn0Ovq8eA@mail.gmail.com
Views: Whole Thread | Raw Message | Download mbox | Resend email
Thread:
Lists: pgsql-admin

I think you asked the same question 11 years ago. 😀

- Seriously, though, 200GB is less than 1% of 22TB. There are bigger
problems if you're running that razor-thin on disk space.
- Is the transaction rate on the active tables sooo high that there's a
real chance of wrap-around?
- According to my interpretation of the docs, if you VACUUM FREEZE the
big static tables, then you won't need to vacuum them again, nor worry
about wrap-around problems.

https://www.postgresql.org/docs/14/routine-vacuuming.html#VACUUM-FOR-WRAPAROUND

> PostgreSQL reserves a special XID, FrozenTransactionId, which *does not
> follow the normal XID comparison rules* and is *always considered older
> than every normal XID*. Frozen row versions are treated as if the
> inserting XID were FrozenTransactionId, so that they *will appear to be **“in
> the past”** to all normal transactions regardless of wraparound issues*,
> and so such row versions will be valid until deleted, no matter how long
> that is.

On Mon, Sep 22, 2025 at 11:06 AM Murthy Nunna <mnunna(at)fnal(dot)gov> wrote:

> Version 14.13
>
>
>
> I have a large database 22 TB, and it has lot of tables. Most of the
> tables do not change (static). But the age(relfrozenxid) of those tables
> keep increasing because there are some other tables in the database that
> are updated. The size of these large static tables are about 200 GB on an
> average. And to prevent transaction ID wrap around, I have been doing
> manual vacuum table by table (couple of tables a day due to limited WAL
> disk space). Each table generates WAL size of 90% of the tablesize approx.
>
> e.g
>
> Tablesize = 200 GB. Time takes to run vacuum = 1 hour 45 minutes. WAL
> generated 182 GB
>
>
>
> I tried VACUUM FREEZE also, but the WAL generated and time it takes is no
> significantly different.
>
>
>
> Following is an example output of a table vacuum:
>
>
>
> vacuumdb: vacuuming database "large_db"
>
> INFO: aggressively vacuuming "public.tab_111"
>
> INFO: launched 1 parallel vacuum worker for index cleanup (planned: 1)
>
> INFO: table "tab_111": found 0 removable, 527846215 nonremovable row
> versions in 15396753 out of 15396753 pages
>
> DETAIL: 0 dead row versions cannot be removed yet, oldest xmin: 954951860
>
> Skipped 0 pages due to buffer pins, 0 frozen pages.
>
> CPU: user: 131.12 s, system: 174.14 s, elapsed: 4111.88 s.
>
> INFO: aggressively vacuuming "pg_toast.pg_toast_17386"
>
> INFO: table "pg_toast_17386": found 0 removable, 32180684 nonremovable
> row versions in 7981550 out of 7981550 pages
>
> DETAIL: 0 dead row versions cannot be removed yet, oldest xmin: 955034530
>
> Skipped 0 pages due to buffer pins, 0 frozen pages.
>
> CPU: user: 52.96 s, system: 87.86 s, elapsed: 2104.04 s.
>
>
>
> Is there a way I can minimize WAL generation? My issue is amount of WAL
> rather than time it takes to run. Since it is not locking the table I do
> not mind long run time.
>
> I know one way is to pgdump/restore but it takes a long time and further
> to that I have to rebuild replicas.
>
>
>
> Please note, I have autovacuum turned on and it is doing what it is
> supposed to do on tables that change. So, there is no issue there.
>
>
>
> I very much appreciate any help/advice you can provide.
>

--
Death to <Redacted>, and butter sauce.
Don't boil me, I'm still alive.
<Redacted> lobster!

In response to

Responses

Browse pgsql-admin by date

  From Date Subject
Next Message Murthy Nunna 2025-09-22 20:02:56 RE: Vacuum Question
Previous Message Murthy Nunna 2025-09-22 15:06:26 Vacuum Question