diff --git a/doc/src/sgml/config.sgml b/doc/src/sgml/config.sgml
index 619ac8c50c..99ad1d1b39 100644
*** a/doc/src/sgml/config.sgml
--- b/doc/src/sgml/config.sgml
***************
*** 9664,9669 **** LOG:  CleanUpLock: deleting: lock(0xb7acd844) id(24688,24696,0,0,0,1)
--- 9664,9691 ----
        </listitem>
       </varlistentry>
  
+      <varlistentry id="guc-ignore-invalid-pages" xreflabel="ignore_invalid_pages">
+       <term><varname>ignore_invalid_pages</varname> (<type>boolean</type>)
+       <indexterm>
+        <primary><varname>ignore_invalid_pages</varname> configuration parameter</primary>
+       </indexterm>
+       </term>
+       <listitem>
+        <para>
+         Detection of WAL records having references to invalid pages during
+         recovery causes <productname>PostgreSQL</productname> to report
+         an error, aborting the recovery. Setting
+         <varname>ignore_invalid_pages</varname> to true causes the system
+         to ignore the failure (but still report a warning), and continue
+         recovery. This behavior may <emphasis>cause crashes, data loss,
+          propagate or hide corruption, or other serious problems</emphasis>.
+         However, it may allow you to get past the error, finish the recovery,
+         and cause the server to start up.
+         The default setting is off, and it can only be set at server start.
+        </para>
+       </listitem>
+      </varlistentry>
+ 
       <varlistentry id="guc-jit-debugging-support" xreflabel="jit_debugging_support">
        <term><varname>jit_debugging_support</varname> (<type>boolean</type>)
        <indexterm>
diff --git a/src/backend/accessindex 5f1e5ba75d..5e6f47d8c1 100644
*** a/src/backend/access/transam/xlogutils.c
--- b/src/backend/access/transam/xlogutils.c
***************
*** 31,36 ****
--- 31,39 ----
  #include "utils/rel.h"
  
  
+ /* GUC variable */
+ bool		ignore_invalid_pages = false;
+ 
  /*
   * During XLOG replay, we may see XLOG records for incremental updates of
   * pages that no longer exist, because their relation was later dropped or
***************
*** 93,99 **** log_invalid_page(RelFileNode node, ForkNumber forkno, BlockNumber blkno,
  	if (reachedConsistency)
  	{
  		report_invalid_page(WARNING, node, forkno, blkno, present);
! 		elog(PANIC, "WAL contains references to invalid pages");
  	}
  
  	/*
--- 96,103 ----
  	if (reachedConsistency)
  	{
  		report_invalid_page(WARNING, node, forkno, blkno, present);
! 		elog(ignore_invalid_pages ? WARNING : PANIC,
! 			 "WAL contains references to invalid pages");
  	}
  
  	/*
***************
*** 240,246 **** XLogCheckInvalidPages(void)
  	}
  
  	if (foundone)
! 		elog(PANIC, "WAL contains references to invalid pages");
  
  	hash_destroy(invalid_page_tab);
  	invalid_page_tab = NULL;
--- 244,251 ----
  	}
  
  	if (foundone)
! 		elog(ignore_invalid_pages ? WARNING : PANIC,
! 			 "WAL contains references to invalid pages");
  
  	hash_destroy(invalid_page_tab);
  	invalid_page_tab = NULL;
diff --git a/src/backend/utils/misc/guc.c b/sindex 2178e1cf5e..82761db6b4 100644
*** a/src/backend/utils/misc/guc.c
--- b/src/backend/utils/misc/guc.c
***************
*** 122,127 **** extern int	CommitSiblings;
--- 122,128 ----
  extern char *default_tablespace;
  extern char *temp_tablespaces;
  extern bool ignore_checksum_failure;
+ extern bool ignore_invalid_pages;
  extern bool synchronize_seqscans;
  
  #ifdef TRACE_SYNCSCAN
***************
*** 1160,1165 **** static struct config_bool ConfigureNamesBool[] =
--- 1161,1184 ----
  		false,
  		NULL, NULL, NULL
  	},
+ 	{
+ 		{"ignore_invalid_pages", PGC_POSTMASTER, DEVELOPER_OPTIONS,
+ 			gettext_noop("Continues recovery after an invalid pages failure."),
+ 			gettext_noop("Detection of WAL records having references to "
+ 						 "invalid pages during recovery causes PostgreSQL to "
+ 						 "report an error, aborting the recovery. Setting "
+ 						 "ignore_invalid_pages to true causes the system to "
+ 						 "ignore the failure (but still report a warning), "
+ 						 "and continue recovery. This behavior may cause "
+ 						 "crashes, data loss, propagate or hide corruption, "
+ 						 "or other serious problems. Only has "
+ 						 "an effect during recovery."),
+ 			GUC_NOT_IN_SAMPLE
+ 		},
+ 		&ignore_invalid_pages,
+ 		false,
+ 		NULL, NULL, NULL
+ 	},
  	{
  		{"full_page_writes", PGC_SIGHUP, WAL_SETTINGS,
  			gettext_noop("Writes full pages to WAL when first modified after a checkpoint."),
