1
0
mirror of https://github.com/postgres/postgres.git synced 2025-07-27 12:41:57 +03:00

Do not summarize WAL if generated with wal_level=minimal.

To do this, we must include the wal_level in the first WAL record
covered by each summary file; so add wal_level to struct Checkpoint
and the payload of XLOG_CHECKPOINT_REDO and XLOG_END_OF_RECOVERY.

This, in turn, requires bumping XLOG_PAGE_MAGIC and, since the
Checkpoint is also stored in the control file, also
PG_CONTROL_VERSION. It's not great to do that so late in the release
cycle, but the alternative seems to ship v17 without robust
protections against this scenario, which could result in corrupted
incremental backups.

A side effect of this patch is that, when a server with
wal_level=replica is started with summarize_wal=on for the first time,
summarization will no longer begin with the oldest WAL that still
exists in pg_wal, but rather from the first checkpoint after that.
This change should be harmless, because a WAL summary for a partial
checkpoint cycle can never make an incremental backup possible when
it would otherwise not have been.

Report by Fujii Masao. Patch by me. Review and/or testing by Jakub
Wartak and Fujii Masao.

Discussion: http://postgr.es/m/6e30082e-041b-4e31-9633-95a66de76f5d@oss.nttdata.com
This commit is contained in:
Robert Haas
2024-07-18 12:09:48 -04:00
parent 4cbd8c6022
commit 2b5819e2b4
9 changed files with 278 additions and 81 deletions

View File

@ -4318,11 +4318,17 @@ restore_command = 'copy "C:\\server\\archivedir\\%f" "%p"' # Windows
<listitem>
<para>
Enables the WAL summarizer process. Note that WAL summarization can
be enabled either on a primary or on a standby. WAL summarization
cannot be enabled when <varname>wal_level</varname> is set to
<literal>minimal</literal>. This parameter can only be set in the
<filename>postgresql.conf</filename> file or on the server command line.
The default is <literal>off</literal>.
be enabled either on a primary or on a standby. This parameter can only
be set in the <filename>postgresql.conf</filename> file or on the server
command line. The default is <literal>off</literal>.
</para>
<para>
The server cannot be started with <literal>summarize_wal=on</literal>
if <literal>wal_level</literal> is set to <literal>minimal</literal>. If
<literal>summarize_wal=on</literal> is configured after server startup
while <literal>wal_level=minimal</literal>, the summarizer will run
but refuse to generate summary files for any WAL generated with
<literal>wal_level=minimal</literal>.
</para>
</listitem>
</varlistentry>

View File

@ -27960,6 +27960,17 @@ SELECT currval(pg_get_serial_sequence('sometable', 'id'));
not running, it will be equal to <literal>summarized_lsn</literal>.
<literal>summarizer_pid</literal> is the PID of the WAL summarizer
process, if it is running, and otherwise NULL.
</para>
<para>
As a special exception, the WAL summarizer will refuse to generate
WAL summary files if run on WAL generated under
<literal>wal_level=minimal</literal>, since such summaries would be
unsafe to use as the basis for an incremental backup. In this case,
the fields above will continue to advance as if summaries were being
generated, but nothing will be written to disk. Once the summarizer
reaches WAL generated while <literal>wal_level</literal> was set
to <literal>replica</literal> or higher, it will resume writing
summaries to disk.
</para></entry>
</row>
</tbody>