Remove pg_upgrade support for upgrading from pre-9.2 servers.
authorTom Lane <tgl@sss.pgh.pa.us>
Wed, 15 Dec 2021 00:17:55 +0000 (19:17 -0500)
committerTom Lane <tgl@sss.pgh.pa.us>
Wed, 15 Dec 2021 00:17:55 +0000 (19:17 -0500)
Per discussion, we'll limit support for old servers to those branches
that can still be built easily on modern platforms, which as of now
is 9.2 and up.

Discussion: https://postgr.es/m/2923349.1634942313@sss.pgh.pa.us

doc/src/sgml/ref/pgupgrade.sgml
src/bin/pg_upgrade/check.c
src/bin/pg_upgrade/info.c
src/bin/pg_upgrade/pg_upgrade.h
src/bin/pg_upgrade/relfilenode.c
src/bin/pg_upgrade/server.c
src/bin/pg_upgrade/tablespace.c
src/bin/pg_upgrade/test.sh
src/bin/pg_upgrade/version.c

index 20efdd771f513ed249748663c9e67814af95f8c5..1289123129d6d89ed7cbfc5f86ded11640057d95 100644 (file)
@@ -68,7 +68,7 @@ PostgreSQL documentation
  </para>
 
   <para>
-   pg_upgrade supports upgrades from 8.4.X and later to the current
+   pg_upgrade supports upgrades from 9.2.X and later to the current
    major release of <productname>PostgreSQL</productname>, including snapshot and beta releases.
   </para>
  </refsect1>
@@ -800,21 +800,6 @@ psql --username=postgres --file=script.sql postgres
    (<type>regclass</type>, <type>regrole</type>, and <type>regtype</type> can be upgraded.)
   </para>
 
-  <para>
-   If you are upgrading a pre-<productname>PostgreSQL</productname> 9.2 cluster
-   that uses a configuration-file-only directory, you must pass the
-   real data directory location to <application>pg_upgrade</application>, and
-   pass the configuration directory location to the server, e.g.,
-   <literal>-d /real-data-directory -o '-D /configuration-directory'</literal>.
-  </para>
-
-  <para>
-   If using a pre-9.1 old server that is using a non-default Unix-domain
-   socket directory or a default that differs from the default of the
-   new cluster, set <envar>PGHOST</envar> to point to the old server's socket
-   location.  (This is not relevant on Windows.)
-  </para>
-
   <para>
    If you want to use link mode and you do not want your old cluster
    to be modified when the new cluster is started, consider using the clone mode.
index ad5f391995630e7194daa648c229f2cdbf61aa2a..bc5fbd93c6c6f7111732ed9109430b15a22d0538 100644 (file)
@@ -159,10 +159,6 @@ check_and_dump_old_cluster(bool live_check)
    if (GET_MAJOR_VERSION(old_cluster.major_version) <= 903)
        old_9_3_check_for_line_data_type_usage(&old_cluster);
 
-   /* Pre-PG 9.0 had no large object permissions */
-   if (GET_MAJOR_VERSION(old_cluster.major_version) <= 804)
-       new_9_0_populate_pg_largeobject_metadata(&old_cluster, true);
-
    /*
     * While not a check option, we do this now because this is the only time
     * the old server is running.
@@ -233,10 +229,6 @@ issue_warnings_and_set_wal_level(void)
     */
    start_postmaster(&new_cluster, true);
 
-   /* Create dummy large object permissions for old < PG 9.0? */
-   if (GET_MAJOR_VERSION(old_cluster.major_version) <= 804)
-       new_9_0_populate_pg_largeobject_metadata(&new_cluster, false);
-
    /* Reindex hash indexes for old < 10.0 */
    if (GET_MAJOR_VERSION(old_cluster.major_version) <= 906)
        old_9_6_invalidate_hash_indexes(&new_cluster, false);
@@ -295,8 +287,8 @@ check_cluster_versions(void)
     * upgrades
     */
 
-   if (GET_MAJOR_VERSION(old_cluster.major_version) < 804)
-       pg_fatal("This utility can only upgrade from PostgreSQL version 8.4 and later.\n");
+   if (GET_MAJOR_VERSION(old_cluster.major_version) < 902)
+       pg_fatal("This utility can only upgrade from PostgreSQL version 9.2 and later.\n");
 
    /* Only current PG version is supported as a target */
    if (GET_MAJOR_VERSION(new_cluster.major_version) != GET_MAJOR_VERSION(PG_VERSION_NUM))
@@ -331,12 +323,6 @@ check_cluster_compatibility(bool live_check)
    get_control_data(&new_cluster, false);
    check_control_data(&old_cluster.controldata, &new_cluster.controldata);
 
-   /* We read the real port number for PG >= 9.1 */
-   if (live_check && GET_MAJOR_VERSION(old_cluster.major_version) <= 900 &&
-       old_cluster.port == DEF_PGUPORT)
-       pg_fatal("When checking a pre-PG 9.1 live old server, "
-                "you must specify the old server's port number.\n");
-
    if (live_check && old_cluster.port == new_cluster.port)
        pg_fatal("When checking a live server, "
                 "the old and new port numbers must be different.\n");
@@ -479,11 +465,6 @@ check_databases_are_compatible(void)
  * they do, it would cause an error while restoring global objects.
  * This allows the failure to be detected at check time, rather than
  * during schema restore.
- *
- * Note, v8.4 has no tablespace_suffix, which is fine so long as the
- * version being upgraded *to* has a suffix, since it's not allowed
- * to pg_upgrade from a version to the same version if tablespaces are
- * in use.
  */
 static void
 check_for_new_tablespace_dir(ClusterInfo *new_cluster)
@@ -597,11 +578,6 @@ create_script_for_old_cluster_deletion(char **deletion_script_file_name)
            int         dbnum;
 
            fprintf(script, "\n");
-           /* remove PG_VERSION? */
-           if (GET_MAJOR_VERSION(old_cluster.major_version) <= 804)
-               fprintf(script, RM_CMD " %s%cPG_VERSION\n",
-                       fix_path_separator(os_info.old_tablespaces[tblnum]),
-                       PATH_SEPARATOR);
 
            for (dbnum = 0; dbnum < old_cluster.dbarr.ndbs; dbnum++)
                fprintf(script, RMDIR_CMD " %c%s%c%u%c\n", PATH_QUOTE,
index 5d9a26cf8229048a77af685c82fd8a4c07148c85..1dbc09e64229b46e9639e57faddb0c902ca0e07d 100644 (file)
@@ -118,15 +118,9 @@ gen_db_file_maps(DbInfo *old_db, DbInfo *new_db,
         * Verify that rels of same OID have same name.  The namespace name
         * should always match, but the relname might not match for TOAST
         * tables (and, therefore, their indexes).
-        *
-        * TOAST table names initially match the heap pg_class oid, but
-        * pre-9.0 they can change during certain commands such as CLUSTER, so
-        * don't insist on a match if old cluster is < 9.0.
         */
        if (strcmp(old_rel->nspname, new_rel->nspname) != 0 ||
-           (strcmp(old_rel->relname, new_rel->relname) != 0 &&
-            (GET_MAJOR_VERSION(old_cluster.major_version) >= 900 ||
-             strcmp(old_rel->nspname, "pg_toast") != 0)))
+           strcmp(old_rel->relname, new_rel->relname) != 0)
        {
            pg_log(PG_WARNING, "Relation names for OID %u in database \"%s\" do not match: "
                   "old name \"%s.%s\", new name \"%s.%s\"\n",
@@ -352,16 +346,13 @@ get_db_infos(ClusterInfo *cluster)
 
    snprintf(query, sizeof(query),
             "SELECT d.oid, d.datname, d.encoding, d.datcollate, d.datctype, "
-            "%s AS spclocation "
+            "pg_catalog.pg_tablespace_location(t.oid) AS spclocation "
             "FROM pg_catalog.pg_database d "
             " LEFT OUTER JOIN pg_catalog.pg_tablespace t "
             " ON d.dattablespace = t.oid "
             "WHERE d.datallowconn = true "
    /* we don't preserve pg_database.oid so we sort by name */
-            "ORDER BY 2",
-   /* 9.2 removed the spclocation column */
-            (GET_MAJOR_VERSION(cluster->major_version) <= 901) ?
-            "t.spclocation" : "pg_catalog.pg_tablespace_location(t.oid)");
+            "ORDER BY 2");
 
    res = executeQueryOrDie(conn, "%s", query);
 
@@ -492,7 +483,8 @@ get_rel_infos(ClusterInfo *cluster, DbInfo *dbinfo)
     */
    snprintf(query + strlen(query), sizeof(query) - strlen(query),
             "SELECT all_rels.*, n.nspname, c.relname, "
-            "  c.relfilenode, c.reltablespace, %s "
+            "  c.relfilenode, c.reltablespace, "
+            "  pg_catalog.pg_tablespace_location(t.oid) AS spclocation "
             "FROM (SELECT * FROM regular_heap "
             "      UNION ALL "
             "      SELECT * FROM toast_heap "
@@ -504,11 +496,7 @@ get_rel_infos(ClusterInfo *cluster, DbInfo *dbinfo)
             "     ON c.relnamespace = n.oid "
             "  LEFT OUTER JOIN pg_catalog.pg_tablespace t "
             "     ON c.reltablespace = t.oid "
-            "ORDER BY 1;",
-   /* 9.2 removed the pg_tablespace.spclocation column */
-            (GET_MAJOR_VERSION(cluster->major_version) >= 902) ?
-            "pg_catalog.pg_tablespace_location(t.oid) AS spclocation" :
-            "t.spclocation");
+            "ORDER BY 1;");
 
    res = executeQueryOrDie(conn, "%s", query);
 
index ca0795f68ff01579a1132dffbeeea30b6e0b4c61..235a7700262d3a50476199d1ba6c1cf82c21b758 100644 (file)
@@ -89,19 +89,7 @@ extern char *output_files[];
 
 
 /*
- * postmaster/postgres -b (binary_upgrade) flag added during PG 9.1
- * development
- */
-#define BINARY_UPGRADE_SERVER_FLAG_CAT_VER 201104251
-
-/*
- * Visibility map changed with this 9.2 commit,
- * 8f9fe6edce358f7904e0db119416b4d1080a83aa; pick later catalog version.
- */
-#define VISIBILITY_MAP_CRASHSAFE_CAT_VER 201107031
-
-/*
- * The format of visibility map is changed with this 9.6 commit,
+ * The format of visibility map was changed with this 9.6 commit.
  */
 #define VISIBILITY_MAP_FROZEN_BIT_CAT_VER 201603011
 
@@ -447,8 +435,6 @@ bool        check_for_data_types_usage(ClusterInfo *cluster,
 bool       check_for_data_type_usage(ClusterInfo *cluster,
                                      const char *type_name,
                                      const char *output_path);
-void       new_9_0_populate_pg_largeobject_metadata(ClusterInfo *cluster,
-                                                    bool check_mode);
 void       old_9_3_check_for_line_data_type_usage(ClusterInfo *cluster);
 void       old_9_6_check_for_unknown_data_type_usage(ClusterInfo *cluster);
 void       old_9_6_invalidate_hash_indexes(ClusterInfo *cluster,
index 4deae7d9858bacee8579e2cb99033a364447e4cf..5dbefbceaf5d8aafd239c5e69a402838d6cf6128 100644 (file)
@@ -137,17 +137,8 @@ static void
 transfer_single_new_db(FileNameMap *maps, int size, char *old_tablespace)
 {
    int         mapnum;
-   bool        vm_crashsafe_match = true;
    bool        vm_must_add_frozenbit = false;
 
-   /*
-    * Do the old and new cluster disagree on the crash-safetiness of the vm
-    * files?  If so, do not copy them.
-    */
-   if (old_cluster.controldata.cat_ver < VISIBILITY_MAP_CRASHSAFE_CAT_VER &&
-       new_cluster.controldata.cat_ver >= VISIBILITY_MAP_CRASHSAFE_CAT_VER)
-       vm_crashsafe_match = false;
-
    /*
     * Do we need to rewrite visibilitymap?
     */
@@ -167,8 +158,7 @@ transfer_single_new_db(FileNameMap *maps, int size, char *old_tablespace)
             * Copy/link any fsm and vm files, if they exist
             */
            transfer_relfile(&maps[mapnum], "_fsm", vm_must_add_frozenbit);
-           if (vm_crashsafe_match)
-               transfer_relfile(&maps[mapnum], "_vm", vm_must_add_frozenbit);
+           transfer_relfile(&maps[mapnum], "_vm", vm_must_add_frozenbit);
        }
    }
 }
index 7fed0ae1086dc30edabae41d8372f90a1edbcd44..442a345173c5f050acefc03b37d07d56a6c1d368 100644 (file)
@@ -227,14 +227,7 @@ start_postmaster(ClusterInfo *cluster, bool report_and_exit_on_error)
 #endif
 
    /*
-    * Since PG 9.1, we have used -b to disable autovacuum.  For earlier
-    * releases, setting autovacuum=off disables cleanup vacuum and analyze,
-    * but freeze vacuums can still happen, so we set
-    * autovacuum_freeze_max_age to its maximum.
-    * (autovacuum_multixact_freeze_max_age was introduced after 9.1, so there
-    * is no need to set that.)  We assume all datfrozenxid and relfrozenxid
-    * values are less than a gap of 2000000000 from the current xid counter,
-    * so autovacuum will not touch them.
+    * Use -b to disable autovacuum.
     *
     * Turn off durability requirements to improve object creation speed, and
     * we only modify the new cluster, so only use it there.  If there is a
@@ -245,11 +238,8 @@ start_postmaster(ClusterInfo *cluster, bool report_and_exit_on_error)
     * vacuumdb --freeze actually freezes the tuples.
     */
    snprintf(cmd, sizeof(cmd),
-            "\"%s/pg_ctl\" -w -l \"%s\" -D \"%s\" -o \"-p %d%s%s %s%s\" start",
+            "\"%s/pg_ctl\" -w -l \"%s\" -D \"%s\" -o \"-p %d -b%s %s%s\" start",
             cluster->bindir, SERVER_LOG_FILE, cluster->pgconfig, cluster->port,
-            (cluster->controldata.cat_ver >=
-             BINARY_UPGRADE_SERVER_FLAG_CAT_VER) ? " -b" :
-            " -c autovacuum=off -c autovacuum_freeze_max_age=2000000000",
             (cluster == &new_cluster) ?
             " -c synchronous_commit=off -c fsync=off -c full_page_writes=off -c vacuum_defer_cleanup_age=0" : "",
             cluster->pgopts ? cluster->pgopts : "", socket_string);
index bd49d300db1110cd757f111fb63e7df43f733687..4b8bc805837c48c5a8a957ce46db273be3dc4c70 100644 (file)
@@ -46,13 +46,10 @@ get_tablespace_paths(void)
    char        query[QUERY_ALLOC];
 
    snprintf(query, sizeof(query),
-            "SELECT    %s "
+            "SELECT pg_catalog.pg_tablespace_location(oid) AS spclocation "
             "FROM  pg_catalog.pg_tablespace "
             "WHERE spcname != 'pg_default' AND "
-            "      spcname != 'pg_global'",
-   /* 9.2 removed the spclocation column */
-            (GET_MAJOR_VERSION(old_cluster.major_version) <= 901) ?
-            "spclocation" : "pg_catalog.pg_tablespace_location(oid) AS spclocation");
+            "      spcname != 'pg_global'");
 
    res = executeQueryOrDie(conn, "%s", query);
 
@@ -105,15 +102,10 @@ get_tablespace_paths(void)
 static void
 set_tablespace_directory_suffix(ClusterInfo *cluster)
 {
-   if (GET_MAJOR_VERSION(cluster->major_version) <= 804)
-       cluster->tablespace_suffix = pg_strdup("");
-   else
-   {
-       /* This cluster has a version-specific subdirectory */
+   /* This cluster has a version-specific subdirectory */
 
-       /* The leading slash is needed to start a new directory. */
-       cluster->tablespace_suffix = psprintf("/PG_%s_%d",
-                                             cluster->major_version_str,
-                                             cluster->controldata.cat_ver);
-   }
+   /* The leading slash is needed to start a new directory. */
+   cluster->tablespace_suffix = psprintf("/PG_%s_%d",
+                                         cluster->major_version_str,
+                                         cluster->controldata.cat_ver);
 }
index f353e565b516992e11d4983fea3d4a1a6d9b3fde..32d186d8974ce4ac4f9d0d72da23a40af184cb84 100644 (file)
@@ -202,9 +202,6 @@ if "$MAKE" -C "$oldsrc" installcheck-parallel; then
        # update references to old source tree's regress.so etc
        fix_sql=""
        case $oldpgversion in
-           804??)
-               fix_sql="UPDATE pg_proc SET probin = replace(probin::text, '$oldsrc', '$newsrc')::bytea WHERE probin LIKE '$oldsrc%';"
-               ;;
            *)
                fix_sql="UPDATE pg_proc SET probin = replace(probin, '$oldsrc', '$newsrc') WHERE probin LIKE '$oldsrc%';"
                ;;
index ccb012657be7cba83bc39e656f9f748d8be1bac5..0c00bc542c6bff6c9497dffdabc787d863b8cdef 100644 (file)
 #include "fe_utils/string_utils.h"
 #include "pg_upgrade.h"
 
-/*
- * new_9_0_populate_pg_largeobject_metadata()
- * new >= 9.0, old <= 8.4
- * 9.0 has a new pg_largeobject permission table
- */
-void
-new_9_0_populate_pg_largeobject_metadata(ClusterInfo *cluster, bool check_mode)
-{
-   int         dbnum;
-   FILE       *script = NULL;
-   bool        found = false;
-   char        output_path[MAXPGPATH];
-
-   prep_status("Checking for large objects");
-
-   snprintf(output_path, sizeof(output_path), "pg_largeobject.sql");
-
-   for (dbnum = 0; dbnum < cluster->dbarr.ndbs; dbnum++)
-   {
-       PGresult   *res;
-       int         i_count;
-       DbInfo     *active_db = &cluster->dbarr.dbs[dbnum];
-       PGconn     *conn = connectToServer(cluster, active_db->db_name);
-
-       /* find if there are any large objects */
-       res = executeQueryOrDie(conn,
-                               "SELECT count(*) "
-                               "FROM   pg_catalog.pg_largeobject ");
-
-       i_count = PQfnumber(res, "count");
-       if (atoi(PQgetvalue(res, 0, i_count)) != 0)
-       {
-           found = true;
-           if (!check_mode)
-           {
-               PQExpBufferData connectbuf;
-
-               if (script == NULL && (script = fopen_priv(output_path, "w")) == NULL)
-                   pg_fatal("could not open file \"%s\": %s\n", output_path,
-                            strerror(errno));
-
-               initPQExpBuffer(&connectbuf);
-               appendPsqlMetaConnect(&connectbuf, active_db->db_name);
-               fputs(connectbuf.data, script);
-               termPQExpBuffer(&connectbuf);
-
-               fprintf(script,
-                       "SELECT pg_catalog.lo_create(t.loid)\n"
-                       "FROM (SELECT DISTINCT loid FROM pg_catalog.pg_largeobject) AS t;\n");
-           }
-       }
-
-       PQclear(res);
-       PQfinish(conn);
-   }
-
-   if (script)
-       fclose(script);
-
-   if (found)
-   {
-       report_status(PG_WARNING, "warning");
-       if (check_mode)
-           pg_log(PG_WARNING, "\n"
-                  "Your installation contains large objects.  The new database has an\n"
-                  "additional large object permission table.  After upgrading, you will be\n"
-                  "given a command to populate the pg_largeobject_metadata table with\n"
-                  "default permissions.\n\n");
-       else
-           pg_log(PG_WARNING, "\n"
-                  "Your installation contains large objects.  The new database has an\n"
-                  "additional large object permission table, so default permissions must be\n"
-                  "defined for all large objects.  The file\n"
-                  "    %s\n"
-                  "when executed by psql by the database superuser will set the default\n"
-                  "permissions.\n\n",
-                  output_path);
-   }
-   else
-       check_ok();
-}
-
 
 /*
  * check_for_data_types_usage()
@@ -158,38 +76,32 @@ check_for_data_types_usage(ClusterInfo *cluster,
                          "               t.oid = c.reltype AND "
                          "               c.oid = a.attrelid AND "
                          "               NOT a.attisdropped AND "
-                         "               a.atttypid = x.oid ",
-                         base_query);
-
-       /* Ranges were introduced in 9.2 */
-       if (GET_MAJOR_VERSION(cluster->major_version) >= 902)
-           appendPQExpBufferStr(&querybuf,
-                                "          UNION ALL "
-           /* ranges containing any type selected so far */
-                                "          SELECT t.oid FROM pg_catalog.pg_type t, pg_catalog.pg_range r, x "
-                                "          WHERE t.typtype = 'r' AND r.rngtypid = t.oid AND r.rngsubtype = x.oid");
-
-       appendPQExpBufferStr(&querybuf,
-                            "  ) foo "
-                            ") "
+                         "               a.atttypid = x.oid "
+                         "         UNION ALL "
+       /* ranges containing any type selected so far */
+                         "         SELECT t.oid FROM pg_catalog.pg_type t, pg_catalog.pg_range r, x "
+                         "         WHERE t.typtype = 'r' AND r.rngtypid = t.oid AND r.rngsubtype = x.oid"
+                         " ) foo "
+                         ") "
        /* now look for stored columns of any such type */
-                            "SELECT n.nspname, c.relname, a.attname "
-                            "FROM  pg_catalog.pg_class c, "
-                            "      pg_catalog.pg_namespace n, "
-                            "      pg_catalog.pg_attribute a "
-                            "WHERE c.oid = a.attrelid AND "
-                            "      NOT a.attisdropped AND "
-                            "      a.atttypid IN (SELECT oid FROM oids) AND "
-                            "      c.relkind IN ("
-                            CppAsString2(RELKIND_RELATION) ", "
-                            CppAsString2(RELKIND_MATVIEW) ", "
-                            CppAsString2(RELKIND_INDEX) ") AND "
-                            "      c.relnamespace = n.oid AND "
+                         "SELECT n.nspname, c.relname, a.attname "
+                         "FROM pg_catalog.pg_class c, "
+                         "     pg_catalog.pg_namespace n, "
+                         "     pg_catalog.pg_attribute a "
+                         "WHERE    c.oid = a.attrelid AND "
+                         "     NOT a.attisdropped AND "
+                         "     a.atttypid IN (SELECT oid FROM oids) AND "
+                         "     c.relkind IN ("
+                         CppAsString2(RELKIND_RELATION) ", "
+                         CppAsString2(RELKIND_MATVIEW) ", "
+                         CppAsString2(RELKIND_INDEX) ") AND "
+                         "     c.relnamespace = n.oid AND "
        /* exclude possible orphaned temp tables */
-                            "      n.nspname !~ '^pg_temp_' AND "
-                            "      n.nspname !~ '^pg_toast_temp_' AND "
+                         "     n.nspname !~ '^pg_temp_' AND "
+                         "     n.nspname !~ '^pg_toast_temp_' AND "
        /* exclude system catalogs, too */
-                            "      n.nspname NOT IN ('pg_catalog', 'information_schema')");
+                         "     n.nspname NOT IN ('pg_catalog', 'information_schema')",
+                         base_query);
 
        res = executeQueryOrDie(conn, "%s", querybuf.data);