diff --git a/doc/src/sgml/monitoring.sgml b/doc/src/sgml/monitoring.sgml
index 987580d6df..2c9f51daf4 100644
--- a/doc/src/sgml/monitoring.sgml
+++ b/doc/src/sgml/monitoring.sgml
@@ -4388,10 +4388,7 @@ SELECT pg_stat_get_backend_pid(s.backendid) AS pid,
backup_totalbigint
- Total amount of data that will be streamed. If progress reporting
- is not enabled in pg_basebackup
- (i.e., --progress option is not specified),
- this is 0. Otherwise, this is estimated and
+ Total amount of data that will be streamed. This is estimated and
reported as of the beginning of
streaming database files phase. Note that
this is only an approximation since the database
@@ -4399,7 +4396,10 @@ SELECT pg_stat_get_backend_pid(s.backendid) AS pid,
and WAL log may be included in the backup later. This is always
the same value as backup_streamed
once the amount of data streamed exceeds the estimated
- total size.
+ total size. If the estimation is disabled in
+ pg_basebackup
+ (i.e., --no-estimate-size option is specified),
+ this is 0.
diff --git a/doc/src/sgml/ref/pg_basebackup.sgml b/doc/src/sgml/ref/pg_basebackup.sgml
index 29bf2f9b97..f3d05b4659 100644
--- a/doc/src/sgml/ref/pg_basebackup.sgml
+++ b/doc/src/sgml/ref/pg_basebackup.sgml
@@ -460,20 +460,14 @@ PostgreSQL documentation
in this case the estimated target size will increase once it passes the
total estimate without WAL.
-
- When this is enabled, the backup will start by enumerating the size of
- the entire database, and then go back and send the actual contents.
- This may make the backup take slightly longer, and in particular it
- will take longer before the first data is sent.
-
Whether this is enabled or not, the
pg_stat_progress_basebackup view
- report the progress of the backup in the server side. But note
- that the total amount of data that will be streamed is estimated
- and reported only when this option is enabled. In other words,
- backup_total column in the view always
- indicates 0 if this option is disabled.
+ report the progress of the backup in the server side.
+
+
+ This option is not allowed when using
+ .
@@ -552,6 +546,30 @@ PostgreSQL documentation
+
+
+
+
+
+ This option prevents the server from estimating the total
+ amount of backup data that will be streamed. In other words,
+ backup_total column in the
+ pg_stat_progress_basebackup
+ view indicates 0 if this option is enabled.
+
+
+ When this is disabled, the backup will start by enumerating
+ the size of the entire database, and then go back and send
+ the actual contents. This may make the backup take slightly
+ longer, and in particular it will take longer before the first
+ data is sent. This option is useful to avoid such estimation
+ time if it's too long.
+
+
+ This option is not allowed when using .
+
+
+
@@ -767,6 +785,13 @@ PostgreSQL documentation
permissions are enabled on the source cluster.
+
+ pg_basebackup asks the server to estimate
+ the total amount of data that will be streamed by default (unless
+ is specified) in version 13 or later,
+ and does that only when is specified in
+ the older versions.
+
diff --git a/src/bin/pg_basebackup/pg_basebackup.c b/src/bin/pg_basebackup/pg_basebackup.c
index 48bd838803..1032b474b4 100644
--- a/src/bin/pg_basebackup/pg_basebackup.c
+++ b/src/bin/pg_basebackup/pg_basebackup.c
@@ -102,6 +102,11 @@ typedef void (*WriteDataCallback) (size_t nbytes, char *buf,
*/
#define MINIMUM_VERSION_FOR_TEMP_SLOTS 100000
+/*
+ * --no-estimate-size option is supported from version 13.
+ */
+#define MINIMUM_VERSION_FOR_ESTIMATE_SIZE 130000
+
/*
* Different ways to include WAL
*/
@@ -121,6 +126,7 @@ static char *label = "pg_basebackup base backup";
static bool noclean = false;
static bool checksum_failure = false;
static bool showprogress = false;
+static bool estimatesize = true;
static int verbose = 0;
static int compresslevel = 0;
static IncludeWal includewal = STREAM_WAL;
@@ -386,6 +392,7 @@ usage(void)
printf(_(" --no-slot prevent creation of temporary replication slot\n"));
printf(_(" --no-verify-checksums\n"
" do not verify checksums\n"));
+ printf(_(" --no-estimate-size do not estimate backup size in server side\n"));
printf(_(" -?, --help show this help, then exit\n"));
printf(_("\nConnection options:\n"));
printf(_(" -d, --dbname=CONNSTR connection string\n"));
@@ -1738,10 +1745,17 @@ BaseBackup(void)
fprintf(stderr, "\n");
}
+ /*
+ * In 12 or before, PROGRESS is specified in BASE_BACKUP command to
+ * estimate the backup size only when --progress option is specified.
+ */
+ if (PQserverVersion(conn) < MINIMUM_VERSION_FOR_ESTIMATE_SIZE)
+ estimatesize = showprogress;
+
basebkp =
psprintf("BASE_BACKUP LABEL '%s' %s %s %s %s %s %s %s",
escaped_label,
- showprogress ? "PROGRESS" : "",
+ estimatesize ? "PROGRESS" : "",
includewal == FETCH_WAL ? "WAL" : "",
fastcheckpoint ? "FAST" : "",
includewal == NO_WAL ? "" : "NOWAIT",
@@ -2066,6 +2080,7 @@ main(int argc, char **argv)
{"waldir", required_argument, NULL, 1},
{"no-slot", no_argument, NULL, 2},
{"no-verify-checksums", no_argument, NULL, 3},
+ {"no-estimate-size", no_argument, NULL, 4},
{NULL, 0, NULL, 0}
};
int c;
@@ -2234,6 +2249,9 @@ main(int argc, char **argv)
case 3:
verify_checksums = false;
break;
+ case 4:
+ estimatesize = false;
+ break;
default:
/*
@@ -2356,6 +2374,14 @@ main(int argc, char **argv)
}
#endif
+ if (showprogress && !estimatesize)
+ {
+ pg_log_error("--progress and --no-estimate-size are incompatible options");
+ fprintf(stderr, _("Try \"%s --help\" for more information.\n"),
+ progname);
+ exit(1);
+ }
+
/* connection in replication mode to server */
conn = GetConnection();
if (!conn)