On Tue, Sep 03, 2024 at 06:43:22PM -0700, "David G. Johnston" <david.g.johnston@xxxxxxxxx> wrote: > On Tuesday, September 3, 2024, raf <postgres@xxxxxxx> wrote: > > > Hi, > > > > I need help! > > > > I'm upgrading an ancient (but still awesome) postgresql-9.6.24 (via > > EnterpriseDB) > > to (a no doubt even more awesome) postgresql-15.8 (via debian (stable) > > packages) > > but am unable to load database backups that were encrypted via gpg. > > Loading from > > unencrypted backups works fine (and the millions of tests all pass! Yay!). > > > > I have a convenience program for handling loading called "load" > > and the underlying commands that it executes look like this: > > > > dropdb -h payroll -p 5433 -U postgres payroll_tst > > createdb -h payroll -p 5433 -U postgres -T template0 -E utf8 -O admin > > payroll_tst > > Given the following command > > > gpg --decrypt 20240904-011254-payroll_tst.pgdump.gpg.aps24 | pg_restore > > -1 -h payroll -p 5433 -U postgres -d payroll_tst -Fc > > And this error > > > pg_restore: [archiver (db)] could not execute query: ERROR: could not > > find function "xml_is_well_formed" in file "/usr/lib/postgresql/15/lib/ > > pgxml.so" > > Command was: CREATE FUNCTION public.xml_is_well_formed(text) > > RETURNS boolean > > LANGUAGE c IMMUTABLE STRICT > > AS '$libdir/pgxml', 'xml... > > This should be expected. In particular… > > > gpg: error writing to '-': Broken pipe > > gpg: error flushing '[stdout]': Broken pipe > > gpg: handle plaintext failed: Broken pipe > > pgrestore encountered errors > > > > I'm not worried about the xml_is_well_formed error (or the xml_valid > > error that would happen next). I think those functions are ancient > > and irrelevant and not in use, and I'm happy for pg_restore to > > continue, like it does when gpg is not involved. > > You specified “-1” so I don’t get why you believe pg_restore should be > continuing to execute in the face of the SQL error. The reason I believe pg_restore should be continuing to execute in the face of the SQL error is because I didn't supply the -e option which is described thusly in the pg_restore manual entry: -e --exit-on-error Exit if an error is encountered while sending SQL commands to the database. The default is to continue and to display a count of errors at the end of the restoration. So, since I didn't specify the -e option, pg_restore should continue to execute, and not close stdin. As I explained, when restoring from a file on disk, the pg_restore command does continue and work fine. It's only when restoring from stdin that I'm seeing this problem. Ah, I see. The manual entry also says that -1 implies -e. And when reading from a file on disk, my load script doesn't include -1. Instead, it uses the -j option. Now it all makes sense. Many thanks. It's working without the -1. I'll change the load script so that it only uses the -1 option when restoring from new backups taken after the upgrade to 15.8 (where these vestigial xml functions won't be present in the backup). > David J. cheers, raf