diff --git a/src/bin/pg_upgrade/check.c b/src/bin/pg_upgrade/check.c
new file mode 100644
index be66b24..5eaa67b
*** a/src/bin/pg_upgrade/check.c
--- b/src/bin/pg_upgrade/check.c
*************** static void check_databases_are_compatib
*** 19,24 ****
--- 19,25 ----
  static void check_locale_and_encoding(DbInfo *olddb, DbInfo *newdb);
  static bool equivalent_locale(int category, const char *loca, const char *locb);
  static void check_is_install_user(ClusterInfo *cluster);
+ static void check_proper_datallowconn(ClusterInfo *cluster);
  static void check_for_prepared_transactions(ClusterInfo *cluster);
  static void check_for_isn_and_int8_passing_mismatch(ClusterInfo *cluster);
  static void check_for_reg_data_type_usage(ClusterInfo *cluster);
*************** check_and_dump_old_cluster(bool live_che
*** 93,98 ****
--- 94,100 ----
  	 * Check for various failure cases
  	 */
  	check_is_install_user(&old_cluster);
+ 	check_proper_datallowconn(&old_cluster);
  	check_for_prepared_transactions(&old_cluster);
  	check_for_reg_data_type_usage(&old_cluster);
  	check_for_isn_and_int8_passing_mismatch(&old_cluster);
*************** check_is_install_user(ClusterInfo *clust
*** 640,645 ****
--- 642,699 ----
  
  	check_ok();
  }
+ 
+ 
+ static void
+ check_proper_datallowconn(ClusterInfo *cluster)
+ {
+ 	int			dbnum;
+ 	PGconn	   *conn_template1;
+ 	PGresult   *dbres;
+ 	int			ntups;
+ 	int			i_datname;
+ 	int			i_datallowconn;
+ 
+ 	prep_status("Checking for proper database connection permissions");
+ 
+ 	conn_template1 = connectToServer(cluster, "template1");
+ 
+ 	/* get database names */
+ 	dbres = executeQueryOrDie(conn_template1,
+ 							  "SELECT	datname, datallowconn "
+ 							  "FROM	pg_catalog.pg_database");
+ 
+ 	i_datname = PQfnumber(dbres, "datname");
+ 	i_datallowconn = PQfnumber(dbres, "datallowconn");
+ 
+ 	ntups = PQntuples(dbres);
+ 	for (dbnum = 0; dbnum < ntups; dbnum++)
+ 	{
+ 		char	   *datname = PQgetvalue(dbres, dbnum, i_datname);
+ 		char	   *datallowconn = PQgetvalue(dbres, dbnum, i_datallowconn);
+ 
+ 		if (strcmp(datname, "template0") == 0)
+ 		{
+ 			/* avoid restore failure when pg_dumpall tries to create template0 */
+ 			if (strcmp(datallowconn, "t") == 0)
+ 				pg_fatal("template0 must not allow connections,\n"
+ 						 "i.e. its pg_database.datallowconn must be false\n");
+ 		}
+ 		else
+ 		{
+ 			/* avoid datallowconn == false databases from being skipped on restore */
+ 			if (strcmp(datallowconn, "f") == 0)
+ 				pg_fatal("All non-template0 databases must allow connections,\n"
+ 						 "i.e. their pg_database.datallowconn must be true\n");
+ 		}
+ 	}
+ 
+ 	PQclear(dbres);
+ 
+ 	PQfinish(conn_template1);
+ 
+ 	check_ok();
+ }
  
  
  /*
