Обсуждение: Still getting VACUUM errors after 7.2.4 upgrade

Поиск
Список
Период
Сортировка

Still getting VACUUM errors after 7.2.4 upgrade

От
Jeff Boes
Дата:
VACUUM is my least favorite PostgreSQL feature ... mostly because it's
caused me the most grief over the last couple of years.

We continue to experience intermittent errors with VACUUM and especially
VACUUM FULL on our 7.2.4 installation. These errors first began to appear
under earlier 7.2.x installations.  The most frequent ones are:


ERROR: No one parent tuple was found

NOTICE:  Child itemid in update-chain marked as unused -
  can't continue repair_frag


For one of the smaller tables experiencing these problems, I've tried
dropping and recreating the table. The largest one with this problem is a
bit too large for me to do this casually; I'd have to plan some
significant down-time.

Are these problems serious? Should I just ignore them until we go to 7.3?

--
Jeff Boes                                      vox 269.226.9550 ext 24
Database Engineer                                     fax 269.349.9076
Nexcerpt, Inc.                                 http://www.nexcerpt.com
           ...Nexcerpt... Extend your Expertise

Re: Still getting VACUUM errors after 7.2.4 upgrade

От
Tom Lane
Дата:
Jeff Boes <jboes@nexcerpt.com> writes:
> ERROR: No one parent tuple was found
> NOTICE:  Child itemid in update-chain marked as unused -
>   can't continue repair_frag

> Are these problems serious? Should I just ignore them until we go to 7.3?

No; yes.  They've been "fixed" in 7.3 by the simple expedient of
downgrading the messages to DEBUG level ;-).  The reason is that these
are in fact not unexpected cases.  The 7.3 source code explains:

       * NOTE: this test is not 100% accurate: it is possible for a
       * tuple to be an updated one with recent xmin, and yet not
       * have a corresponding tuple in the vtlinks list.  Presumably
       * there was once a parent tuple with xmax matching the xmin,
       * but it's possible that that tuple has been removed --- for
       * example, if it had xmin = xmax then
       * HeapTupleSatisfiesVacuum would deem it removable as soon as
       * the xmin xact completes.
       *
       * To be on the safe side, we abandon the repair_frag process if
       * we cannot find the parent tuple in vtlinks.  This may be
       * overly conservative; AFAICS it would be safe to move the
       * chain.

Since the set of tuples deemed "recent" depends on the age of the oldest
open transaction, having long-running transactions open concurrently
with your VACUUM FULL considerably increases the odds of such trouble.
Dunno if that describes your situation, or if there's anything you can
do to change it if it is, but it's the only tip I can offer.

Really my feeling about it is you shouldn't be doing VACUUM FULL on
heavily-used tables anyway --- lazy VACUUM is what to be using.
If that fails to keep the table size reasonable, that means you aren't
doing it often enough or don't have a large enough FSM.

            regards, tom lane