From a46d28371f62b51712f24f687dedfa1cfdcca342 Mon Sep 17 00:00:00 2001 From: jian he Date: Tue, 4 Feb 2025 15:24:59 +0800 Subject: [PATCH v15 1/1] make pg_restore --file option using \connect for retsoring multiple databases. This patch solves problems mentioned in [1]. so pg_restore --file output is sane. we print out the database name we are restoring through ```ahprintf(AH, "--\n-- Database \"%s\" dump\n--\n\n", dbname);```. So the pg_restore --file output comments make it easy to distinguish which database contents we are dumping. overall it will be like: --------------------------------------------------------------- -- -- Database "template1" dump -- -- Dumped from database version 18devel_debug_build_622f678c10 -- Dumped by pg_dump version 18devel_debug_build_622f678c10 -- Started on 2025-02-04 14:34:44 CST \connect template1 ..... -- Completed on 2025-02-04 14:34:53 CST -- -- Database "template1" dump complete -- --------------------------------------------------------------- [1] https://postgr.es/m/CACJufxFrzYJ0oZNm=v9hg10UpPQNe+p0+2ydNirHxyhUT_JtXw@mail.gmail.com --- src/bin/pg_dump/pg_backup.h | 2 +- src/bin/pg_dump/pg_backup_archiver.c | 21 ++++++++++++++------- src/bin/pg_dump/pg_backup_tar.c | 2 +- src/bin/pg_dump/pg_dump.c | 2 +- src/bin/pg_dump/pg_restore.c | 12 +++++++----- 5 files changed, 24 insertions(+), 15 deletions(-) diff --git a/src/bin/pg_dump/pg_backup.h b/src/bin/pg_dump/pg_backup.h index 65000e5a08..729ffc9e12 100644 --- a/src/bin/pg_dump/pg_backup.h +++ b/src/bin/pg_dump/pg_backup.h @@ -306,7 +306,7 @@ extern void SetArchiveOptions(Archive *AH, DumpOptions *dopt, RestoreOptions *ro extern void ProcessArchiveRestoreOptions(Archive *AHX); -extern void RestoreArchive(Archive *AHX, bool append_data); +extern void RestoreArchive(Archive *AHX, bool append_data, const char *dbname); /* Open an existing archive */ extern Archive *OpenArchive(const char *FileSpec, const ArchiveFormat fmt); diff --git a/src/bin/pg_dump/pg_backup_archiver.c b/src/bin/pg_dump/pg_backup_archiver.c index e91f4b836f..fd6fd16642 100644 --- a/src/bin/pg_dump/pg_backup_archiver.c +++ b/src/bin/pg_dump/pg_backup_archiver.c @@ -336,9 +336,11 @@ ProcessArchiveRestoreOptions(Archive *AHX) * * If append_data is set, then append data into file as we are restoring dump * of multiple databases which was taken by pg_dumpall. + * If dbname is not NULL, then pg_restore restore archive to file will have + * comments about which database currently is being dumped. */ void -RestoreArchive(Archive *AHX, bool append_data) +RestoreArchive(Archive *AHX, bool append_data, const char *dbname) { ArchiveHandle *AH = (ArchiveHandle *) AHX; RestoreOptions *ropt = AH->public.ropt; @@ -457,7 +459,10 @@ RestoreArchive(Archive *AHX, bool append_data) if (ropt->filename || ropt->compression_spec.algorithm != PG_COMPRESSION_NONE) SetOutput(AH, ropt->filename, ropt->compression_spec, append_data); - ahprintf(AH, "--\n-- PostgreSQL database dump\n--\n\n"); + if (append_data && dbname != NULL) + ahprintf(AH, "--\n-- Database \"%s\" dump\n--\n\n", dbname); + else + ahprintf(AH, "--\n-- PostgreSQL database dump\n--\n\n"); if (AH->archiveRemoteVersion) ahprintf(AH, "-- Dumped from database version %s\n", @@ -797,8 +802,10 @@ RestoreArchive(Archive *AHX, bool append_data) if (AH->public.verbose) dumpTimestamp(AH, "Completed on", time(NULL)); - ahprintf(AH, "--\n-- PostgreSQL database dump complete\n--\n\n"); - + if (append_data && dbname != NULL) + ahprintf(AH, "--\n-- Database \"%s\" dump complete\n--\n\n", dbname); + else + ahprintf(AH, "--\n-- PostgreSQL database dump\n--\n\n"); /* * Clean up & we're done. */ @@ -2926,13 +2933,13 @@ _tocEntryRequired(TocEntry *te, teSection curSection, ArchiveHandle *AH) /* * DATABASE and DATABASE PROPERTIES also have a special rule: they are - * restored in createDB mode, and not restored otherwise, independently of - * all else. + * restored in createDB mode or restored format is not plain file, and not + * restored otherwise, independently of all else. */ if (strcmp(te->desc, "DATABASE") == 0 || strcmp(te->desc, "DATABASE PROPERTIES") == 0) { - if (ropt->createDB) + if (ropt->createDB || AH->format != archNull) return REQ_SCHEMA; else return 0; diff --git a/src/bin/pg_dump/pg_backup_tar.c b/src/bin/pg_dump/pg_backup_tar.c index d94d0de2a5..45f0fb46e0 100644 --- a/src/bin/pg_dump/pg_backup_tar.c +++ b/src/bin/pg_dump/pg_backup_tar.c @@ -826,7 +826,7 @@ _CloseArchive(ArchiveHandle *AH) savVerbose = AH->public.verbose; AH->public.verbose = 0; - RestoreArchive((Archive *) AH, false); + RestoreArchive((Archive *) AH, false, NULL); SetArchiveOptions((Archive *) AH, savDopt, savRopt); diff --git a/src/bin/pg_dump/pg_dump.c b/src/bin/pg_dump/pg_dump.c index 61067e1542..51c595a7a5 100644 --- a/src/bin/pg_dump/pg_dump.c +++ b/src/bin/pg_dump/pg_dump.c @@ -1148,7 +1148,7 @@ main(int argc, char **argv) * right now. */ if (plainText) - RestoreArchive(fout, false); + RestoreArchive(fout, false, NULL); CloseArchive(fout); diff --git a/src/bin/pg_dump/pg_restore.c b/src/bin/pg_dump/pg_restore.c index 444415d2ee..b216873773 100644 --- a/src/bin/pg_dump/pg_restore.c +++ b/src/bin/pg_dump/pg_restore.c @@ -75,7 +75,8 @@ static void usage(const char *progname); static void read_restore_filters(const char *filename, RestoreOptions *opts); static bool IsFileExistsInDirectory(const char *dir, const char *filename); static int restoreOneDatabase(const char *inputFileSpec, RestoreOptions *opts, - int numWorkers, bool append_data); + int numWorkers, bool append_data, + const char *dbname); static int ReadOneStatement(StringInfo inBuf, FILE *pfile); static int restoreAllDatabases(PGconn *conn, const char *dumpdirpath, SimpleStringList db_exclude_patterns, RestoreOptions *opts, int numWorkers); @@ -525,16 +526,17 @@ main(int argc, char **argv) } } - return restoreOneDatabase(inputFileSpec, opts, numWorkers, false); + return restoreOneDatabase(inputFileSpec, opts, numWorkers, false, NULL); } /* * restoreOneDatabase * * This will restore one database using toc.dat file. + * dbname is the current to be restored database name. */ static int restoreOneDatabase(const char *inputFileSpec, RestoreOptions *opts, - int numWorkers, bool append_data) + int numWorkers, bool append_data, const char *dbname) { Archive *AH; int exit_code; @@ -568,7 +570,7 @@ restoreOneDatabase(const char *inputFileSpec, RestoreOptions *opts, else { ProcessArchiveRestoreOptions(AH); - RestoreArchive(AH, append_data); + RestoreArchive(AH, append_data, dbname); } /* done, print a summary of ignored errors */ @@ -1138,7 +1140,7 @@ restoreAllDatabases(PGconn *conn, const char *dumpdirpath, pg_log_info("restoring database \"%s\"", dboid_cell->db_name); - dbexit_code = restoreOneDatabase(subdirpath, opts, numWorkers, true); + dbexit_code = restoreOneDatabase(subdirpath, opts, numWorkers, true, dboid_cell->db_name); /* Store exit_code to report it back. */ if (exit_code == 0 && dbexit_code != 0) -- 2.34.1