pg_restore V12 fails consistently against piped pg_dumps
Hi all,
When doing a parallel pg_restore (v12) against a dump created through a
pipe using an earlier version (11 all the way to 9.6), it fails with the
known error of not finding data offsets. I understand the reasons for it
(potential inability to seek), which is documented in pg_restore.
What I don't understand is why the same `pg_restore -j` worked in earlier
versions (say running pg_restore_v11 against the same dumps). Has anything
changed in terms of ordering? I am actually quite curious what led to this
finally breaking consistently.
I also timed things, and found that pg_restore_12 against a pg_dump_12
takes about the same time as pg_restore_11 vs pg_dump_11, on the same
dataset. I initially did this to see if for some reason pg_restore_v11 was
compensating for the lack of the offsets, but this didn't seem to be the
case (or perhaps the dump is too small to matter, around 1.5GB).
--
Wael
Mohamed Wael Khobalatte <mkhobalatte@grubhub.com> writes:
When doing a parallel pg_restore (v12) against a dump created through a
pipe using an earlier version (11 all the way to 9.6), it fails with the
known error of not finding data offsets. I understand the reasons for it
(potential inability to seek), which is documented in pg_restore.
What I don't understand is why the same `pg_restore -j` worked in earlier
versions (say running pg_restore_v11 against the same dumps). Has anything
changed in terms of ordering? I am actually quite curious what led to this
finally breaking consistently.
Without a concrete example it's hard to say, but maybe the issue is that
v12 is more aggressive about parallelizing restores --- see 548e50976.
regards, tom lane
On Thu, May 7, 2020 at 2:35 AM Tom Lane <tgl@sss.pgh.pa.us> wrote:
Without a concrete example it's hard to say, but maybe the issue is that
v12 is more aggressive about parallelizing restores --- see 548e50976.
Thanks Tom, I will review those changes tonight. In the meantime, to
reproduce, I run the following:
- createdb test
- create some tables, I used a simple loop to create 10 empty ones.
- pg_dump -v -Fc test | tee test.dump > /dev/null (so it's through a
pipe, same as if the file is streamed through curl which was the
original case)
- pg_restore -j4 --verbose --clean --no-acl --no-owner -d test test.dump
That should fail consistently. pg_restore_12 and pg_dump_12. Same
passes in if I run in earlier versions.
On Thu, 2020-05-07 at 11:04 -0400, Mohamed Wael Khobalatte wrote:
Thanks Tom, I will review those changes tonight. In the meantime, to
reproduce, I run the following:- createdb test
- create some tables, I used a simple loop to create 10 empty ones.
- pg_dump -v -Fc test | tee test.dump > /dev/null (so it's through a
pipe, same as if the file is streamed through curl which was the
original case)
- pg_restore -j4 --verbose --clean --no-acl --no-owner -d test test.dumpThat should fail consistently. pg_restore_12 and pg_dump_12. Same
passes in if I run in earlier versions.
I just tried that and didn't encounter any errors.
Please come up with a more complete example.
Are you OS user "postgres" when you run that?
Yours,
Laurenz Albe
--
Cybertec | https://www.cybertec-postgresql.com
On 5/7/20 11:47 PM, Laurenz Albe wrote:
On Thu, 2020-05-07 at 11:04 -0400, Mohamed Wael Khobalatte wrote:
Thanks Tom, I will review those changes tonight. In the meantime, to
reproduce, I run the following:- createdb test
- create some tables, I used a simple loop to create 10 empty ones.
- pg_dump -v -Fc test | tee test.dump > /dev/null (so it's through a
pipe, same as if the file is streamed through curl which was the
original case)
- pg_restore -j4 --verbose --clean --no-acl --no-owner -d test test.dumpThat should fail consistently. pg_restore_12 and pg_dump_12. Same
passes in if I run in earlier versions.I just tried that and didn't encounter any errors.
I did:
pg_dump -d production -U postgres -Fc |tee test.dump > /dev/null
pg_restore -j4 -d production_test -U postgres test.dump
pg_restore: error: could not find block ID 4804 in archive -- possibly
due to out-of-order restore request, which cannot be handled due to lack
of data offsets in archive
pg_restore: error: could not find block ID 4806 in archive -- possibly
due to out-of-order restore request, which cannot be handled due to lack
of data offsets in archive
pg_restore: error: a worker process died unexpectedly
Whereas a restore without -j4 succeeded.
Please come up with a more complete example.
Are you OS user "postgres" when you run that?
Yours,
Laurenz Albe
--
Adrian Klaver
adrian.klaver@aklaver.com
On Fri, May 8, 2020 at 10:59 AM Adrian Klaver <adrian.klaver@aklaver.com> wrote:
On 5/7/20 11:47 PM, Laurenz Albe wrote:
On Thu, 2020-05-07 at 11:04 -0400, Mohamed Wael Khobalatte wrote:
Thanks Tom, I will review those changes tonight. In the meantime, to
reproduce, I run the following:- createdb test
- create some tables, I used a simple loop to create 10 empty ones.
- pg_dump -v -Fc test | tee test.dump > /dev/null (so it's through a
pipe, same as if the file is streamed through curl which was the
original case)
- pg_restore -j4 --verbose --clean --no-acl --no-owner -d test test.dumpThat should fail consistently. pg_restore_12 and pg_dump_12. Same
passes in if I run in earlier versions.I just tried that and didn't encounter any errors.
I did:
pg_dump -d production -U postgres -Fc |tee test.dump > /dev/null
pg_restore -j4 -d production_test -U postgres test.dump
pg_restore: error: could not find block ID 4804 in archive -- possibly
due to out-of-order restore request, which cannot be handled due to lack
of data offsets in archive
pg_restore: error: could not find block ID 4806 in archive -- possibly
due to out-of-order restore request, which cannot be handled due to lack
of data offsets in archive
pg_restore: error: a worker process died unexpectedlyWhereas a restore without -j4 succeeded.
Please come up with a more complete example.
Are you OS user "postgres" when you run that?
Yours,
Laurenz Albe--
Adrian Klaver
adrian.klaver@aklaver.com
Laurenz, I did the same as Adrian above, but with my own
non-"postgres" user. Between my check and Adrian's, it seems to be
user-indepedent (although I don't know what that would mean
precisely).