Re: VACUUM and transactions in different databases

From: Alvaro Herrera <alvherre(at)commandprompt(dot)com>
To: Bill Moran <wmoran(at)collaborativefusion(dot)com>
Cc: Christopher Browne <cbbrowne(at)acm(dot)org>, pgsql-general(at)postgresql(dot)org
Subject: Re: VACUUM and transactions in different databases
Date: 2006-12-07 14:11:49
Message-ID: 20061207141149.GA13321@alvh.no-ip.org
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-general

Bill Moran wrote:
> In response to Christopher Browne <cbbrowne(at)acm(dot)org>:
> > Oops! c(at)cornelia-boenigk(dot)de (Cornelia Boenigk) was seen spray-painting on a wall:
> > > Hi all
> > >
> > > If I have a running transaction in database1 and try to vacuum
> > > database2 but the dead tuples in database2 cannot be removed.
> > >
> > > INFO: vacuuming "public.dummy1"
> > > INFO: "dummy1": found 0 removable, 140000 nonremovable row versions
> > > in 1341 pages
> > > DETAIL: 135000 dead row versions cannot be removed yet.
> > >
> > > How can I achieve that database2 is vacuumed while a transaction in
> > > database1 is not yet commited?
> >
> > You can't, unless you're on 8.1, and the not-yet-committed transaction
> > is VACUUM.
>
> I'm a little confused.
>
> First off, it would seem as if this is completely eliminated in 8.2, as
> I tested a scenario involving an idle transaction in one database, and
> both vacuum and vacuum full were able to complete in another database
> without completing the first transaction.

Of course they are able to complete, but the point is that they would
not remove the tuples that would be visible to that idle open
transaction.

> Are you saying that in 8.1, there is a single exception to this, which
> is that if db1 (for example) is in the process of running vacuum, it
> won't block db2 from vacuuming? But that any other type of transaction
> can block operations in other databases?

In 8.2, a process running lazy vacuum (but not vacuum full) will not
interfere with another process running vacuum, i.e., the second vacuum
will be able to remove the tuples even if they would be seen by the
transaction doing the first vacuum -- regardless of the database to
which any of them is connected (i.e., it may be the same database or
different databases). I don't remember if this was in 8.1 or was
introduced in 8.2.

--
Alvaro Herrera http://www.CommandPrompt.com/
PostgreSQL Replication, Consulting, Custom Development, 24x7 support

In response to

Responses

Browse pgsql-general by date

  From Date Subject
Next Message Joost Kraaijeveld 2006-12-07 14:19:54 Re: Why does explain differ from explan analyze?
Previous Message Bill Moran 2006-12-07 14:01:22 Re: VACUUM and transactions in different databases