Re: Broken pg_class table

From: Roger Ging <roger(at)musicreports(dot)com>
To: Tom Lane <tgl(at)sss(dot)pgh(dot)pa(dot)us>
Cc: pgsql-admin(at)postgresql(dot)org
Subject: Re: Broken pg_class table
Date: 2006-07-16 19:52:52
Message-ID: 44BA9914.4010300@musicreports.com
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-admin

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<meta content="text/html;charset=ISO-8859-1" http-equiv="Content-Type">
<title></title>
</head>
<body bgcolor="#ffffff" text="#000000">
Tom,<br>
<br>
Thanks for the info.&nbsp; I have begun the rebuild from backups.&nbsp; The
machine is&nbsp; a data warehouse with no backups of it's own, but all of
the data is available from other servers.<br>
<br>
Roger<br>
<br>
Tom Lane wrote:
<blockquote cite="mid20535(dot)1153076410(at)sss(dot)pgh(dot)pa(dot)us" type="cite">
<pre wrap="">Roger Ging <a class="moz-txt-link-rfc2396E" href="mailto:roger(at)musicreports(dot)com">&lt;roger(at)musicreports(dot)com&gt;</a> writes:
</pre>
<blockquote type="cite">
<pre wrap="">update pg_class set reltriggers =
(select count(*) from pg_trigger where tgrelid =
(select oid from pg_class where relname = '$tbl' and relnamespace =
(select oid from pg_namespace where nspname = '$sch')))
--should have been a limiting where clause here
</pre>
</blockquote>
<pre wrap=""><!---->
I see, so now *all* the rows of pg_class have some nonzero reltriggers
value, and so the backend is looking for nonexistent entries in
pg_triggers ... or it would be, if it could finish opening pg_triggers,
but it can't do that without finding the nonexistent pg_triggers entries
for pg_triggers ... infinite recursion time.

AFAICS your only hope of getting that database back up is to manually
reset the reltriggers fields to zero in the rows for at least the
critical system catalogs (pg_class, pg_attribute, pg_type, pg_proc,
pg_triggers, pg_constraint might be enough). This is doable with a hex
editor, but it seems kinda painful. You might be best off reverting to
your last backup. If you want to try it, I'd suggest looking for string
table names in the pg_class file and zeroing the two-byte reltriggers
field occurring exactly 112 bytes beyond the start of each name (that
appears to be the correct offset in 8.1). Possibly the easiest thing
is to zero *all* these fields, and then reconstruct the ones that should
be nonzero after you can get into the DB again.

FWIW, as of 8.1 there's no longer any need to do anything as risky as
mucking with reltriggers by hand. Use ALTER TABLE ENABLE/DISABLE
TRIGGER instead.

And by the by, you should definitely not still be using 8.1.0.

regards, tom lane
</pre>
</blockquote>
</body>
</html>

Attachment Content-Type Size
unknown_filename text/html 2.3 KB

In response to

Browse pgsql-admin by date

  From Date Subject
Next Message Richard George 2006-07-17 12:33:04 Changing a database owner on postgres 7.3
Previous Message Tom Lane 2006-07-16 19:00:10 Re: Broken pg_class table