Re: A few new options for vacuumdb

From: "Bossart, Nathan" <bossartn(at)amazon(dot)com>
To: Michael Paquier <michael(at)paquier(dot)xyz>
Cc: Masahiko Sawada <sawada(dot)mshk(at)gmail(dot)com>, Robert Haas <robertmhaas(at)gmail(dot)com>, "pgsql-hackers(at)postgresql(dot)org" <pgsql-hackers(at)postgresql(dot)org>
Subject: Re: A few new options for vacuumdb
Date: 2019-01-29 21:48:18
Message-ID: 32049A78-C429-4742-AEC1-941C9ABDE7B8@amazon.com
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-hackers

On 1/28/19, 6:35 PM, "Michael Paquier" <michael(at)paquier(dot)xyz> wrote:
> Anyway, patches 1 and 2 have been merged, and committed after some
> cleanup and adjustments. Patch 3 gets much easier now.

Thanks!

> - " ON c.relnamespace OPERATOR(pg_catalog.=) ns.oid\n");
> + " ON c.relnamespace OPERATOR(pg_catalog.=) ns.oid\n"
> + " LEFT JOIN pg_catalog.pg_class t"
> + " ON c.reltoastrelid OPERATOR(pg_catalog.=) t.oid\n");
> Why do need this part?

This is modeled after the query provided in the docs for preventing
transaction ID wraparound [0]. I think the idea is to combine the
relation with its TOAST table so that it does not need to be
considered separately. The VACUUM commands generated in vacuumdb will
also process the corresponding TOAST table for the relation, anyway.

I noticed a behavior change from the catalog query patch that we
probably ought to fix. The "WHERE c.relkind IN ('r', 'm')" clause
seems sufficient to collect all vacuumable relations (TOAST tables are
handled when vacuuming the main relation, and partitioned tables are
handled by vacuuming the partitions individually), but it is not
sufficient to match the previous behavior when --table is used.
Previously, we did not filter by relkind at all when --table is used.
Instead, we let the server emit a WARNING when a relation that
couldn't be processed was specified.

Previous behavior:
~% vacuumdb -d postgres -t foreign_table
vacuumdb: vacuuming database "postgres"
WARNING: skipping "foreign_table" --- cannot vacuum non-tables or special system tables
~% vacuumdb -d postgres -t pg_toast.pg_toast_2600 --analyze-only
vacuumdb: vacuuming database "postgres"
WARNING: skipping "pg_toast_2600" --- cannot analyze non-tables or special system tables

Current behavior:
~% vacuumdb -d postgres -t foreign_table
vacuumdb: vacuuming database "postgres"
~% vacuumdb -d postgres -t pg_toast.pg_toast_2600 --analyze-only
vacuumdb: vacuuming database "postgres"

I think the simplest way to fix this is to remove the relkind clause
altogether when --table is used and to let the server decide whether
it should be processed. This effectively reinstates the previous
behavior so that users can specify TOAST tables, partitioned tables,
etc.

Unfortunately, this complicates the --min-xid-age and --min-mxid-age
patch a bit, as some of the relation types that can be vacuumed and/or
analyzed do not really have a transaction ID age. AFAICT the simplest
way to handle this case is to filter out relations with a relfrozenxid
or relminmxid of 0.

The v7 patch set implements these proposed approaches.

Nathan

[0] https://www.postgresql.org/docs/devel/routine-vacuuming.html#VACUUM-FOR-WRAPAROUND

Attachment Content-Type Size
v7-0001-Do-not-filter-by-relkind-in-vacuumdb-s-catalog-qu.patch application/octet-stream 2.4 KB
v7-0002-Add-min-xid-age-and-min-mxid-age-options-to-vacuu.patch application/octet-stream 8.0 KB

In response to

Responses

Browse pgsql-hackers by date

  From Date Subject
Next Message Andres Freund 2019-01-29 21:53:24 Re: COPY FROM WHEN condition
Previous Message David Rowley 2019-01-29 21:33:30 Re: COPY FROM WHEN condition