Hi

ne 8. 6. 2025 v 14:39 odesílatel Pavel Stehule <pavel.steh...@gmail.com>
napsal:

> Hi,
>
> one customer reported an issue related probably to pg_restore and
> dictionary format.
>
> Inside PostgreSQL 11 I created one large object
>
> I used pg_dump (version 11) and did dump a) dictionary format, b) tar
> format
>
> I will try to restore these files in PostgreSQL 18 with pg_restore
> (version 18).
>
> pavel@nemesis:~$ /usr/local/pgsql/master/bin/pg_restore -Ft testx.tar -l
> ;
> ; Archive created at 2025-06-08 14:14:08 CEST
> ;     dbname: postgres
> ;     TOC Entries: 7
> ;     Compression: none
> ;     Dump Version: 1.13-0
> ;     Format: TAR
> ;     Integer: 4 bytes
> ;     Offset: 8 bytes
> ;     Dumped from database version: 11.22
> ;     Dumped by pg_dump version: 11.22
> ;
> ;
> ; Selected TOC Entries:
> ;
> 4034; 2613 16386 BLOB - 16386 pavel
> 4035; 0 0 BLOBS - BLOBS
>
> pavel@nemesis:~$ /usr/local/pgsql/master/bin/pg_restore -Fd testx -l
> ;
> ; Archive created at 2025-06-08 14:14:16 CEST
> ;     dbname: postgres
> ;     TOC Entries: 7
> ;     Compression: gzip
> ;     Dump Version: 1.13-0
> ;     Format: DIRECTORY
> ;     Integer: 4 bytes
> ;     Offset: 8 bytes
> ;     Dumped from database version: 11.22
> ;     Dumped by pg_dump version: 11.22
> ;
> ;
> ; Selected TOC Entries:
> ;
> 4034; 2613 16386 BLOB - 16386 pavel
> 4035; 0 0 BLOBS - BLOBS
>
> the --list options without problems
>
> When I try to restore blobs
>
> using tar format (b) it is working without problems
>
> but import from dictionary format fails with an error
>
> pavel@nemesis:~$ LANG=C /usr/local/pgsql/master/bin/pg_restore -Fd testx
> -d postgres
> pg_restore: error: could not open large object TOC file "testx/4035.dat"
> for input: No such file or directory
>
> When I use a dump in dictionary format from pg 18, there is difference
>
> instead of the blobs_4035.toc I have a file blobs.toc with the same
> content.
>
> In the tar format, the differences between format pg18 and pg11 are the
> same as in dictionary format, but pg_restore is able to read it correctly.
>
> Probably it is not a critical bug, but it is very confusing for users, and
> when it is working in tar format, then probably it should work in
> dictionary format too.
>
> Regards
>
> Pavel
>
>
The problem is related to the commit a45c78e

I am not sure if this is correct fix, but it fixed this issue

diff --git a/src/bin/pg_dump/pg_backup_directory.c
b/src/bin/pg_dump/pg_backup_directory.c
index 21b00792a8a..16da4decbd0 100644
--- a/src/bin/pg_dump/pg_backup_directory.c
+++ b/src/bin/pg_dump/pg_backup_directory.c
@@ -415,7 +415,15 @@ _LoadLOs(ArchiveHandle *AH, TocEntry *te)
     * now there can be multiple.  We don't need to worry what version we
are
     * reading though, because tctx->filename should be correct either way.
     */
-   setFilePath(AH, tocfname, tctx->filename);
+
+   /*
+    * probably there is a bug in older releases (tested in Postgres 11).
+    * The filename is not correct - instead "blobs.toc" it is NNNN.dat.
+    */
+   if (AH->version < K_VERS_1_16)
+       setFilePath(AH, tocfname, "blobs.toc");
+   else
+       setFilePath(AH, tocfname, tctx->filename);

    CFH = ctx->LOsTocFH = InitDiscoverCompressFileHandle(tocfname,
PG_BINARY_R);

Regards

Pavel

Reply via email to