diff --git a/src/backend/main/main.c b/src/backend/main/main.c
index 51ffb8e773..c92d25c77b 100644
--- a/src/backend/main/main.c
+++ b/src/backend/main/main.c
@@ -49,7 +49,6 @@ static bool reached_main = false;
 static void startup_hacks(const char *progname);
 static void init_locale(const char *categoryname, int category, const char *locale);
 static void help(const char *progname);
-static void check_root(const char *progname);
 
 
 /*
@@ -58,8 +57,6 @@ static void check_root(const char *progname);
 int
 main(int argc, char *argv[])
 {
-       bool            do_check_root = true;
-
        reached_main = true;
 
        /*
@@ -153,30 +150,8 @@ main(int argc, char *argv[])
                        fputs(PG_BACKEND_VERSIONSTR, stdout);
                        exit(0);
                }
-
-               /*
-                * In addition to the above, we allow "--describe-config" and "-C var"
-                * to be called by root.  This is reasonably safe since these are
-                * read-only activities.  The -C case is important because pg_ctl may
-                * try to invoke it while still holding administrator privileges on
-                * Windows.  Note that while -C can normally be in any argv position,
-                * if you want to bypass the root check you must put it first.  This
-                * reduces the risk that we might misinterpret some other mode's -C
-                * switch as being the postmaster/postgres one.
-                */
-               if (strcmp(argv[1], "--describe-config") == 0)
-                       do_check_root = false;
-               else if (argc > 2 && strcmp(argv[1], "-C") == 0)
-                       do_check_root = false;
        }
 
-       /*
-        * Make sure we are not running as root, unless it's safe for the selected
-        * option.
-        */
-       if (do_check_root)
-               check_root(progname);
-
        /*
         * Dispatch to one of various subprograms depending on first argument.
         */
@@ -376,46 +351,6 @@ help(const char *progname)
 
 
 
-static void
-check_root(const char *progname)
-{
-#ifndef WIN32
-       if (geteuid() == 0)
-       {
-               write_stderr("\"root\" execution of the PostgreSQL server is not permitted.\n"
-                                        "The server must be started under an unprivileged user ID to prevent\n"
-                                        "possible system security compromise.  See the documentation for\n"
-                                        "more information on how to properly start the server.\n");
-               exit(1);
-       }
-
-       /*
-        * Also make sure that real and effective uids are the same. Executing as
-        * a setuid program from a root shell is a security hole, since on many
-        * platforms a nefarious subroutine could setuid back to root if real uid
-        * is root.  (Since nobody actually uses postgres as a setuid program,
-        * trying to actively fix this situation seems more trouble than it's
-        * worth; we'll just expend the effort to check for it.)
-        */
-       if (getuid() != geteuid())
-       {
-               write_stderr("%s: real and effective user IDs must match\n",
-                                        progname);
-               exit(1);
-       }
-#else                                                  /* WIN32 */
-       if (pgwin32_is_admin())
-       {
-               write_stderr("Execution of PostgreSQL by a user with administrative permissions is not\n"
-                                        "permitted.\n"
-                                        "The server must be started under an unprivileged user ID to prevent\n"
-                                        "possible system security compromises.  See the documentation for\n"
-                                        "more information on how to properly start the server.\n");
-               exit(1);
-       }
-#endif                                                 /* WIN32 */
-}
-
 /*
  * At least on linux, set_ps_display() breaks /proc/$pid/environ. The
  * sanitizer library uses /proc/$pid/environ to implement getenv() as it wants
diff --git a/src/bin/initdb/initdb.c b/src/bin/initdb/initdb.c
index ac409b0006..e2d79bc922 100644
--- a/src/bin/initdb/initdb.c
+++ b/src/bin/initdb/initdb.c
@@ -751,15 +751,6 @@ get_id(void)
 {
        const char *username;
 
-#ifndef WIN32
-       if (geteuid() == 0)                     /* 0 is root's uid */
-       {
-               pg_log_error("cannot be run as root");
-               pg_log_error_hint("Please log in (using, e.g., \"su\") as the (unprivileged) user that will own the server process.");
-               exit(1);
-       }
-#endif
-
        username = get_user_name_or_exit(progname);
 
        return pg_strdup(username);
diff --git a/src/bin/pg_ctl/pg_ctl.c b/src/bin/pg_ctl/pg_ctl.c
index 6900b27675..cdea841733 100644
--- a/src/bin/pg_ctl/pg_ctl.c
+++ b/src/bin/pg_ctl/pg_ctl.c
@@ -2240,21 +2240,6 @@ main(int argc, char **argv)
                }
        }
 
-       /*
-        * Disallow running as root, to forestall any possible security holes.
-        */
-#ifndef WIN32
-       if (geteuid() == 0)
-       {
-               write_stderr(_("%s: cannot be run as root\n"
-                                          "Please log in (using, e.g., \"su\") as the "
-                                          "(unprivileged) user that will\n"
-                                          "own the server process.\n"),
-                                        progname);
-               exit(1);
-       }
-#endif
-
        env_wait = getenv("PGCTLTIMEOUT");
        if (env_wait != NULL)
                wait_seconds = atoi(env_wait);
diff --git a/src/bin/pg_resetwal/pg_resetwal.c b/src/bin/pg_resetwal/pg_resetwal.c
index e9dcb5a6d8..1772cee522 100644
--- a/src/bin/pg_resetwal/pg_resetwal.c
+++ b/src/bin/pg_resetwal/pg_resetwal.c
@@ -328,22 +328,6 @@ main(int argc, char *argv[])
                exit(1);
        }
 
-       /*
-        * Don't allow pg_resetwal to be run as root, to avoid overwriting the
-        * ownership of files in the data directory. We need only check for root
-        * -- any other user won't have sufficient permissions to modify files in
-        * the data directory.
-        */
-#ifndef WIN32
-       if (geteuid() == 0)
-       {
-               pg_log_error("cannot be executed by \"root\"");
-               pg_log_error_hint("You must run %s as the PostgreSQL superuser.",
-                                                 progname);
-               exit(1);
-       }
-#endif
-
        get_restricted_token();
 
        /* Set mask based on PGDATA permissions */
diff --git a/src/bin/pg_rewind/pg_rewind.c b/src/bin/pg_rewind/pg_rewind.c
index 57a168fea2..aa84020e78 100644
--- a/src/bin/pg_rewind/pg_rewind.c
+++ b/src/bin/pg_rewind/pg_rewind.c
@@ -270,22 +270,6 @@ main(int argc, char **argv)
                exit(1);
        }
 
-       /*
-        * Don't allow pg_rewind to be run as root, to avoid overwriting the
-        * ownership of files in the data directory. We need only check for root
-        * -- any other user won't have sufficient permissions to modify files in
-        * the data directory.
-        */
-#ifndef WIN32
-       if (geteuid() == 0)
-       {
-               pg_log_error("cannot be executed by \"root\"");
-               pg_log_error_hint("You must run %s as the PostgreSQL superuser.",
-                                                 progname);
-               exit(1);
-       }
-#endif
-
        get_restricted_token();
 
        /* Set mask based on PGDATA permissions */
diff --git a/src/bin/pg_upgrade/option.c b/src/bin/pg_upgrade/option.c
index 2917ec2329..64f5f17339 100644
--- a/src/bin/pg_upgrade/option.c
+++ b/src/bin/pg_upgrade/option.c
@@ -76,8 +76,8 @@ parseCommandLine(int argc, char *argv[])
        old_cluster.port = getenv("PGPORTOLD") ? atoi(getenv("PGPORTOLD")) : DEF_PGUPORT;
        new_cluster.port = getenv("PGPORTNEW") ? atoi(getenv("PGPORTNEW")) : DEF_PGUPORT;
 
-       os_user_effective_id = get_user_info(&os_info.user);
-       /* we override just the database user name;  we got the OS id above */
+       get_user_info(&os_info.user);
+       /* we override just the database user name */
        if (getenv("PGUSER"))
        {
                pg_free(os_info.user);
@@ -99,10 +99,6 @@ parseCommandLine(int argc, char *argv[])
                }
        }
 
-       /* Allow help and version to be run as root, so do the test here. */
-       if (os_user_effective_id == 0)
-               pg_fatal("%s: cannot be run as root", os_info.progname);
-
        while ((option = getopt_long(argc, argv, "b:B:cd:D:j:kNo:O:p:P:rs:U:v",
                                                                 long_options, &optindex)) != -1)
        {
diff --git a/src/bin/pg_upgrade/pg_upgrade.h b/src/bin/pg_upgrade/pg_upgrade.h
index d9a848cbfd..829581b19a 100644
--- a/src/bin/pg_upgrade/pg_upgrade.h
+++ b/src/bin/pg_upgrade/pg_upgrade.h
@@ -461,7 +461,7 @@ void                check_pghost_envvar(void);
 /* util.c */
 
 char      *quote_identifier(const char *s);
-int                    get_user_info(char **user_name_p);
+void           get_user_info(char **user_name_p);
 void           check_ok(void);
 void           report_status(eLogType type, const char *fmt,...) pg_attribute_printf(2, 3);
 void           pg_log(eLogType type, const char *fmt,...) pg_attribute_printf(2, 3);
diff --git a/src/bin/pg_upgrade/util.c b/src/bin/pg_upgrade/util.c
index 2478372992..ef3ec57b0e 100644
--- a/src/bin/pg_upgrade/util.c
+++ b/src/bin/pg_upgrade/util.c
@@ -319,27 +319,18 @@ quote_identifier(const char *s)
 /*
  * get_user_info()
  */
-int
+void
 get_user_info(char **user_name_p)
 {
-       int                     user_id;
        const char *user_name;
        char       *errstr;
 
-#ifndef WIN32
-       user_id = geteuid();
-#else
-       user_id = 1;
-#endif
-
        user_name = get_user_name(&errstr);
        if (!user_name)
                pg_fatal("%s", errstr);
 
        /* make a copy */
        *user_name_p = pg_strdup(user_name);
-
-       return user_id;
 }