Обсуждение: pg_dump and pg_restore and foreign keys

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

pg_dump and pg_restore and foreign keys

От
Tore Halvorsen
Дата:
Hi,

I hope this is the correct place for this question.

I'm trying to restore a database where adding foreign key constraints takes most of the time. Does there exist a simple way to make either pg_dump or pg_restore handle them as "not valid", and defer the validation.


--
Eld på åren og sol på eng gjer mannen fegen og fjåg. [Jøtul]
<demo> Tore Halvorsen || +052 0553034554

Re: pg_dump and pg_restore and foreign keys

От
Tom Lane
Дата:
Tore Halvorsen <tore.halvorsen@gmail.com> writes:
> I'm trying to restore a database where adding foreign key constraints takes
> most of the time. Does there exist a simple way to make either pg_dump or
> pg_restore handle them as "not valid", and defer the validation.

No.  It's kind of a neat idea perhaps, but it's not there.  You could

* use parallel pg_restore to alleviate the pain, or

* use pg_restore's -l and -L switches to strip out the FKs altogether,
and then re-add them manually afterwards.

Or there's always

* hack the pg_dump source code to include NOT VALID.  While a real
feature patch that made this optional would be a bit complicated,
doing it unconditionally should be a one-line change.

            regards, tom lane



Re: pg_dump and pg_restore and foreign keys

От
Tore Halvorsen
Дата:
That would be appending it for "pg_catalog.pg_get_constraintdef(oid) AS condef"  in getConstraints in pg_dump.c?

On Wed, Oct 27, 2021 at 3:27 PM Tom Lane <tgl@sss.pgh.pa.us> wrote:
Tore Halvorsen <tore.halvorsen@gmail.com> writes:
> I'm trying to restore a database where adding foreign key constraints takes
> most of the time. Does there exist a simple way to make either pg_dump or
> pg_restore handle them as "not valid", and defer the validation.

No.  It's kind of a neat idea perhaps, but it's not there.  You could

* use parallel pg_restore to alleviate the pain, or

* use pg_restore's -l and -L switches to strip out the FKs altogether,
and then re-add them manually afterwards.

Or there's always

* hack the pg_dump source code to include NOT VALID.  While a real
feature patch that made this optional would be a bit complicated,
doing it unconditionally should be a one-line change.

                        regards, tom lane


--
Eld på åren og sol på eng gjer mannen fegen og fjåg. [Jøtul]
<demo> Tore Halvorsen || +052 0553034554

Re: pg_dump and pg_restore and foreign keys

От
Tom Lane
Дата:
Tore Halvorsen <tore.halvorsen@gmail.com> writes:
> That would be appending it for "pg_catalog.pg_get_constraintdef(oid) AS
> condef"  in getConstraints in pg_dump.c?

No, you want to mess with the text printed by dumpConstraint().

            regards, tom lane



Re: pg_dump and pg_restore and foreign keys

От
Tore Halvorsen
Дата:
Then I'll try that, thank you :)

On Wed, Oct 27, 2021 at 4:04 PM Tom Lane <tgl@sss.pgh.pa.us> wrote:
Tore Halvorsen <tore.halvorsen@gmail.com> writes:
> That would be appending it for "pg_catalog.pg_get_constraintdef(oid) AS
> condef"  in getConstraints in pg_dump.c?

No, you want to mess with the text printed by dumpConstraint().

                        regards, tom lane


--
Eld på åren og sol på eng gjer mannen fegen og fjåg. [Jøtul]
<demo> Tore Halvorsen || +052 0553034554

Re: pg_dump and pg_restore and foreign keys

От
Tore Halvorsen
Дата:
In case someone else needs to do this - I ended up with this change in pg_dump.c around lines 17080-17090

I guess a proper solution would check the already invalid foreign keys in a different way.

appendPQExpBuffer(q, "    ADD CONSTRAINT %s %s%s;\n",
fmtId(coninfo->dobj.name),
coninfo->condef
, dopt->foreign_keys_not_valid && !strstr(coninfo->condef, "NOT VALID") ? " NOT VALID":"");



On Wed, Oct 27, 2021 at 4:08 PM Tore Halvorsen <tore.halvorsen@gmail.com> wrote:
Then I'll try that, thank you :)

On Wed, Oct 27, 2021 at 4:04 PM Tom Lane <tgl@sss.pgh.pa.us> wrote:
Tore Halvorsen <tore.halvorsen@gmail.com> writes:
> That would be appending it for "pg_catalog.pg_get_constraintdef(oid) AS
> condef"  in getConstraints in pg_dump.c?

No, you want to mess with the text printed by dumpConstraint().

                        regards, tom lane


--
Eld på åren og sol på eng gjer mannen fegen og fjåg. [Jøtul]
<demo> Tore Halvorsen || +052 0553034554


--
Eld på åren og sol på eng gjer mannen fegen og fjåg. [Jøtul]
<demo> Tore Halvorsen || +052 0553034554