How can I force a merge of all WAL files in pg_xlog back into my base "data" directory?
Posted
by
Zac B
on Server Fault
See other posts from Server Fault
or by Zac B
Published on 2012-11-19T16:22:11Z
Indexed on
2012/11/19
17:02 UTC
Read the original article
Hit count: 378
Question:
Is there a way to tell Postgres (9.2) to "merge all WAL files in pg_xlog
back into the non-WAL data files, and then delete all WAL files successfully merged?"
I would like to be able to "force" this operation; i.e. checkpoint_segments
or archiving settings should be ignored. The filesystem WAL buffer (pg_xlog
) directory should be emptied, or nearly emptied. It's fine if some or all of the space consumed by the pg_xlog
directory is then consumed by the data directory; our DBA has asked for WAL database backups without any backlogged WALs, but space consumption is not a concern.
Having near-zero WAL activity during this operation is a fine constraint. I can ensure that the database server is either shut down or not connectible (zero user-generated transaction load) during this process.
Essentially, I'd like Postgres to ignore archiving/checkpoint retention policies temporarily, and flush all WAL activity to the core database files, leaving pg_xlog
in the same state as if the database were recently created--with very few WAL files.
What I've Tried:
I know that the pg_basebackup
utility performs something like this (it generates an almost-all-WALs-merged copy of a Postgres instance's data directory), but we aren't ready to use it on all our systems yet, as we are still testing replication settings; I'm hoping for a more short-term solution.
I've tried issuing CHECKPOINT
commands, but they just recycle one WAL file and replace it with another (that is, if they do anything at all; if I issue them during database idle time, they do nothing). pg_switch_xlog()
similarly just forces a switch to the next log segment; it doesn't flush all queued/buffered segments.
I've also played with the pg_resetxlog
utility. That utility sort of does what I want, but all of its usage docs seem to indicate that it destroys (rather than flushing out of the transaction log and into the main data files) some or all of the WAL data. Is that impression accurate? If not, can I use pg_resetxlog
during a zero-WAL-activity period to force a flush of all queued WAL data to non-WAL data? If the answer to that is negative, how can I achieve this goal?
Thanks!
© Server Fault or respective owner