BUG #2239: "vacuumdb -a" remove freeze

Started by Olleg Samoylovabout 20 years ago4 messagesbugs
Jump to latest
#1Olleg Samoylov
olleg_s@mail.ru

The following bug has been logged online:

Bug reference: 2239
Logged by: Olleg Samoylov
Email address: olleg_s@mail.ru
PostgreSQL version: 8.1
Operating system: Linux (debian-amd64)
Description: "vacuumdb -a" remove freeze
Details:

template1=# select version();
version

----------------------------------------------------------------------------
------------------------------------
PostgreSQL 8.1.0 on x86_64-pc-linux-gnu, compiled by GCC cc (GCC) 4.0.3
20051111 (prerelease) (Debian 4.0.2-4)
(1 row)
template1=# select * from pg_database where datname='template1';
datname | datdba | encoding | datistemplate | datallowconn | datconnlimit
| datlastsysoid | datvacuumxid | datfrozenxid | dattablespace | datconfig |
datacl
-----------+--------+----------+---------------+--------------+-------------
-+---------------+--------------+--------------+---------------+-----------+
------------------------
template1 | 10 | 6 | t | t | -1
| 10792 | 1112 | 3221226585 | 1663 | |
{postgres=CT/postgres}
(1 row)
template1=# vacuum freeze;
VACUUM
template1=# select * from pg_database where datname='template1';
datname | datdba | encoding | datistemplate | datallowconn | datconnlimit
| datlastsysoid | datvacuumxid | datfrozenxid | dattablespace | datconfig |
datacl
-----------+--------+----------+---------------+--------------+-------------
-+---------------+--------------+--------------+---------------+-----------+
------------------------
template1 | 10 | 6 | t | t | -1
| 10792 | 1172 | 1172 | 1663 | |
{postgres=CT/postgres}
(1 row)

Okey, freezed, now launch vacuumdb from command line:

# vacuumdb -a -U postgres
vacuumdb: vacuuming database "postgres"
VACUUM
vacuumdb: vacuuming database "template1"
VACUUM

Opps, template1 must not be vacuumed.

select * from pg_database where datname='template1';
datname | datdba | encoding | datistemplate | datallowconn | datconnlimit
| datlastsysoid | datvacuumxid | datfrozenxid | dattablespace | datconfig |
datacl
-----------+--------+----------+---------------+--------------+-------------
-+---------------+--------------+--------------+---------------+-----------+
------------------------
template1 | 10 | 6 | t | t | -1
| 10792 | 1287 | 3221226760 | 1663 | |
{postgres=CT/postgres}
(1 row)

Unfreezed indeed.

#2Tom Lane
tgl@sss.pgh.pa.us
In reply to: Olleg Samoylov (#1)
Re: BUG #2239: "vacuumdb -a" remove freeze

"Olleg Samoylov" <olleg_s@mail.ru> writes:

Opps, template1 must not be vacuumed.

Says who?

If we didn't vacuum template1 then it would be subject to XID wraparound
problems, unless it had never been modified, which is something vacuumdb
can't count on.

regards, tom lane

#3Olleg Samoylov
olleg@mipt.ru
In reply to: Tom Lane (#2)
Re: BUG #2239: "vacuumdb -a" remove freeze

Tom Lane wrote:

"Olleg Samoylov" <olleg_s@mail.ru> writes:

Opps, template1 must not be vacuumed.

Says who?

If we didn't vacuum template1 then it would be subject to XID
wraparound problems, unless it had never been modified, which is
something vacuumdb can't count on.

template1 frozen by "vacuum freeze", thus can't be subject of XID
wraparound problems, isn't it?

man vacuum:

If this is done when there are no other open transactions in the same
database, then it is guaranteed that all tuples in the
database are ‘‘frozen’’ and will not be subject to transaction
ID wraparound problems, no matter how long the database is left
unvacuumed.

IMHO "vacuumdb -a" must don't vacuum database with
datvacuumxid=datfrozenxid.

--
Olleg Samoylov

#4Tom Lane
tgl@sss.pgh.pa.us
In reply to: Olleg Samoylov (#3)
Re: BUG #2239: "vacuumdb -a" remove freeze

Olleg Samoylov <olleg@mipt.ru> writes:

IMHO "vacuumdb -a" must don't vacuum database with
datvacuumxid=datfrozenxid.

That's not going to work because it will fail to detect whether the
database has been modified since the VACUUM FREEZE command.

In any case, what's the point? As long as you have a routine vacuuming
process in place, it doesn't really matter whether template1 gets
scanned. The only reason VACUUM FREEZE exists at all is to make it
possible to have a non-connectable, non-vacuumable template0.

regards, tom lane