Thread: index "pg_authid_rolname_index" is not a btree
Hard disk containing PostgreSql 8.1 database on Windows crashes and there was no new backup copy. I installed 8.1.9 to new computer and copied data directory from crashed disk to it. data directory contains a lot of files with a lot of data. Trying to connect to template0 or any other database in this cluster causes error Error connecting to the server: FATAL: index "pg_authid_rolname_index" is not a btree How to recover data from this cluster ? Andrus.
Andrus Moor wrote: > Hard disk containing PostgreSql 8.1 database on Windows crashes and > there was no new > backup copy. > > I installed 8.1.9 to new computer and copied data directory from > crashed disk to it. > data directory contains a lot of files with a lot of data. > > Trying to connect to template0 or any other database in this cluster causes > error > > Error connecting to the server: FATAL: index "pg_authid_rolname_index" is > not a btree You can get around that particular problem by reindexing the pg_authid table. But my guess is that you'll find that there's corruption elsewhere that's not so easily recoverable ... -- Alvaro Herrera http://www.CommandPrompt.com/ PostgreSQL Replication, Consulting, Custom Development, 24x7 support
Alvaro, > You can get around that particular problem by reindexing the pg_authid > table. But my guess is that you'll find that there's corruption > elsewhere that's not so easily recoverable ... Thank you. reindexing system tables and whole database succeeds. After that I can connect to database containing data to recover. However pg_dump fails: bin\pg_dump -f recover.backup -i -v -F c -h localhost -p 5433 -U postgres mydb pg_dump: reading schemas pg_dump: reading user-defined functions pg_dump: reading user-defined types pg_dump: SQL command failed pg_dump: Error message from server: ERROR: could not identify an ordering operator for type name HINT: Use an explicit ordering operator or modify the query. pg_dump: The command was: SELECT tableoid, oid, conname, pg_catalog.pg_get_constraintdef(oid) AS consrc FROM pg_catalog.pg_constraint WHERE contypid = '10635':: pg_catalog.oid ORDER BY conname pg_dump: *** aborted because of error How to recover data from this database ? Should I re-create ordering operator in some way ? Andrus.
"Andrus Moor" <kobruleht2@hot.ee> writes: > Alvaro, >> You can get around that particular problem by reindexing the pg_authid >> table. But my guess is that you'll find that there's corruption >> elsewhere that's not so easily recoverable ... > Thank you. > reindexing system tables and whole database succeeds. > After that I can connect to database containing data to recover. > However pg_dump fails: > pg_dump: Error message from server: ERROR: could not identify an ordering > operator for type name Alvaro was right --- you've got damage in the system catalogs, not just their indexes. This looks like missing entries in pg_amop. (You did say you reindexed all the system catalogs, right? If not it's possible this is only index damage, but I'm not very hopeful.) I suspect that if you did get to the point of being able to run pg_dump without error, you'd find just as much damage to the user data. I'm afraid this database is toast and you should write it off as a learning experience. Hardware fails, you need backups. regards, tom lane
Tom, Thank you. > Alvaro was right --- you've got damage in the system catalogs, not just > their indexes. This looks like missing entries in pg_amop. postgres -D data mydb PostgreSQL stand-alone backend 8.1.9 backend> select * from pg_amop 1: amopclaid (typeid = 26, len = 4, typmod = -1, byval = t) 2: amopsubtype (typeid = 26, len = 4, typmod = -1, byval = t) 3: amopstrategy (typeid = 21, len = 2, typmod = -1, byval = t) 4: amopreqcheck (typeid = 16, len = 1, typmod = -1, byval = t) 5: amopopr (typeid = 26, len = 4, typmod = -1, byval = t) ---- pg_amop in mydb contains 5 rows. pg_amop in template1 database contains large number of rows. mydb does not contain user-defined operators. How to repair pg_amop in mydb ? > (You did > say you reindexed all the system catalogs, right? If not it's possible > this is only index damage, but I'm not very hopeful.) reindex system mydb reindex database mydb complete without errors. > I suspect that if you did get to the point of being able to run pg_dump > without error, you'd find just as much damage to the user data. I'm > afraid this database is toast and you should write it off as a learning > experience. Hardware fails, you need backups. Backup is 4.2 GB and is corrupted after 2 GB as I described in other thread. Also, backup is too old. Most of backup size contains few big tables which are not required to recover. I ran truncate commands for those tables. This reduces whole data directory size to 1.2 GB in uncompressed form. I know which tables contain data to be recovered. How to dump those tables out ? Andrus.
"Andrus Moor" <kobruleht2@hot.ee> writes: > pg_amop in mydb contains 5 rows. > pg_amop in template1 database contains large number of rows. > mydb does not contain user-defined operators. > How to repair pg_amop in mydb ? Well, you could try copying the physical file for pg_amop from template1 to mydb (and then reindexing it again). I am not holding out a lot of hope though. I think you're most likely going to run into a dead end, unfixable problem before you get any data out. > Most of backup size contains few big tables which are not required to > recover. Maybe you should forget about pg_dump and just see if you can COPY the tables you care about. regards, tom lane