Thread: pg_restore problem
Hello world, (PostgreSQL 7.2.1-5, fully patched RedHat 7.3) I have a db with some relations on OIDs and some BLOBs. I create a backup with this command: pg_dump -Fc -o -b mydb > mydb.dump But a restore with: pg_restore -dmydb -Fc mydb.dump Gives this error: CREATE DATABASE pg_restore: connecting to database for restore pg_restore: executing <Init> Max OID pg_restore: creating FUNCTION "plpgsql_call_handler" () pg_restore: [archiver (db)] could not execute query: ERROR: function plpgsql_call_handler already exists with same argument types pg_restore: *** aborted because of error Am I doing something wrong? TIA! -- Jules Alberts.
On 14 Aug 2002 at 11:49, Jules Alberts wrote: > Hello world, > > (PostgreSQL 7.2.1-5, fully patched RedHat 7.3) > > I have a db with some relations on OIDs and some BLOBs. I create a > backup with this command: > > pg_dump -Fc -o -b mydb > mydb.dump > > But a restore with: BTW in between I do a dropdb mydb > pg_restore -dmydb -Fc mydb.dump > > Gives this error: > > CREATE DATABASE > pg_restore: connecting to database for restore > pg_restore: executing <Init> Max OID > pg_restore: creating FUNCTION "plpgsql_call_handler" () > pg_restore: [archiver (db)] could not execute query: ERROR: function > plpgsql_call_handler already exists with same argument types > pg_restore: *** aborted because of error > > Am I doing something wrong? TIA! -- Jules Alberts.
"Jules Alberts" <jules.alberts@arbodienst-limburg.nl> writes: > BTW in between I do a dropdb mydb You probably defined plpgsql in template1, so that when you do "createdb mydb" there's already a plpgsql definition in mydb. This confuses pg_restore, which is expecting to restore into a virgin database. Try "createdb -T template0 mydb" to make a database with no local additions, and then restore into that. regards, tom lane
On 14 Aug 2002 at 11:13, Tom Lane wrote: > "Jules Alberts" <jules.alberts@arbodienst-limburg.nl> writes: > > BTW in between I do a dropdb mydb > > You probably defined plpgsql in template1, so that when you do "createdb > mydb" there's already a plpgsql definition in mydb. This confuses > pg_restore, which is expecting to restore into a virgin database. Try > "createdb -T template0 mydb" to make a database with no local additions, > and then restore into that. > > regards, tom lane Thanks, that was it! I did a complete reinstall of 7.2.1 to make sure everything is default again (it's a test environment). Now I have another pg_restore problem. When I lo_import() an image I get a OID, say 241803. An lo_export() works OK. Then I do a backup with pg_dump --oids --blobs --format=c --compress=9 \ --verbose --file=mydb.dump mydb &> mydbBackup.log then a dropdb mydb, then a restore with pg_restore --dbname=mydb --verbose --format=c \ mydb.dump &> mydbRestore.log This restores the OIDs of all my tables (as I expected), except the BLOBs, lo_export(241803, '/tmp/foobar') says "ERROR inv_open large object 241803 not found". This is a problem because I save the BLOBs OID as a reference in other tables. Am I doing something wrong or is this a known issue? TIA! -- Jules Alberts.
"Jules Alberts" <jules.alberts@arbodienst-limburg.nl> writes: > This restores the OIDs of all my tables (as I expected), except the > BLOBs, lo_export(241803, '/tmp/foobar') says "ERROR inv_open large > object 241803 not found". This is a problem because I save the BLOBs > OID as a reference in other tables. Am I doing something wrong or is > this a known issue? pg_restore should fix up OID references to BLOBs ... if they are in columns of type OID (or type lo, if you've installed contrib/lo). I suspect you stored all your OID references in integer columns? regards, tom lane
On 15 Aug 2002 at 9:22, Tom Lane wrote: > "Jules Alberts" <jules.alberts@arbodienst-limburg.nl> writes: > > This restores the OIDs of all my tables (as I expected), except the > > BLOBs, lo_export(241803, '/tmp/foobar') says "ERROR inv_open large > > object 241803 not found". This is a problem because I save the BLOBs > > OID as a reference in other tables. Am I doing something wrong or is > > this a known issue? > > pg_restore should fix up OID references to BLOBs ... if they are in > columns of type OID (or type lo, if you've installed contrib/lo). I > suspect you stored all your OID references in integer columns? > > regards, tom lane (thanks for reacting) Sorry, I wasn't quite clear. The problem isn't that the references get lost, but that the actual OIDs of the blobs change. Here's an example: ############################################################# -- bash createdb test psql test -- psql select lo_import('/usr/share/pixmaps/gimp.png'); -- echoes 243596 -- bash pg_dump --oids --blobs --format=c --file=test.dump test dropdb test createdb test pg_restore --dbname=test --format=c test.dump -- psql select lo_export(243596, '/tmp/gimp.png'); -- ERROR: inv_open: large object 243596 not found ############################################################# In my database I want to store things like PDF files, images etc. for, say, a customer called CUST. Also there's a table to link the customers to any BLOBs related to him called CUST_BLOBS. In this table I create one row for each BLOB for a customer. A CUST_BLOBS row contains the customers OID + the BLOBs OID, so I can find all BLOBs of a customer by selecting blob_oid from CUST_BLOBS where CUST_BLOBS.customer_oid = customer.oid. This results in 0 or more OIDs of BLOBS. That's the reason why I need presistent OIDs for BLOBs. Hope I was a little bit more clear this time, TIA for any tips! -- Jules Alberts.
"Jules Alberts" <jules.alberts@arbodienst-limburg.nl> writes: > Sorry, I wasn't quite clear. The problem isn't that the references get > lost, but that the actual OIDs of the blobs change. Yes, they will, and there's not anything you can do to prevent it. What is supposed to happen is that pg_restore should update your CUST_BLOBS table to contain new blob OIDs instead of old ones. It builds a map from the old OIDs, which it can see in the dump file, to the new ones that get assigned on-the-fly as the blobs are loaded. Then it looks through the database for OID columns, and substitutes new blob OIDs wherever it can find a match to the list of old OIDs. One hole in this approach is that the lookup table CUST_BLOBS had better be present when the blob loading is done. Perhaps you tried to load it separately after loading the blobs? regards, tom lane
On 15 Aug 2002 at 11:45, Tom Lane wrote: > "Jules Alberts" <jules.alberts@arbodienst-limburg.nl> writes: > > Sorry, I wasn't quite clear. The problem isn't that the references get > > lost, but that the actual OIDs of the blobs change. > > Yes, they will, and there's not anything you can do to prevent it. > What is supposed to happen is that pg_restore should update your > CUST_BLOBS table to contain new blob OIDs instead of old ones. > It builds a map from the old OIDs, which it can see in the dump file, to > the new ones that get assigned on-the-fly as the blobs are loaded. Then > it looks through the database for OID columns, and substitutes new blob > OIDs wherever it can find a match to the list of old OIDs. Again something learned :-) I tested it, it works just like you said. Thanks a lot!