Обсуждение: lost tablespace

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

lost tablespace

От
Thorsten Strufe
Дата:
Hi everybody,

sorry, noob here. So we've just started using postgre and right at the
start we had a hardware problem with a hard drive failing. We can still
start postgre but a tablespace for a db that we don't even need anymore
is lost. Now we would think that shouldn't be a problem, we could simply
drop that db. postgre, however, doesn't allow us to, but tells us to
vacuume the db first. Starting postgre singleuser and trying to run
vacuum still gives us the same trouble.

Now a naive question: is there any (sane) way to simply get postgre to
entirely forget about the broken db - and that's it (dumping the other
db and loading it back might not be the best solution, since it's rather
large..)?


TIA, best,

Thorsten

syslog-snippet:
2011-11-10 11:05:10 CET LOG:  incomplete startup packet
2011-11-10 11:05:10 CET LOG:  could not open tablespace directory
"pg_tblspc/17488/PG_9.0_201008051": No such file or directory
2011-11-10 11:05:10 CET LOG:  could not open tablespace directory
"pg_tblspc/18488/PG_9.0_201008051": No such file or directory
2011-11-10 11:05:10 CET LOG:  could not open tablespace directory
"pg_tblspc/18055/PG_9.0_201008051": No such file or directory
2011-11-10 11:05:10 CET WARNING:  database with OID 17546 must be
vacuumed within 999999 transactions
2011-11-10 11:05:10 CET HINT:  To avoid a database shutdown, execute a
database-wide VACUUM in that database.
        You might also need to commit or roll back old prepared
transactions.
2011-11-10 11:05:10 CET LOG:  autovacuum launcher started
2011-11-10 11:05:10 CET LOG:  database system is ready to accept connections
2011-11-10 11:05:19 CET ERROR:  could not open file
"pg_tblspc/18055/PG_9.0_201008051/11874/18260": No such file or directory
2011-11-10 11:05:19 CET CONTEXT:  automatic vacuum of table
"postgres.public.user"
2011-11-10 11:05:19 CET ERROR:  could not open file
"pg_tblspc/18055/PG_9.0_201008051/11874/18276": No such file or directory
2011-11-10 11:05:19 CET CONTEXT:  automatic vacuum of table
"postgres.public.task"
2011-11-10 11:05:19 CET ERROR:  could not open file
"pg_tblspc/18055/PG_9.0_201008051/11874/18298": No such file or directory
2011-11-10 11:05:19 CET CONTEXT:  automatic vacuum of table
"postgres.public.queue"
2011-11-10 11:05:19 CET ERROR:  database is not accepting commands to
avoid wraparound data loss in database with OID 17546
2011-11-10 11:05:19 CET HINT:  Stop the postmaster and use a standalone
backend to vacuum that database.
        You might also need to commit or roll back old prepared
transactions.
2011-11-10 11:05:28 CET ERROR:  could not open file
"pg_tblspc/18055/PG_9.0_201008051/11874/18260": No such file or directory
2011-11-10 11:05:28 CET CONTEXT:  automatic vacuum of table
"postgres.public.user"
2011-11-10 11:05:28 CET ERROR:  could not open file
"pg_tblspc/18055/PG_9.0_201008051/11874/18276": No such file or directory
2011-11-10 11:05:28 CET CONTEXT:  automatic vacuum of table
"postgres.public.task"
2011-11-10 11:05:28 CET ERROR:  could not open file
"pg_tblspc/18055/PG_9.0_201008051/11874/18298": No such file or directory
2011-11-10 11:05:28 CET CONTEXT:  automatic vacuum of table
"postgres.public.queue"
2011-11-10 11:05:28 CET ERROR:  database is not accepting commands to
avoid wraparound data loss in database with OID 17546
2011-11-10 11:05:28 CET HINT:  Stop the postmaster and use a standalone
backend to vacuum that database.
        You might also need to commit or roll back old prepared
transactions.
2011-11-10 11:05:36 CET ERROR:  could not open file
"pg_tblspc/18055/PG_9.0_201008051/11874/18260": No such file or directory
2011-11-10 11:05:36 CET CONTEXT:  automatic vacuum of table
"postgres.public.user"
2011-11-10 11:05:36 CET ERROR:  could not open file
"pg_tblspc/18055/PG_9.0_201008051/11874/18276": No such file or directory
2011-11-10 11:05:36 CET CONTEXT:  automatic vacuum of table
"postgres.public.task"
2011-11-10 11:05:36 CET ERROR:  could not open file
"pg_tblspc/18055/PG_9.0_201008051/11874/18298": No such file or directory
2011-11-10 11:05:36 CET CONTEXT:  automatic vacuum of table
"postgres.public.queue"
2011-11-10 11:05:36 CET ERROR:  database is not accepting commands to
avoid wraparound data loss in database with OID 17546
2011-11-10 11:05:36 CET HINT:  Stop the postmaster and use a standalone
backend to vacuum that database.
        You might also need to commit or roll back old prepared
transactions.

...

etc.etc.etc

Re: lost tablespace

От
"Kevin Grittner"
Дата:
Thorsten Strufe <strufe.pub@googlemail.com> wrote:

> is there any (sane) way to simply get postgre to entirely forget
> about the broken db - and that's it (dumping the other db and
> loading it back might not be the best solution, since it's rather
> large..)?

I think that using pg_dump for the good databases is sane, and the
simplest solution.  Another option would normally be one of the
trigger-based replication systems, like Slony (to reduce down time
to a matter of minutes or seconds); but the crippled state of the
cluster may make the hard.

http://wiki.postgresql.org/wiki/Replication,_Clustering,_and_Connection_Pooling

-Kevin

Re: lost tablespace

От
Craig Ringer
Дата:
It'd help to know what Pg version you're running. Comments inline below.

On 11/10/2011 07:01 PM, Thorsten Strufe wrote:

> sorry, noob here. So we've just started using postgre and right at the
> start we had a hardware problem with a hard drive failing. We can still
> start postgre but a tablespace for a db that we don't even need anymore
> is lost. Now we would think that shouldn't be a problem, we could simply
> drop that db. postgre, however, doesn't allow us to, but tells us to
> vacuume the db first. Starting postgre singleuser and trying to run
> vacuum still gives us the same trouble.

It'd be nice if PostgreSQL would `DROP DATABASE' successfully when there
were missing files, just raising WARNINGs for those files. I'm not too
shocked that it's not implemented though, as the files backing a
database should never just go away, and if they do the database is
considered severely damaged at best.

> Now a naive question: is there any (sane) way to simply get postgre to
> entirely forget about the broken db - and that's it (dumping the other
> db and loading it back might not be the best solution, since it's rather
> large..)?

No sane way I know of. A less-than-sane way is to mess with pg_catalog
to get rid of the database, but that's unsafe at very best. I'd just
dump the other databases, then re-initdb and reload them; that's the
safest way by far.

> 2011-11-10 11:05:10 CET WARNING:  database with OID 17546 must be
> vacuumed within 999999 transactions

Now that's interesting. I wonder why it thinks the database is at risk
of OID wraparound? It could genuinely be, or it might be confused
because the files backing the database are missing.

Anyone have an opinion on whether it should be possible to drop a
database that's hit or nearly hit OID wraparound w/o a vacuum first? I
don't see any point vacuuming just to drop it, but this may be too much
of a corner case to justify the testing a special case like this would
require.

--
Craig Ringer