Обсуждение: pg_dump --data-only problem with PgSQL 8.0

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

pg_dump --data-only problem with PgSQL 8.0

От
Jani Averbach
Дата:
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

Re: pg_dump --data-only problem with PgSQL 8.0

От
Michael Fuhr
Дата:
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/

Re: pg_dump --data-only problem with PgSQL 8.0

От
Tom Lane
Дата:
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

Re: pg_dump --data-only problem with PgSQL 8.0

От
Jani Averbach
Дата:
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