diff --git a/src/backend/tcop/postgres.c b/src/backend/tcop/postgres.c
index e3a4db5de248de378c2cd988dc9c44c662a79fe6..937191334fc558ffaff225bda242a9b323e8683a 100644
--- a/src/backend/tcop/postgres.c
+++ b/src/backend/tcop/postgres.c
@@ -3653,6 +3653,11 @@ PostgresMain(int argc, char *argv[], const char *username)
 		 * Create lockfile for data directory.
 		 */
 		CreateDataDirLockFile(false);
+
+		/* In EXEC_BACKEND, this was set via BackendParameters */
+#ifndef EXEC_BACKEND
+		InitializeMaxBackends();
+#endif
 	}
 
 	/* Early initialization */
diff --git a/src/backend/utils/init/postinit.c b/src/backend/utils/init/postinit.c
index 3948eac039b32fc17b93acbe043bcf757221d131..ddd79d0aa2dfb24ba7cb2f00c1b83fc6c4c5de69 100644
--- a/src/backend/utils/init/postinit.c
+++ b/src/backend/utils/init/postinit.c
@@ -453,8 +453,6 @@ InitializeMaxBackends(void)
 void
 BaseInit(void)
 {
-	InitializeMaxBackends();
-
 	/*
 	 * Attach to shared memory and semaphores, and initialize our
 	 * input/output/debugging file descriptors.