mirror of
https://github.com/postgres/postgres.git
synced 2025-07-28 23:42:10 +03:00
Add GUC ignore_invalid_pages.
Detection of WAL records having references to invalid pages during recovery causes PostgreSQL to raise a PANIC-level error, aborting the recovery. Setting ignore_invalid_pages to on causes the system to ignore those WAL records (but still report a warning), and continue recovery. This behavior may cause crashes, data loss, propagate or hide corruption, or other serious problems. However, it may allow you to get past the PANIC-level error, to finish the recovery, and to cause the server to start up. Author: Fujii Masao Reviewed-by: Michael Paquier Discussion: https://www.postgresql.org/message-id/CAHGQGwHCK6f77yeZD4MHOnN+PaTf6XiJfEB+Ce7SksSHjeAWtg@mail.gmail.com
This commit is contained in:
@ -31,6 +31,9 @@
|
||||
#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,7 +96,8 @@ 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");
|
||||
elog(ignore_invalid_pages ? WARNING : PANIC,
|
||||
"WAL contains references to invalid pages");
|
||||
}
|
||||
|
||||
/*
|
||||
@ -240,7 +244,8 @@ XLogCheckInvalidPages(void)
|
||||
}
|
||||
|
||||
if (foundone)
|
||||
elog(PANIC, "WAL contains references to invalid pages");
|
||||
elog(ignore_invalid_pages ? WARNING : PANIC,
|
||||
"WAL contains references to invalid pages");
|
||||
|
||||
hash_destroy(invalid_page_tab);
|
||||
invalid_page_tab = NULL;
|
||||
|
@ -123,6 +123,7 @@ extern int CommitSiblings;
|
||||
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
|
||||
@ -1172,6 +1173,25 @@ static struct config_bool ConfigureNamesBool[] =
|
||||
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 "
|
||||
"raise a PANIC-level error, aborting the recovery. "
|
||||
"Setting ignore_invalid_pages to true causes "
|
||||
"the system to ignore invalid page references "
|
||||
"in WAL records (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 or in standby mode."),
|
||||
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."),
|
||||
|
Reference in New Issue
Block a user