Make pg_basebackup ask the server to estimate the total backup size, by default.
authorFujii Masao
Thu, 19 Mar 2020 08:09:00 +0000 (17:09 +0900)
committerFujii Masao
Thu, 19 Mar 2020 08:09:00 +0000 (17:09 +0900)
This commit changes pg_basebackup so that it specifies PROGRESS option in
BASE_BACKUP replication command whether --progress is specified or not.
This causes the server to estimate the total backup size and report it in
pg_stat_progress_basebackup.backup_total, by default. This is reasonable
default because the time required for the estimation would not be so large
in most cases.

Also this commit adds new option --no-estimate-size to pg_basebackup.
This option prevents the server from the estimation, and so is useful to
avoid such estimation time if it's too long.

Author: Fujii Masao
Reviewed-by: Magnus Hagander, Amit Langote
Discussion: https://postgr.es/m/CABUevEyDPPSjP7KRvfTXPdqOdY5aWNkqsB5aAXs3bco5ZwtGHg@mail.gmail.com

doc/src/sgml/monitoring.sgml
doc/src/sgml/ref/pg_basebackup.sgml
src/bin/pg_basebackup/pg_basebackup.c

index 89853a16d8264b7e437895ad87b01fb19ff3e9fc..5bffdcce10de269a0372d9ff127b6348ebe96377 100644 (file)
@@ -4392,10 +4392,7 @@ SELECT pg_stat_get_backend_pid(s.backendid) AS pid,
      backup_total
      bigint
      
-      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
@@ -4403,7 +4400,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.
      
     
     
index 29bf2f9b9795257be475233d3ad2ee8bb50cff7a..90638aad0e20f6fa6455c2aeedf7782863a0801f 100644 (file)
@@ -460,21 +460,6 @@ 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.
-       
       
      
 
@@ -552,6 +537,30 @@ PostgreSQL documentation
        
       
      
+
+     
+      
+      
+       
+        This option prevents the server from estimating the total
+        amount of backup data that will be streamed, resulting in the
+        backup_total column in the
+        pg_stat_progress_basebackup
+        to be 0.
+       
+       
+        Without this option, 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 .
+       
+      
+     
     
    
 
index 48bd838803ba165e94fbc4ef4e25602241519127..c5d95958b29158666912e88d9984ff7d08db82a1 100644 (file)
@@ -121,6 +121,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 +387,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"));
@@ -1741,7 +1743,7 @@ BaseBackup(void)
    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 +2068,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 +2237,9 @@ main(int argc, char **argv)
            case 3:
                verify_checksums = false;
                break;
+           case 4:
+               estimatesize = false;
+               break;
            default:
 
                /*
@@ -2356,6 +2362,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)