diff --git a/src/wp-admin/admin.php b/src/wp-admin/admin.php
index 82ab6b93ac..4d29548d3b 100644
--- a/src/wp-admin/admin.php
+++ b/src/wp-admin/admin.php
@@ -53,49 +53,69 @@ if ( get_option( 'db_upgraded' ) ) {
 ) {
 
 	if ( ! is_multisite() ) {
-		wp_redirect( admin_url( 'upgrade.php?_wp_http_referer=' . urlencode( wp_unslash( $_SERVER['REQUEST_URI'] ) ) ) );
-		exit;
-	}
+		require_once ABSPATH . 'wp-admin/includes/upgrade.php';
+		wp_upgrade();
 
-	/**
-	 * Filters whether to attempt to perform the multisite DB upgrade routine.
-	 *
-	 * In single site, the user would be redirected to wp-admin/upgrade.php.
-	 * In multisite, the DB upgrade routine is automatically fired, but only
-	 * when this filter returns true.
-	 *
-	 * If the network is 50 sites or less, it will run every time. Otherwise,
-	 * it will throttle itself to reduce load.
-	 *
-	 * @since MU (3.0.0)
-	 *
-	 * @param bool $do_mu_upgrade Whether to perform the Multisite upgrade routine. Default true.
-	 */
-	if ( apply_filters( 'do_mu_upgrade', true ) ) {
-		$blog_count = get_blog_count();
+		flush_rewrite_rules();
+		update_option( 'db_upgraded', false, true );
 
-		/*
-		 * If there are 50 or fewer sites, run every time. Otherwise, throttle to reduce load:
-		 * attempt to do no more than threshold value, with some +/- allowed.
-		 */
-		if ( $blog_count <= 50 || ( $blog_count > 50 && mt_rand( 0, (int) ( $blog_count / 50 ) ) === 1 ) ) {
-			require_once ABSPATH . WPINC . '/http.php';
-
-			$response = wp_remote_get(
-				admin_url( 'upgrade.php?step=1' ),
-				array(
-					'timeout'     => 120,
-					'httpversion' => '1.1',
-				)
-			);
+		/** This action is documented in wp-admin/admin.php */
+		do_action( 'after_db_upgrade' );
+
+		add_action(
+			'admin_notices',
+			static function () {
+				wp_admin_notice(
+					__( 'Your WordPress database has been successfully updated!' ),
+					array(
+						'type'        => 'success',
+						'dismissible' => true,
+					)
+				);
+			}
+		);
+	} else {
 
-			/** This action is documented in wp-admin/network/upgrade.php */
-			do_action( 'after_mu_upgrade', $response );
+		/**
+		 * Filters whether to attempt to perform the multisite DB upgrade routine.
+		 *
+		 * In single site, the user would be redirected to wp-admin/upgrade.php.
+		 * In multisite, the DB upgrade routine is automatically fired, but only
+		 * when this filter returns true.
+		 *
+		 * If the network is 50 sites or less, it will run every time. Otherwise,
+		 * it will throttle itself to reduce load.
+		 *
+		 * @since MU (3.0.0)
+		 *
+		 * @param bool $do_mu_upgrade Whether to perform the Multisite upgrade routine. Default true.
+		 */
+		if ( apply_filters( 'do_mu_upgrade', true ) ) {
+			$blog_count = get_blog_count();
+
+			/*
+			 * If there are 50 or fewer sites, run every time. Otherwise, throttle to reduce load:
+			 * attempt to do no more than threshold value, with some +/- allowed.
+			 */
+			if ( $blog_count <= 50 || ( $blog_count > 50 && mt_rand( 0, (int) ( $blog_count / 50 ) ) === 1 ) ) {
+				require_once ABSPATH . WPINC . '/http.php';
+
+				$response = wp_remote_get(
+					admin_url( 'upgrade.php?step=1' ),
+					array(
+						'timeout'     => 120,
+						'httpversion' => '1.1',
+					)
+				);
+
+				/** This action is documented in wp-admin/network/upgrade.php */
+				do_action( 'after_mu_upgrade', $response );
+
+				unset( $response );
+			}
 
-			unset( $response );
+			unset( $blog_count );
 		}
-
-		unset( $blog_count );
 	}
 }
 
