Обсуждение: pg_dump --data-only problem with PgSQL 8.0
Hello, I have a following problem:
In short: I can't reload pg_dump --data-only dump (ver. 8.0) back to
the database, because the loading will violate ref. integrity.
The long story:
We have a PgSQL 7.2.5 database, and we like to bring only the data to
the PgSQL 8.0 system. So I did following:
1) dump 7.2.5 database with:
pg_dump \
"--data-only" \
"--column-inserts" \
"--use-set-session-authorization" \
old_db > old_db.data-only.dump
2) Create a schema on the new PgSQL system:
CreateDBSchema.sh new_db
3) Load the old data to the new system:
psql new_db < old_db.data-only.dump
So far, so good, the loading succeeded. Now If continue,
the following won't work:
4) Dump only data from just created 8.0 database:
pg_dump \
"--data-only" \
"--column-inserts" \
"--use-set-session-authorization" \
new_db > new_db.data-only.dump
5) Re-Create the new_db:
dropdb new_db; createdb new_db
CreateDBSchema.sh new_db
6) Try to reload data which was dumped from new ver 8.0 database:
psql new_db < new_db.data-only.dump
This will fail with lots of these kinds of errors:
ERROR: insert or update on table "mytable"
violates foreign key constraint "mytable_myattr_fkey"
However, If I take a data+schema dump after step #3,
7) Dump data and schema from new database:
pg_dump "--use-set-session-authorization" \
new_db > new_db.dump
8) And load that, it will succeed:
dropdb new_db; createdb new_db
psql new_db < new_db.dump
What I am doing wrong? Or have I found an ordering bug with pg_dump
when you are doing "--data-only" dumps?
These two databases are living in different machines, so there can't be
any version mismatch between pg_dump, psql and databases.
Thanks for any help,
Jani
--
Jani Averbach
On Mon, Jan 24, 2005 at 11:16:56AM -0700, Jani Averbach wrote: > What I am doing wrong? Or have I found an ordering bug with pg_dump > when you are doing "--data-only" dumps? In a simple test I see the same ordering (alphabetical?) whether I use --data-only or not. The schema+data dump succeeds because the dump doesn't add foreign key constraints until after all the data is loaded. -- Michael Fuhr http://www.fuhr.org/~mfuhr/
Jani Averbach <jaa@jaa.iki.fi> writes:
> the following won't work:
> 4) Dump only data from just created 8.0 database:
> pg_dump \
> "--data-only" \
> "--column-inserts" \
> "--use-set-session-authorization" \
> new_db > new_db.data-only.dump
> 5) Re-Create the new_db:
> dropdb new_db; createdb new_db
> CreateDBSchema.sh new_db
> 6) Try to reload data which was dumped from new ver 8.0 database:
> psql new_db < new_db.data-only.dump
> This will fail with lots of these kinds of errors:
> ERROR: insert or update on table "mytable"
> violates foreign key constraint "mytable_myattr_fkey"
Try it with --disable-triggers.
> Or have I found an ordering bug with pg_dump
> when you are doing "--data-only" dumps?
No. pg_dump can't guarantee a safe order for loading data when there
are pre-existing foreign key constraints in place (since the constraints
could be circular, and it wouldn't necessarily know what they are anyway).
So it doesn't try. You have to use --disable-triggers instead.
regards, tom lane
On 2005-01-24 13:46-0500, Tom Lane wrote: > Jani Averbach <jaa@jaa.iki.fi> writes: > > > This will fail with lots of these kinds of errors: > > ERROR: insert or update on table "mytable" > > violates foreign key constraint "mytable_myattr_fkey" > > Try it with --disable-triggers. > Thanks a lot! That fixed it. > > Or have I found an ordering bug with pg_dump > > when you are doing "--data-only" dumps? > > No. pg_dump can't guarantee a safe order for loading data when there > are pre-existing foreign key constraints in place (since the constraints > could be circular, and it wouldn't necessarily know what they are anyway). > So it doesn't try. You have to use --disable-triggers instead. I was wondering because data-only load from a dump generated with 7.2.5 succeeded, but data only load with dump genererated from 8.0.0 didn't. Any way, it works now, thank you for your help! BR, Jani -- Jani Averbach