pgBackRest release numbers consist of three parts: major, minor, and patch. A major release may break compatibility with the prior major release, but v2 releases are fully compatible with v1 repositories and will accept all v1 options. Minor releases can include bug fixes and features but do not change the repository format and strive to avoid changing options and naming. Patch releases contain bug fixes for the most recent minor release.

Feature releases are scheduled for the third Monday of January, April, July, and October. Patch releases are scheduled for the third Monday of any other month as required.

Documentation for the v1 release can be found here.

The notes for a release may also contain Additional Notes but changes in this section are only to documentation or the test suite and have no direct impact on the pgBackRest codebase.
Current Stable Release
v2.60.0 Release Notes
Page Checksum Errors and Object Store Prefetch
Released October 18, 2026
IMPORTANT NOTE: The restore command will now error and stop if any restored file contains an invalid page checksum, which leaves the cluster incomplete and unable to start, so the restore must be rerun. The expire command will now refuse to expire if the oldest retained backup would contain checksum errors, which also prevents archive from being expired in that repository. Set checksum-page-error=n to warn instead of erroring.
Features:
  • Add checksum-page-error option to error on invalid page checksums. (Contributed by Andrew Pogrebnoi. Reviewed by Douglas J Hunley, David Steele, Greg Sabino Mullane, Stefan Fercot. Suggested by Greg Sabino Mullane.)
    This option applies to the backup, restore, and expire commands. The backup command defaults to a warning for each file (as before) and now also reports the total number of checksum warnings at the end of the backup. The restore and expire commands default to an error. Previously the restore command did not report invalid page checksums at all.
    Issue #2687Pull request #2833Commit d7f54b2
  • Support for GCS Workload Identity Federation. (Contributed by Adol Rodriguez. Reviewed by Douglas J Hunley, David Steele.)
    Set repo-gcs-key-type=web-id and set repo-gcs-key to an external account credential file, e.g. as generated by gcloud iam workload-identity-pools create-cred-config. The web identity token is exchanged for an access token without a service account key. The token file is reloaded on each exchange to pick up rotated tokens, e.g. Kubernetes projected service account tokens. Service account impersonation is not supported.
    Issue #2838Pull request #2839Commit 1d217e6
  • Prefetch multi-file/range reads from object stores. (Reviewed by Andrew Pogrebnoi, Douglas J Hunley.)
    Requests are queued ahead of the current read so requests proceed while reading, and small gaps between files are read over instead of starting a new request. Restore uses this to read bundled files and block incremental maps, and backup uses it to read block incremental maps from the prior backup. repo-storage-prefetch (default 3) sets how many requests are queued and repo-storage-read-over (default 64KiB) sets the largest gap that is read over.
    e63dec3 Prefetch multi-file/range reads from object stores.Pull request #2783
    5ae4015 Combine prior block incremental map reads during backup.Pull request #2816
Improvements:
  • Reduce keep-alive requests to remote processes. (Reviewed by Douglas J Hunley.)
    A keep-alive was sent to every remote each time a job completed in archive-push and backup, even when the remotes had just been sent a request. A keep-alive is now sent only when no request has been sent to the remote for 30 seconds.
    Commit f652261
  • Retry Azure batch sub-requests missing from the response. (Reviewed by Douglas J Hunley.)
    When Azure fails a batch delete it may return a single response for the entire batch. The sub-requests with no response were treated as complete, so only one file per batch was removed while the command reported success. Sub-requests with no response are now retried.
    Issue #2840Pull request #2849Commit 567a245
  • Reduce the manifest checks made when reconstructing backup.info. (Reviewed by Douglas J Hunley. Suggested by todeb.)
    The backup, expire, and annotate commands no longer check for a backup.manifest when the repository listing shows the backup path does not exist, or when a diff or incr backup belongs to a full backup set that is not in backup.info. Each check is a request so on an object store the check for a missing manifest is logged as a 404.
    Issue #2769Pull request #2825Commit 0d3c340
  • Use original size to determine if a file should be bundled. (Reviewed by Douglas J Hunley.)
    The size of a block incremental file in the prior backup was used to decide whether to bundle it, so a file that had grown past repo-bundle-limit could still be stored in a bundle. The current size of the file is now used.
    Pull request #2843Commit 340d58b
  • Add context to block map read errors during backup. (Reviewed by Stefan Fercot, Douglas J Hunley.)
    An error reading the block map of a prior backup now reports the file, repository path, offset, and map size. A read that returns fewer bytes than expected is reported as such instead of as a parse error.
    bc91688 Add context to block map read errors during backup.Issue #2489Issue #2829Pull request #2830
    f46bfaf Fix option name in block incremental map errors.
  • Cast current_timestamp to text in the backup start label. (Contributed by Tiago Corcelli de Oliveira. Reviewed by David Steele.)
    A user-defined implicit cast from timestamptz to text caused the backup to fail with operator is not unique: unknown || timestamp with time zone. The label text is unchanged.
    Issue #2873Commit 86936e1
  • Support building on illumos. (Contributed by Kalevi Kolttonen. Reviewed by Douglas J Hunley, David Steele.)
    An OmniOS job has been added to CI. Solaris may also work but has not been tested.
    Pull request #2870Commit ad72e58
  • Support OpenSSL 4. (Reviewed by Douglas J Hunley.)
    Building against OpenSSL 4 failed because X509_get_subject_name() now returns a const name.
    Commit a729ac8
  • Fix clang builds. (Reviewed by Douglas J Hunley.)
    On Linux, gcc installs libbacktrace.a where clang also looks for it but installs backtrace.h where only gcc can find it. A clang build found the library and then failed to compile. The library is now only used when its header is found. Return types that clang reports as narrowing conversions in debug builds are also fixed.
    84b031a Require the header when checking for libbacktrace.
    195e66b Return the declared type from functions that return a StringId-based enum.
    d9e5e14 Return bool from a function declared to return bool.
  • Migrate code generation from C to Python.
    Code is generated during the build from the option, error, help, and PostgreSQL declarations by a Python tool instead of a C tool that had to be built first. Building from a git checkout requires PyYAML instead of libyaml. The release tarball includes the generated code and requires neither.
    Commit 59bd2cd
Documentation Improvements:
  • Modernize the website. Special thanks to Jan for the insightful (and hilarious) logo. (Contributed by David Steele, Jan Wieremjewicz. Reviewed by Steve Atkins, Kai Wagner, Douglas J Hunley, Nikolaos Stamatopoulos, Matt Hudson, Stefan Fercot.)
    The website has a new design with light and dark themes and a layout that works on phones. Pages with a table of contents show it beside the text and mark the section being read. Commands and config files can be copied with a button, config files mark the lines each section changes, and release notes can be expanded to show more detail.
    5bc14b5 Shorten and disambiguate the documentation titles.
    b668d71 Move the sponsors down the index and shorten the appeal.
    60b85c5 Modernize the website.
    ab8df23 Show a card rather than the logo where a link is posted.
    76ae494 Remove the contents from the releases page and close up the date.
    3e86c71 Link rather than repeat the options in the command reference.
    dc3af7b Clarify the command titles in the command reference.
    078d52c Mark the lines a section changes in a config file.
    bd33623 Mark the output of a command the way a config file is marked.
    578fc2d Copy a command as well as a config file.
    1fb93f9 Error when a config section changes nothing the reader can see.
    2f3b2f2 Make the site logo a link home.
    8f902c6 Speed up the documentation build.
    b56b6ab List the most recent news items on the index automatically.
    5b8987d Render option type examples as code blocks in the reference.
    b5d5274 Scroll the menu sideways rather than wrapping it out of view.
    9ae2c32 Highlight the current page in the menu rather than leaving it out.
    b8da5b0 Version the style and script links so stale caches are refetched.
    ec57431 Jump straight to a section rather than gliding to it.
    46babed Fade an end the menu carries on past rather than cutting it flat.
    17de501 Put the bar of a section2 header under the title rather than beside it.
    940f431 Center the page title beside the logo and left align it when wrapped.
    050ca9e Add expandable details to the release notes.
    bd8f99b Add release note details for v2.33 through v2.60.
    28a1e3d Adjust keyword styling in light mode.
    1911f5f End the release note history at upstream integration in CI.
  • Document the release schedule.
    Feature releases are scheduled for the third Monday of January, April, July, and October. Patch releases are scheduled for the third Monday of any other month as required. The release notes introduction also describes the major, minor, and patch parts of a release number.
    9bca69a Document the release schedule.
    c179f3f Update release numbering in the release notes intro.
  • Migrate the documentation tools from C and Perl to Python.
    The documentation is built by doc/doc.py instead of a C tool run by doc/doc.pl, and building the documentation no longer requires Perl.
    59bd2cd Migrate the build and documentation code from C to Python.
    fa3d197 Migrate the remaining documentation code from Perl to Python.
Test Suite Improvements:
  • Migrate the test harness from C and Perl to Python.
    Tests are run with test/test.py instead of test/test.pl. The test containers and CI runners no longer require Perl and the harness is covered by tests.
    163e5ba Migrate the test harness from C to Python.
    e25c662 Migrate the rest of the test harness from Perl to Python.
  • Add a Fil-C job to CI.
    Fil-C is a memory-safe implementation of C that checks every pointer access. It found two out-of-bounds reads that gcc, clang, and Valgrind missed. A new workflow also builds and tests on the CI runner with gcc and clang, with and without the optional libraries.
    f32a5d5 Add a workflow to compile and test on the runner without a container.
    12396fb Add a Fil-C job to the compile workflow.
    908a11a Use the Fil-C distribution as-is now that it ships every library needed.
  • Add fuzz testing for the JSON, Ini, and Pack readers.
    The readers are fuzzed with libFuzzer, AddressSanitizer, and UndefinedBehaviorSanitizer in CI. Fuzzing found several bugs in how invalid input is read, e.g. deeply nested JSON arrays in an info file or an object store response could overflow the memory context stack.
    Commit 4c65010
  • Allow test user names that adduser on Debian rejects. (Contributed by Stefan Fercot. Reviewed by David Steele.)
    The test container is built with the same user name as the host user. Debian's adduser rejects names that contain a dot, e.g. first.last, so the container build failed on Debian-based images for these users.
    Issue #2858Pull request #2859Commit ce19dae
Stable Releases
v2.59.3 Release Notes
Weak Encryption Subkey Bug
Released October 4, 2026
IMPORTANT NOTE: In prior versions it was possible for weak encryption subkeys and salts to be generated if there was an error accessing system random data. See Weak Encryption Subkeys and Salts for more information.
Bug Fixes:
  • Fix possible checksum error loading encrypted info and manifest files. (Fixed by j0uinim. Reviewed by David Steele.)
    A large encrypted info or manifest file could lose its last lines when loaded, which failed the checksum. The lost lines had to fit in the final cipher block, so this is unlikely in practice.
    Issue #2866Pull request #2868Commit 2def063
  • Fix possible weak encryption subkeys/salts. (Fixed by j0uinim. Reviewed by David Steele, Stefan Fercot, Douglas J Hunley.)
    When OpenSSL could not get random data from the operating system the failure was ignored, and subkeys and salts were generated from memory that was not random. An error is now reported.
    Issue #2866Pull request #2867Commit 47ed78f
v2.59.2 Release Notes
PostgreSQL 19beta4 Support
Released September 27, 2026
Bug Fixes:
  • Fix empty block map when file is truncated to zero during backup. (Reviewed by Douglas J Hunley. Reported by JPCOSTA78.)
    A block incremental file larger than repo-bundle-limit and truncated to zero by PostgreSQL during a backup was stored as a block map with no blocks. Every later backup that referenced the file failed with unexpected eof until the next full backup.
    Issue #2829Pull request #2842Commit 572d163
  • Disable read retry when filters are passed to the driver. (Reviewed by Douglas J Hunley. Reported by megamaced.)
    A retried read from a repository on an object store, accessed through a repository host, crashed. These reads are no longer retried by the client. The repository host still retries its read from the object store.
    Issue #2845Pull request #2846Commit c6eca28
  • Fix pagination of S3 version listing. (Reviewed by Douglas J Hunley, guruguruguru. Reported by guruguruguru.)
    Reading a repository at a target time with repo-target-time failed with unable to find child 'NextContinuationToken' when more than a thousand versions were listed under a prefix.
    Issue #2854Pull request #2855Commit 6f0490d
  • Set the Azure version header for SAS authentication. (Reviewed by Douglas J Hunley. Reported by Florian Helmberger.)
    Batch deletes require the version header, so with SAS authentication every batch was rejected. The rejection looked like a single failed file, and the rest of each batch was not deleted while expire reported success, leaving expired backups and WAL in the repository.
    Issue #2840Pull request #2848Commit ea3293b
  • Fix async archive-push stalling on a zero-size backup history file. (Fixed by Andrew Kroh. Reviewed by David Steele, Douglas J Hunley.)
    A zero-size backup history file, e.g. in a cluster copied from a storage snapshot, failed every asynchronous archive-push run, so no WAL was archived. archive-push-batch-size is now converted to a segment count using the size of the first ready WAL segment.
    Issue #2856Pull request #2857Commit 12b1b3c
  • Fix annotate command on a remote encrypted repository. (Fixed by Douglas J Hunley. Reviewed by David Steele.)
    When the repository was encrypted and the cipher was configured only on the repository host, annotate failed to load backup.info.
    Commit 497ad5a
Features:
  • PostgreSQL 19beta4/rc1 support.
    PostgreSQL 19beta4 reverted online page checksum changes, so the page checksum version is again limited to 0 and 1. It also changed the pg_control version and the WAL page magic number.
    Commit 89eae83
v2.59.1 Release Notes
PostgreSQL 19beta3 Support
Released August 17, 2026
Bug Fixes:
  • Fix hang when the chunk buffer is smaller than the input buffer. (Reviewed by Andrew Pogrebnoi, Douglas J Hunley. Reported by crajac66.)
    A multi-part upload to S3, GCS, or Azure could loop forever when the chunk buffer was smaller than the input buffer, e.g. after the chunk size grew during the upload. The chunk buffer is now always large enough to hold the input buffer.
    Issue #2818Pull request #2819Commit a53e470
  • Compare a new backup label only against its own full backup set. (Reviewed by Douglas J Hunley. Reported by Anton Glushakov.)
    Some object stores keep listing a prefix after everything under it has been deleted, e.g. MinIO with object locking or SeaweedFS, so a full backup that was removed could still appear in the repository. Every diff and incr backup after it then failed with new backup label ... is not later than latest backup label .... A new label is now compared only against the backups in its own full backup set.
    Issue #2792Pull request #2824Commit d01f77e
  • Fix source archives generated by GitHub missing files required to build. (Reported by aardvarkzed.)
    The source archives GitHub generates for a release were missing the code generation tooling and the files it reads, so they could not be built. Only the distribution tarball is trimmed now.
    Issue #2821Commit 163670a
Features:
  • PostgreSQL 19beta3 support. (Contributed by Lardière Sébastien. Reviewed by David Steele.)
    PostgreSQL 19beta3 changed the WAL page magic number.
    Commit 5cbc256
Documentation Improvements:
  • Document exception for dots in S3 bucket names when repo-s3-uri-style=path.
    With repo-s3-uri-style=path the bucket is part of the path instead of the host name, so dots in the bucket name do not cause a certificate host name mismatch.
    Commit bbdc4b9
  • Remove explicit hot_standby configuration from user guide.
    hot_standby has been enabled by default since PostgreSQL 10. The quickstart now notes that a standby does not accept read-only connections without it.
    Commit cda454d
v2.59.0 Release Notes
PostgreSQL 19beta2 Support
Released July 20, 2026
NOTE TO PACKAGERS: A new distribution tarball is available which simplifies the build process by providing pregenerated HTML documentation, man page, and code. The tarball is attached to each release as an asset and is named pgbackrest-{version}.tar.gz. See the README.md in the tarball for details. Please use the new distribution tarball to avoid the additional build tooling required to generate code in future releases. See New Distribution Tarball for more information.

NOTE TO PACKAGERS: There is a new optional dependency on libsystemd.

IMPORTANT NOTE: Starting with this release, only the restore command may be run as root by default. Use allow-root to run other commands as root (though this is not recommended).
Bug Fixes:
  • Fix expire removing a backup in progress on another host. (Reviewed by Douglas J Hunley. Reported by Dmitrii.)
    A backup is not added to backup.info until it completes, so when expire ran on one host while a backup was running on another, e.g. expire on a standby while the primary is backed up, the backup in progress was removed. Expiration no longer removes the latest backup when it is in progress or resumable.
    Issue #2622Pull request #2797Commit aa0e215
  • Fix archive-push-queue-max not enforced when a WAL file errors. (Reviewed by Stefan Fercot. Reported by vut12.)
    In asynchronous mode the queue was measured against the WAL yet to be pushed. When a WAL file errored repeatedly the WAL files after it were pushed and no longer counted, although they stayed in pg_wal, so the queue limit was never reached and pg_wal could fill the disk. The queue is now measured against all the WAL PostgreSQL is waiting to archive, as in synchronous mode.
    Issue #2629Pull request #2799Commit 7fe3636
  • Fix async archive-get failure during recovery across a timeline switch. (Reviewed by Douglas J Hunley. Reported by Jimmy Yih.)
    Two async processes could race for the archive lock, and the one that lost exited before fetching the segment it was started for. The archive-get that started it then waited for archive-timeout and returned an error for a segment that exists, which could end recovery early, especially across a timeline switch. The segment is now fetched directly when the async process that should fetch it is not running.
    Issue #2423Pull request #2806Commit baed942
  • Fix potential buffer overrun in error module. (Fixed by Christophe Pettus. Reviewed by David Steele.)
    A stack trace too long for its buffer was not terminated and could be read past the end of the buffer, and an error message too long for its buffer could write past the end of it when a system error was appended. Both require an unusually long message.
    7fd8bc8 Fix potential buffer overrun in error module.
    5ca98ab Use the full buffer when formatting error messages.
    3a71dc8 Prevent an out-of-bounds error buffer write on an oversized message.
  • Fix use-after-free of parallel protocol client. (Reviewed by Douglas J Hunley. Reported by Georgy Shelkovy.)
    A client that ran out of work was freed but left in the client list and freed again on a later call. With debug or trace logging this read freed memory and could crash, e.g. a parallel backup with log-level-file=trace.
    Issue #2754Pull request #2804Commit 31432ed
  • Fix heap overflow when a pg option is set without pg1. (Reviewed by Douglas J Hunley. Reported by Naveen.)
    When pg options were set for other indexes without pg1-path, e.g. pg2-path and pg3-path, the index map was overwritten. This corrupted the heap on musl, e.g. Alpine, and caused a segmentation fault. The highest numbered pg-path was also dropped.
    Issue #1768Pull request #2796Commit 2d767de
  • Fix crash when a signal arrives during exit on musl 1.2.6.
    musl 1.2.6, e.g. on Alpine 3.24, crashes when exit() is called while an exit is already in progress. This happened when a signal arrived during exit, e.g. when the server command terminated a child process that was already exiting. A signal that arrives during exit is now ignored.
    Commit e166a33
Features:
  • PostgreSQL 19beta1/beta2 support. (Reviewed by Stefan Fercot.)
    Adds support for PostgreSQL 19beta1/beta2. PostgreSQL 19 can enable and disable page checksums online, and page checksums are not validated while either is in progress.
    bc6d399 PostgreSQL 19beta1 support.Pull request #2779
    2777395 PostgreSQL 19beta2 support.
  • Add archive-expire-before option to clean up WAL archive. (Contributed by Stefan Fercot. Reviewed by David Steele.)
    The expire option archive-expire-before removes WAL before a given segment from the archive but never WAL that a retained backup requires. It can clean up the archive from the restartpoint of a standby with archive_cleanup_command instead of pg_archivecleanup, which does not know about retention.
    6cd692b Extract WAL expiration into expireArchiveId().
    4945139 Add archive-expire-before option to clean up WAL archive.Pull request #2801
  • Add batch delete for Azure storage. (Reviewed by Douglas J Hunley, Crispy.)
    Files are removed with the Azure Blob Batch API, up to 256 per request, instead of one request per file. This speeds up expire and other commands that remove files from the repository.
    Pull request #2786Commit ffa325b
  • Add support for S3 Outposts. (Contributed by Shiva Kumar Ambigi. Reviewed by David Steele, Roberto Mello.)
    Set repo-s3-service=s3-outposts when using an S3 Outposts endpoint. The option sets the service name used for request signing and defaults to s3.
    Pull request #2762Commit 6c51800
  • Add S3 process authentication. (Reviewed by Andrew Charlton. Suggested by Andrew Charlton.)
    Set repo-s3-key-type=process and set repo-s3-process-cmd to a command that outputs temporary credentials in the JSON format of the AWS process credential provider. The credentials are refreshed before they expire.
    Pull request #2778Commit b5a578a
  • Provide a distribution tarball with generated code and documentation.
    The tarball includes the generated code and the rendered man page and HTML documentation, so it builds and installs without the code generation and documentation tooling, including libyaml.
    Commit 8fcfef5
Improvements:
  • Reconnect SFTP storage after the server drops an idle connection. (Reviewed by Stefan Fercot. Suggested by mustafa0x, tisserat.)
    SFTP servers and firewalls may drop a connection that has been idle for a while, e.g. the repository read connection during the copy phase of a backup, and the next use failed with a socket error. A dropped connection is now reopened and the operation is retried once.
    d72bea9 Fetch the libssh2 session from storage in SFTP read/write objects.
    a31febf Reconnect SFTP storage after the server drops an idle connection.Issue #2739Issue #2772Pull request #2793
  • Add user/group caching for faster manifest build. (Contributed by Gunnar Lindholm. Reviewed by David Steele.)
    When user and group names are looked up through a remote name service, e.g. sssd or LDAP, each lookup is a round trip, which dominated the manifest build for clusters with millions of files. User and group names are now cached.
    Pull request #2773Commit 1e6d23f
  • Add per-repo backup progress to info command output. (Contributed by Will Morland. Reviewed by David Steele, Stefan Fercot.)
    When backups run on more than one repository at once, the info command now reports progress for each repository as well as overall progress. The JSON output has a repo array for each backup lock.
    Issue #2736Pull request #2740Commit 77312b3
  • Add backup.info checks to verify command. (Contributed by Denis Garsh. Reviewed by David Steele, Douglas J Hunley.)
    The verify command now warns when a backup in the repository is not in backup.info and when a backup in backup.info is missing from the repository. A missing backup is reported as having a missing manifest.
    Issue #2723Pull request #2752Commit 7f82fb6
  • Allow the S3 STS endpoint to be configured. (Contributed by Simon Gratton. Reviewed by David Steele.)
    Set repo-s3-sts-host to use a regional STS endpoint with repo-s3-key-type=web-id, e.g. sts.eu-central-2.amazonaws.com. AWS opt-in regions do not accept credentials from the global endpoint, which is still the default.
    Issue #2791Pull request #2798Commit 11f5582
  • Add archive-push-batch-size to limit WAL pushed per asynchronous run. (Reviewed by Stefan Fercot.)
    In asynchronous mode archive-push-queue-max is only checked at the start of a run, so a run working through a large backlog could let the queue grow well past the limit. archive-push-batch-size (default 16GiB) limits the WAL pushed per run, so the queue is checked again sooner.
    Pull request #2803Commit 34a035f
  • Exit async archive-push on first error. (Reviewed by Stefan Fercot. Suggested by Lardière Sébastien.)
    When the repository was unavailable the async process kept trying every ready WAL segment, so a run could take long enough for pg_wal to fill before archive-push-queue-max was checked again. The run now exits on the first error, after the jobs in progress finish.
    Issue #1848Pull request #2802Commit a0c1435
  • Harden HTTP chunked response parsing. (Contributed by Shubham. Reviewed by David Steele.)
    Chunk extensions and trailers are now accepted, transfer-encoding is compared without regard to case, and a response with both transfer-encoding and content-length is rejected.
    Pull request #2785Commit 34bba82
  • Error when running as root unless allow-root is enabled. (Reviewed by Douglas J Hunley.)
    Running a command other than restore as root could create files in the repository, e.g. backup.info, that the PostgreSQL user cannot access. allow-root is disabled by default for every command except restore, and the check also applies on remote hosts.
    Issue #1693Pull request #2812Commit 0daf53d
  • Fewer binary searches when building manifest. (Contributed by Gunnar Lindholm. Reviewed by David Steele.)
    The manifest build for a diff or incr backup searched the prior manifest three times for each file. It now searches once, which saves millions of searches for clusters with millions of files.
    Pull request #2774Commit f1ef629
  • Improve seek performance during block incremental delta restore. (Reviewed by David Christensen, Douglas J Hunley.)
    A seek and a flush of the write buffer were done for every block written during a block incremental delta restore, and blocks are often 8KiB. The file position is now tracked and the seek and flush are only done when needed.
    Pull request #2732Commit b908d5e
  • Bundle backup files in order rather than scanning for a better fit. (Reviewed by Stefan Fercot.)
    A file that would push a bundle over repo-bundle-size was skipped for a smaller file later in the queue. Files are now added in order and a bundle is closed once it reaches repo-bundle-size, so a bundle may exceed it by up to repo-bundle-limit.
    Pull request #2794Commit 253dbc3
  • Report the underlying error when a query fails to complete. (Reviewed by Andrew Pogrebnoi. Suggested by Marco Fontana.)
    When the connection was lost after the first result of a query was delivered, e.g. under load, the error was the generic NULL result required to complete request. The error from PostgreSQL is now reported, with hints about a lost connection and about aggressive idle_session_timeout and idle_in_transaction_session_timeout settings.
    Issue #2789Pull request #2790Commit 23e966c
  • Report the actual error when an S3 credential request fails. (Reviewed by Douglas J Hunley. Suggested by Mitchell Grice.)
    An error from AWS for a web-id or pod-id credential request was reported as a failure to parse the response. The error returned by AWS is now reported, and the tokens are redacted when the request is logged.
    Issue #1997Pull request #2808Commit b0c57c2
  • Report archive-push spool path errors to the PostgreSQL log. (Reviewed by Douglas J Hunley. Suggested by Don Seiler.)
    When the async spool path could not be created, e.g. permission was denied, the error could not be written to the spool and archive-push failed with a generic timeout that pointed at the async log. The spool path is now created before the async process starts, so the error appears in the PostgreSQL log.
    Issue #1408Pull request #2810Commit 7b0159c
  • Hint that pgBackRest may be out of date when a version is unsupported.
    When pgBackRest does not recognize a PostgreSQL version, e.g. an older pgBackRest on the restore host reading a backup of a newer cluster, the error now hints that pgBackRest may need to be updated on all hosts. The version is reported in user-facing form, e.g. 13 rather than 130000.
    Commit d4f697e
  • Add systemd notify integration. (Contributed by Andrew Jackson. Reviewed by David Steele.)
    When built with libsystemd, the server command notifies systemd when it is ready to accept connections and when it is stopping, as PostgreSQL and PgBouncer do.
    Issue #2757Pull request #2760Commit 742fff1
  • Suppress unused parameter errors in meson compiler probes. (Contributed by Jörg Plate. Reviewed by David Steele.)
    The meson compiler probes declared main() parameters they did not use, which failed the probes when unused parameter warnings were errors.
    Issue #2724Commit d4465bd
  • C11 is now the minimum C standard. (Reviewed by Mohammad Ali Nazir Kosar.)
    Pull request #2738Commit 3a6c671
Documentation Improvements:
  • Make stanza option internal for the repo-* commands. (Reviewed by Stefan Fercot.)
    The stanza option only has an effect on the repo-* commands with undocumented storage path constants, so the documentation implied it did something it does not. The option is no longer documented for these commands and works as before.
    Issue #2735Commit 3e9eabd
  • Document that info reads encryption settings from global section. (Reviewed by Stefan Fercot. Suggested by Ron Johnson.)
    When run without stanza the info command reads encryption settings only from the global section, so encryption settings configured for a stanza require stanza.
    Issue #1407Pull request #2805Commit 2137bda
  • Document that expire-auto uses the backup command configuration. (Reviewed by Stefan Fercot. Suggested by Lardière Sébastien.)
    Automatic expiration after a backup uses the configuration of the backup command, so options set only for the expire command are not applied. Disable expire-auto and run expire separately when it needs its own configuration.
    Issue #1874Pull request #2807Commit cf847f9
  • Document adjusting the logrotate su directive for a dedicated user. (Reviewed by Douglas J Hunley. Suggested by lkanbus.)
    Packages may install a logrotate configuration that rotates the logs as the postgres user. When a dedicated user owns the repository and logs, the su directive must be changed to that user or rotation fails with a permission error.
    Issue #2737Pull request #2809Commit bde2c50
  • Document that end-of-line comments are not supported in config files. (Reviewed by Douglas J Hunley. Suggested by Alex Richman.)
    End-of-line comments have never been supported, although they may appear to work for some options. Only comments on a line of their own are supported.
    Issue #1633Pull request #2811Commit 8571799
Test Suite Improvements:
  • Fix Alpine group conflicts in CI containers. (Contributed by Artur Zakirov. Reviewed by David Steele.)
    Group entries with members are now handled when the test group is renamed, and the Alpine group is only created when it does not already exist.
    Pull request #2784Commit 760dd8d
v2.58.0 Release Notes
Object Storage Improvements
Released January 19, 2026
IMPORTANT NOTE: The minimum values for the repo-storage-upload-chunk-size option have increased. They now represent the minimum allowed by the vendors.
Bug Fixes:
  • Fix deadlock due to logging in signal handler. (Fixed by Maxim Michkov. Reviewed by David Steele.)
    A signal that arrived while a lock was held by gmtime_r(), e.g. the SIGTERM sent by stop with --force, could deadlock when the signal handler logged. The signal handler now logs with only async-signal-safe functions.
    Issue #2710Pull request #2715Commit e13c462
Features:
  • HTTP support for S3, GCS, and Azure. (Contributed by Will Morland. Reviewed by David Steele.)
    An object store endpoint can now begin with http:// to connect without TLS. HTTPS is still used when the endpoint does not specify a protocol.
    Issue #2340Pull request #2703Commit 2398dd4
  • Allow expiration of oldest full backup regardless of current retention. (Contributed by Stefan Fercot. Reviewed by David Steele. Suggested by Ron Johnson.)
    The expire option --oldest expires the oldest full backup and the backups that depend on it regardless of the retention settings, e.g. when the repository is running out of space. WAL before the oldest remaining full backup is expired as well.
    Issue #2666Pull request #2709Commit bf2b276
  • Support for Azure managed identities. (Contributed by Moiz Ibrar, Matthew Mols. Reviewed by David Steele.)
    Set repo-azure-key-type=auto to fetch credentials automatically using managed identities instead of configuring them. The credentials are refreshed before they expire.
    Issue #2023Pull request #2712Commit 38f14d7
  • Experimental support for S3 EKS pod identity. (Contributed by Pierre BOUTELOUP. Reviewed by David Steele.)
    Set repo-s3-key-type=pod-id to fetch credentials automatically using EKS pod identity instead of configuring them. The credentials are refreshed before they expire.
    Issue #2718Pull request #2719Commit 79544f6
  • Allow configuration of TLS cipher suites. (Contributed by Gunnar "Nick" Bluth. Reviewed by David Steele.)
    Set tls-cipher-12 for TLS 1.2 and tls-cipher-13 for TLS 1.3, e.g. for compliance. The cipher suites apply to every connection a process makes.
    fbc607a Allow configuration of TLS cipher suites.Issue #2697Pull request #2700
    91ad655 Fix flapping common/io-tls unit test added in fbc607a4.
  • Allow process priority to be set. (Reviewed by Douglas J Hunley.)
    priority sets the scheduling priority of pgBackRest processes from -20 to 19, as with nice. A higher value makes pgBackRest less likely to interfere with PostgreSQL.
    Pull request #2693Commit 0fc7e96
Improvements:
  • Allow dots in S3 bucket names when using path-style URIs. (Contributed by Joakim Hindersson. Reviewed by David Steele.)
    Dots in a bucket name only cause a certificate host name mismatch with host-style URIs, so they are now allowed with repo-s3-uri-style=path, which most self-hosted S3 services use.
    Pull request #2713Commit 3fdb4a1
  • Require TLS >= 1.2 unless verification is disabled. (Reviewed by Douglas J Hunley, Gunnar "Nick" Bluth.)
    TLS 1.0 and 1.1 have been deprecated since 2021. Verification is always enabled for connections between pgBackRest hosts. When verification is disabled for an object store with repo-storage-verify-tls, e.g. for a self-signed certificate, every protocol version is allowed.
    Pull request #2720Commit 5b4b20a
  • Dynamically size S3/GCS/Azure chunks for large uploads. (Reviewed by Douglas J Hunley. Suggested by Timothée Peignier.)
    The number of chunks in an upload is limited, so with the default repo-storage-upload-chunk-size the largest file that could be uploaded was 50GiB to S3, 40GiB to GCS, and 200GiB to Azure. The chunk size now grows during an upload, so files up to 5TiB can be uploaded to S3 and GCS and up to 45TiB to Azure.
    Issue #2679Pull request #2701Commit 86554fa
  • Optimize S3/GCS/Azure chunk size for small files. (Reviewed by Douglas J Hunley.)
    The whole chunk buffer was allocated when a file was opened, although many files are smaller than a chunk. The buffer now grows as data arrives, which saves memory when small files are uploaded.
    Pull request #2705Commit 28bfa20
  • Remove support for PostgreSQL 9.5. (Reviewed by Douglas J Hunley.)
    PostgreSQL 9.5 is no longer supported, per the policy of supporting five end-of-life versions of PostgreSQL.
    Pull request #2692Commit 5171e8b
  • Improve logging of default for options with an unresolved dependency. (Reviewed by Stefan Fercot.)
    An option set in the configuration file was logged at the start of a command when its dependency was not resolved, although its default value was used. The option is no longer logged in this case.
    Issue #2707Pull request #2708Commit 38ac638
Documentation Improvements:
  • Remove explicit max_wal_senders/wal_level configuration from user guide. (Suggested by Jamie Nguyen.)
    max_wal_senders and wal_level have defaulted to the values the user guide requires since PostgreSQL 10.
    Issue #2699Commit bce97d3
  • Clarify that bundling is useful for filesystems with large block sizes. (Suggested by Ron Johnson.)
    Bundling saves space on filesystems with large block sizes, where each small file takes a whole block.
    Issue #2706Commit a7e5f28
v2.57.0 Release Notes
Suppress Repository Symlinks
Released October 18, 2025
Bug Fixes:
  • Unnest HTTP/TLS/socket timeouts. (Reviewed by David Christensen.)
    A failed socket connection was also retried by the TLS and HTTP layers, so with the default io-timeout of 60 seconds a connection took nine minutes to time out. Each layer now retries only its own failures.
    Issue #2654Pull request #2662Commit 9c7f064
  • Fix possible segfault in page checksum error message. (Fixed by Zsolt Parragi. Reviewed by David Steele.)
    The error message for invalid page checksums used a string that was out of scope, which could log garbage or crash. This was most likely with pg_tde, since every encrypted file fails the page checksum.
    Pull request #2675Commit adc5e5b
  • Fix possible segfault in backup resume messages.
    The message that reports why a backup cannot be resumed used a string that was out of scope, which could log garbage or crash.
    Commit c1c40a4
Features:
  • Add repo-symlink option to suppress creation of repository symlinks. (Reviewed by Douglas J Hunley. Suggested by Ron Johnson.)
    Some filesystems that are otherwise Posix-compatible do not support symlinks. Set repo-symlink=n to keep the latest and tablespace symlinks from being created in the repository.
    Issue #2673Pull request #2674Commit bfd9790
Improvements:
  • Add HTTP retries for 408 and 429 errors. (Reviewed by David Christensen.)
    HTTP 408 (Request Timeout) and 429 (Too Many Requests) errors are now retried. 429 errors are common on Cloudflare R2.
    Pull request #2661Commit 8733900
v2.56.0 Release Notes
Progress Info Improvements
Released July 21, 2025
Bug Fixes:
  • Fix issue with adhoc expiration when no backups in a repository. (Reviewed by Stefan Fercot. Reported by Anup Gupta.)
    Adhoc expiration failed with cannot get index 0 from list with 0 value(s) when a repository had no backups.
    Issue #2645Pull request #2646Commit 638815b
Features:
  • Add restore progress to info command output. (Contributed by Denis Garsh, Maxim Michkov. Reviewed by David Steele.)
    The restore command now records its progress, which the info command reports alongside backup progress. A restore is also no longer terminated by the stop command.
    Issue #2546Pull request #2652Commit 8cdd9ce
  • Add progress-only detail level for info command output. (Contributed by Denis Garsh. Reviewed by David Steele, Stefan Fercot.)
    Set --detail-level=progress to report only progress, which is faster because the repository is not read. The default is full.
    Pull request #2550Commit 2706168
Improvements:
  • Retry failed reads on object stores. (Reviewed by David Christensen.)
    A read from an object store that failed after it started was fatal, which could restart an expensive job, e.g. during restore. A failed read is now retried from where it left off.
    Pull request #2642Commit 5e14692
  • Fix defaults in command-line help. (Reviewed by David Christensen, Chris Bandy.)
    When an option has more than one default, e.g. repo-storage-upload-chunk-size with an S3 and an Azure repository, the option list shows and the help for the option lists each default. Defaults are not shown for options that are not valid in the current configuration.
    Pull request #2625Commit 8737cad
Documentation Improvements:
  • Describe discrete option values in a list where appropriate. (Contributed by Anton Kurochkin. Reviewed by David Steele.)
    The values of options such as output for the verify and version commands are now described as a list, as for other options.
    Pull request #2638Commit 2e76e9f
  • Fix less than in help output for archive-mode option. (Contributed by Anton Kurochkin. Reviewed by David Steele.)
    Pull request #2633Commit cb67322
v2.55.1 Release Notes
Bug Fixes
Released May 5, 2025
Bug Fixes:
  • Revert calculate content-md5 on S3 only when required. (Reviewed by David Christensen. Reported by Frank Brendel.)
    S3 requires either content-md5 or an x-amz-content-* checksum for uploads when object lock is enabled, and Scality did not accept the alternate checksums, so uploads failed. content-md5 is calculated for all requests with content again.
    Issue #2613Pull request #2615Commit 8bbb982
  • Fix lower bounds checking for option keys. (Reviewed by David Christensen, Wolfgang Walther. Reported by Wolfgang Walther.)
    An indexed option with a key of 0, e.g. pg0-path, caused a segfault. It is now an error.
    Issue #2610Pull request #2611Commit 5e01098
v2.55.0 Release Notes
Verification Improvements and PostgreSQL 18 Support
Released April 21, 2025
Bug Fixes:
  • Fix block incremental restore issue on non-default repository. (Reviewed by David Christensen. Tested by Aleksander Łukasz. Reported by Aleksander Łukasz.)
    When the backup being restored used block incremental and was not in the lowest numbered repository, the restore read part of the block incremental data from the lowest numbered repository. Setting repo worked around the problem.
    Issue #2577Pull request #2579Commit 5d2c67c
  • Do not set recovery_target_timeline=current for PostgreSQL < 12. (Reviewed by Stefan Fercot.)
    Before PostgreSQL 12, explicitly setting recovery_target_timeline to current behaves as latest, although current is the default. The setting is now left out of recovery.conf when it is set to current for these versions.
    Pull request #2533Commit 6fbb28f
  • Fix expire archive range logging. (Reviewed by Stefan Fercot. Reported by Aleš Zelený.)
    Only the last archive path removed was logged as the start of the range, so the log suggested that far fewer files were expired than were.
    Issue #2543Pull request #2554Commit 47f050f
  • Fix error reporting for queries with no results. (Reviewed by Stefan Fercot. Reported by Susantha Bathige.)
    An error from a query that expected no results was reported as an unexpected result instead of as the error.
    Pull request #2539Commit d5cefb7
Features:
  • Verify recovery target timeline. (Reviewed by Stefan Fercot.)
    A backup that cannot follow the target timeline, e.g. one made after a standby was promoted and the new timeline forked off, failed only when recovery started, with a PostgreSQL error that is hard to interpret. The timeline is now checked against the history files before the restore starts.
    Pull request #2534Commit 922e9f0
  • Allow verification of a specified backup. (Contributed by Maxim Michkov. Reviewed by David Steele.)
    The verify option --set verifies only the specified backup and the WAL required to make it consistent.
    Issue #2419Pull request #2544Commit e4def88
  • Add support for S3/GCS requester pays. (Contributed by Timothée Peignier. Reviewed by David Steele.)
    Set repo-s3-requester-pays or repo-gcs-user-project to bill the requester instead of the bucket owner, e.g. so a hosted service can give customers access to their backups.
    4db0263 Add support for S3 requester pays.Pull request #2560
    814bf48 Add support for GCS requester pays.Pull request #2557
  • PostgreSQL 18 support. (Reviewed by Stefan Fercot.)
    This release was made before PostgreSQL 18 had a beta, so support was initially experimental. Nothing that affects pgBackRest changed before PostgreSQL 18.0.
    Pull request #2603Commit 565d2e0
  • Allow connections to PostgreSQL on abstract domain sockets. (Tested by Chris Bandy. Suggested by Chris Bandy.)
    pg-socket-path no longer has to be an absolute path, so it can name an abstract domain socket. libpq reports a path that is not valid.
    Issue #2529Pull request #2535Commit 68f22ae
  • Add numeric output to version command. (Contributed by Stefan Fercot. Reviewed by David Steele.)
    Set --output=num to output the version as a number, e.g. 2055000, which is easier to compare.
    Issue #2410Pull request #2526Commit 750a051
Improvements:
  • Allow backup command to operate on remote repositories. (Reviewed by Stefan Fercot.)
    The backup command can now run on a host where the repository is remote, which allows more flexibility in where backups are run.
    4a94b6b Refactor protocol helper.
    931435c Allow backup command to operate on remote repositories.Pull request #2512
  • Use lz4 for protocol compression. (Reviewed by Stefan Fercot.)
    lz4 compresses much faster than gz and gives similar ratios at the low levels used for protocol compression. Setting compress-level-network=0 no longer disables protocol compression.
    0577b03 Use lz4 for protocol compression.Pull request #2488
    5c8296d Remove reference to disabling network compression in the documentation.
  • Calculate content-md5 on S3 only when required. (Reviewed by David Christensen.)
    The content-md5 header is only calculated for batch delete requests, which require it, to save CPU when files are uploaded. This change was reverted in v2.55.1.
    Pull request #2592Commit 20bfd14
  • Warn when a value for a multi-key option is overwritten. (Reviewed by David Christensen, Stefan Fercot.)
    Options with key/value pairs, e.g. recovery-option, silently overwrote a value when its key was specified again. A warning is now logged.
    Issue #2591Pull request #2594Commit cab4d6f
  • Add detail logging for expired archive path. (Contributed by Stefan Fercot. Reviewed by David Steele.)
    Removing a large number of archive files could look like a hang. A message at detail level now shows progress.
    4dcfa9e Add detail logging to expire test.
    2155a12 Add detail logging for expired archive path.Issue #2543Pull request #2559
  • Remove support for PostgreSQL 9.4. (Reviewed by Stefan Fercot.)
    PostgreSQL 9.4 is no longer supported, per the policy of supporting five end-of-life versions of PostgreSQL. Backups of 9.4 clusters can still be expired.
    Pull request #2472Commit 48f511d
  • Remove autoconf/make build. (Reviewed by David Christensen.)
    v2.54.0 was the last release to support the autoconf/make build. Use meson to build.
    Pull request #2470Commit 89c9bab
Documentation Improvements:
  • Fix documentation for specifying multiple stanzas with tls-server-auth. (Reviewed by David Christensen, Stefan Fercot. Suggested by Terry MacAndrew.)
    Multiple stanzas are specified for tls-server-auth as a comma-separated list. The documentation said to repeat the option.
    Issue #2591Pull request #2595Commit 53a45d2
  • Clarify incremental backup expiration. (Reviewed by Stefan Fercot.)
    The documentation implied that incremental backups are expired by count. It now explains how incremental backups are expired and that full backups count as differential backups for differential retention.
    Pull request #2601Commit 8bdba74
  • Clarify requirement for local/remote pgBackRest versions to match. (Contributed by Greg Clough. Reviewed by David Steele.)
    Issue #2540Pull request #2541Commit 82299eb
  • Add FAQ about exporting self-contained cluster. (Contributed by Stefan Fercot. Reviewed by David Steele.)
    The FAQ explains how to create a self-contained export of a cluster with a backup made with --archive-copy and restored with --type=none.
    Pull request #2605Commit 9386920
  • Caveat --tablespace-map-all regarding tablespace creation. (Reviewed by Stefan Fercot, Christophe Courtois. Suggested by Christophe Courtois.)
    A tablespace created after the backup starts is not in the manifest, so tablespace-map-all cannot map it.
    Pull request #2538Commit e625ed8
  • Clarify behavior of --repo-retention-full-type. (Reviewed by Antoine Beaupré. Suggested by Antoine Beaupré.)
    Issue #2562Pull request #2583Commit 84eb9a7
  • Change --process-max recommendation for object stores to --repo-bundle. (Reviewed by Stefan Fercot.)
    On object stores repo-bundle reduces the time spent creating files far more than process-max does, because fewer files are created.
    Pull request #2542Commit aa7210a
  • Update unix_socket_directory to unix_socket_directories. (Contributed by hyunkyu han. Reviewed by David Steele.)
    unix_socket_directory has not been valid since PostgreSQL 9.2, so only unix_socket_directories is documented.
    Issue #2589Commit b28ae98
  • Recommend not placing spool-path within pg_xlog/pg_wal. (Reviewed by Martín Marqués, Don Seiler. Suggested by Martín Marqués.)
    A spool path inside pg_xlog or pg_wal can cause problems for PostgreSQL tools such as pg_rewind.
    Pull request #2600Commit dd3a7d9
v2.54.2 Release Notes
Bug Fix
Released January 20, 2025
Bug Fixes:
  • Fix issue after disabling bundling with block incremental enabled. (Reviewed by David Christensen.)
    When bundling was disabled after backups were made with bundling and block incremental enabled, the prior backups could not be read. The setting needed to read them is now preserved.
    Pull request #2511Commit dbc6f28
Documentation Improvements:
  • Clarify behavior of multiple configuration files. (Reviewed by Paul Bierly. Suggested by Paul Bierly.)
    Each configuration file must be valid on its own, so a section must be specified in each file that sets an option in it. The documentation also notes that quoting is not supported, whitespace is trimmed from keys and values, and repeated sections are merged.
    Commit 5da2df4
v2.54.1 Release Notes
Bug Fix
Released December 16, 2024
Bug Fixes:
  • Fix issue with version/help commands attempting to load pgbackrest.conf. (Reviewed by Stefan Fercot. Reported by Bradford Boyle, Julian.)
    In v2.54.0 the version and help commands loaded pgbackrest.conf and failed when it could not be read or parsed.
    Issue #2476Pull request #2477Commit 8d69118
Test Suite Improvements:
  • Stabilize async archiving in integration tests. (Contributed by Viktor Kurilko. Reviewed by David Steele.)
    An async archive-get left running by one integration test could write an error to the queue of the next test and fail its recovery.
    Issue #2463Pull request #2481Commit b90ce9e
v2.54.0 Release Notes
Target Time for Versioned Storage
Released October 21, 2024
NOTE TO PACKAGERS: This is last feature release to support the autoconf/make build. Please migrate to meson if you have not already done so. 2.54.X patch releases (if any) will continue to support autoconf/make.
Bug Fixes:
  • Fix PostgreSQL query performance for large datasets. (Fixed by Thibault Vincent, David Steele. Reviewed by David Christensen. Tested by Antoine Millet. Reported by Antoine Millet.)
    The query timeout logic delayed reading query results, which could make a query that returned a large result take up to db-timeout. Results are now read as soon as they are available.
    6ac4e8d Move fd module shim to io module test.
    77ae753 Allow fdReady() shim to be run only once with a specified return value.
    33fa396 Refactor Wait object to expose remaining wait as waitRemains().
    c8ccaaa Fix PostgreSQL query performance for large datasets.Issue #2458Pull request #2459
Features:
  • Allow repositories on versioned storage to be read at a target time. (Reviewed by Stefan Fercot, David Christensen.)
    The archive-get, info, repo-get, repo-ls, restore, and verify commands can read a repository on versioned Azure, GCS, or S3 storage as it was at repo-target-time. This allows recovery even when the repository has been deleted or corrupted, accidentally or maliciously.
    Pull request #2404Commit b19134d
  • Allow requested standby backup to proceed with no standby. (Reviewed by Stefan Fercot.)
    Set backup-standby=prefer to back up from a standby when one is available and from the primary otherwise. This does not help when the standby responds but fails to sync with the primary after the backup starts.
    Pull request #2378Commit a42629f
Improvements:
  • Summarize backup reference list for info command text output. (Contributed by Stefan Fercot. Reviewed by David Steele.)
    The backup reference list can be very long, so the text output of the info command now summarizes it. The full list is shown when --set is specified.
    Pull request #2399Commit b306f83
  • Refresh web-id token for each S3 authentication. (Contributed by Brent Graveland. Reviewed by David Steele.)
    The token file named by AWS_WEB_IDENTITY_TOKEN_FILE was read once at startup, so the token could expire during a long operation. The token is now read for each authentication.
    Issue #2428Pull request #2429Commit 95a4b9e
  • Correctly display current values for indexed options in help. (Reviewed by David Christensen.)
    The current value shown for an indexed option was always the value for the first index, e.g. pg1-path. The option help now lists the value for each index, and the option list shows when there is more than one.
    Pull request #2453Commit b3ca2e3
  • Save backup.info only when contents have changed. (Reviewed by Stefan Fercot.)
    expire saved backup.info even when it had not changed. Fewer saves also make it easier to choose a target time on versioned storage.
    Pull request #2403Commit b454b9e
  • Remove limitation on reading files in parallel during restore. (Reviewed by David Christensen.)
    The protocol could only read or write one file at a time on a remote, so a restore read one file at a time from the repository. Protocol commands can now be multiplexed, so a restore can read more than one file at a time, e.g. a bundle and the block incremental data for a file in it.
    df8cbc9 Protocol command multiplexing.Pull request #2108
    46c1297 Remove limitation on reading files in parallel during restore.Pull request #2436
  • Improve SFTP error messages. (Contributed by Reid Thompson. Reviewed by David Steele.)
    SFTP errors were reported as numbers only. They now include a description of the error.
    Pull request #2439Commit 70bda2c
Documentation Features:
  • Add performance tuning section to user guide. (Reviewed by Stefan Fercot.)
    The options that commonly improve performance were spread through the documentation. The quickstart now has a section that lists them.
    Pull request #2446Commit 278319e
Documentation Improvements:
  • Clarify source for data_directory. (Contributed by Stefan Fercot. Reviewed by David Steele. Suggested by Matthias.)
    pg-path should match the data_directory reported by PostgreSQL, which may differ from the value in postgresql.conf.
    Issue #2464Pull request #2467Commit 9ba2db0
  • Better logic for deciding when a summary should be lower-cased. (Suggested by Daniel Westermann.)
    Summaries that start with a proper name or an acronym, e.g. PostgreSQL, are no longer lower-cased in the documentation.
    Issue #2462Commit eb2f279
v2.53.1 Release Notes
PostgreSQL 17 Support
Released August 19, 2024
Bug Fixes:
  • Fix permissions when restore run as root user. (Reviewed by Stefan Fercot. Reported by Will M.)
    When restore was run as root, pg_control was owned by root. A restore as root also failed when the base path did not exist.
    Issue #2407Pull request #2416Commit 7bd8da4
  • Fix segfault on delayed connection errors. (Reviewed by David Christensen. Reported by Anton Glushakov.)
    A connection error that was delayed long enough to be reported on a later wait could cause a segfault.
    Issue #2420Pull request #2422Commit 377ba06
  • Skip local repository duplicate check for SFTP. (Fixed by Reid Thompson. Reviewed by David Steele. Reported by Anton Kurochkin.)
    The check for local repositories that are configured more than once was also applied to SFTP repositories, which are never local.
    Issue #2418Pull request #2421Commit 9840304
Improvements:
  • PostgreSQL 17 support.
    PostgreSQL 17beta3 changed the control and WAL formats, which is unusual for a beta.
    Commit 189d15d
v2.53 Release Notes
Concurrent Backups
Released July 22, 2024
IMPORTANT NOTE: The log-level-stderr option default has been changed from warn to off. This makes it easier to capture errors when only redirecting stdout. To preserve the prior behavior set log-level-stderr=warn.

NOTE TO PACKAGERS: The lz4 library is now required by the meson build.

NOTE TO PACKAGERS: Compiler support for __builtin_clzl() and __builtin_bswap64() is now required by the meson build.
Bug Fixes:
  • Fix SFTP renaming failure when file already exists. (Fixed by Reid Thompson. Reviewed by David Steele. Reported by ahmed112212.)
    Some SFTP servers report that a file already exists with an error that was not handled, so renaming a file over an existing file failed.
    Issue #2376Pull request #2377Commit d6f0bf8
Features:
  • Allow backups to run concurrently on different repositories. (Reviewed by Reid Thompson, Stefan Fercot.)
    Backups of the same stanza can now run at the same time on different repositories, since locks are now per stanza and repository instead of per stanza. This is not possible for PostgreSQL <= 9.5.
    270dce4 Refactor lock module.Pull request #2371
    cfb8aa2 Add remote locks for stanza commands missed in 31c7824a.
    edd6163 Allow backups to run concurrently on different repositories.Pull request #2389
  • Support IP-based SANs for TLS certificate validation. (Contributed by David Christensen. Reviewed by David Steele.)
    Certificates with an IP address as the subject alternative name, e.g. IP:1.2.3.4, are now validated. IPv4 and IPv6 addresses must match exactly.
    Issue #1977Pull request #2047Commit dfb620b
Improvements:
  • Default log-level-stderr option to off. (Reviewed by Greg Sabino Mullane, Stefan Fercot.)
    Warnings and errors written to stderr were often lost when only stdout was redirected while collecting logs. An explicitly set log-level-stderr is not affected.
    Pull request #2379Commit 7d54073
  • Allow alternative WAL segment sizes for PostgreSQL ≤ 10. (Contributed by Viktor Kurilko. Reviewed by David Steele.)
    PostgreSQL <= 10 can be built with a different WAL segment size, and forks such as Greenplum set it with initdb.
    Pull request #2303Commit 4ac3b82
  • Add hint to check SFTP authorization log. (Contributed by Vitalii Zurian. Reviewed by Reid Thompson, David Steele.)
    When SFTP authentication fails the error now hints that the authorization log on the server may have more detail.
    Issue #2381Pull request #2385Commit ccae609
  • Display time option defaults and allowed values with appropriate units.
    Time option defaults and allowed values were shown in seconds, which was hard to read for large values. Fractional seconds are no longer allowed, so a value such as archive-timeout=0.5 must be written as archive-timeout=500ms.
    Commit 3a2266f
  • Require OpenSSL >= 1.1.1.
    Commit cf8625d
Documentation Improvements:
  • Clarify archive-push multi-repo behavior. (Reviewed by Stefan Fercot.)
    When one repository is failing, archive-push cannot push ahead to the other repositories unless archive-async is enabled.
    Pull request #2398Commit ec3e387
v2.52.1 Release Notes
Bug Fix
Released June 25, 2024
Bug Fixes:
  • Fix issue with files larger on the replica than on the primary. (Reviewed by Stefan Fercot. Reported by Nicolas Lassimonne.)
    With block incremental, when a file was a different size on the primary than on the standby during a backup from standby, the next diff or incr backup stored the size from the primary. The backup after that failed with repo size must be > 0.
    83aaa86 Add unit tests for backup from standby with block incremental.
    aabc122 Fix issue with files larger on the replica than on the primary.Issue #2358Pull request #2367
v2.52 Release Notes
PostgreSQL 17beta1 Support
Released May 27, 2024
NOTE TO PACKAGERS: The build system for pgBackRest is now meson. The autoconf/make build will not receive any new features and will be removed after a few releases.
Features:
  • Add GCS batch delete support. (Reviewed by Reid Thompson.)
    Files are removed with batch requests instead of one request per file, which speeds up expire and other commands that remove files from the repository.
    Pull request #2326Commit 76bcb74
  • S3 SSE-C encryption support. (Reviewed by Tim Jones. Suggested by Tim Jones.)
    Set repo-s3-sse-customer-key to have S3 encrypt the data with the provided key after it is transmitted. This is not as secure as encrypting the data before it is transmitted with repo-cipher-type.
    Issue #2279Pull request #2282Commit 57731b6
  • PostgreSQL 17beta1 support. (Reviewed by Stefan Fercot.)
    Adds the catalog version and WAL magic number for PostgreSQL 17.
    Pull request #2328Commit fb22f04
Improvements:
  • Allow explicit disabling of optional dependencies in meson builds. (Contributed by Michael Schout. Reviewed by David Steele.)
    An optional feature can be disabled in the meson build even when its library is installed, as some platforms require, e.g. FreeBSD. By default a feature is enabled when its library is found.
    Pull request #2321Commit 7b95fd3
  • Dynamically find python in meson build. (Contributed by Michael Schout. Reviewed by David Steele.)
    The meson build now finds the python installation instead of requiring a python3 binary on the path, e.g. when only python3.9 is installed. The minimum meson version is now 0.47.
    55e9969 Update meson minimum version to 0.47.
    e00e33b Dynamically find python in meson build.Pull request #2338
  • Tag pgbackrest build target in meson as installable. (Contributed by Bradford Boyle. Reviewed by David Steele.)
    Pull request #2312Commit 7877983
Documentation Improvements:
  • Update start/stop documentation to reflect actual functionality. (Reviewed by Stefan Fercot.)
    Issue #2325Issue #2334Pull request #2352Commit b6ac11b
v2.51 Release Notes
Meson Build System
Released March 25, 2024
Bug Fixes:
  • Skip zero-length files for block incremental delta restore. (Reviewed by Sebastian Krause, René Højbjerg Larsen. Reported by Sebastian Krause.)
    An existing zero-length file caused a block incremental delta restore to fail in the block checksum filter. These files are now skipped, since there is nothing in them to reuse.
    Issue #2271Pull request #2272Commit f7a7ab1
  • Fix performance regression in storage list. (Reviewed by Stephen Frost. Reported by Maksym Boguk.)
    Listing a path requested detailed information for each file, which could be slow, e.g. on object stores. Only the information the list needs is now requested.
    Issue #2275Pull request #2276Commit e00bfe2
  • Fix progress logging when file size changes during backup. (Reviewed by Stephen Frost. Reported by samkingno.)
    Issue #2298Pull request #2304Commit 76956e7
Improvements:
  • Improved support for dual stack connections. (Reviewed by Stephen Frost. Suggested by Timothée Peignier.)
    When a host name resolves to more than one address, e.g. IPv4 and IPv6, the next address is tried once the prior address has had reasonable time to connect, following the happy eyeballs approach of RFC 8305. A connection attempt that neither fails nor connects no longer uses up all the available time.
    Issue #2154Pull request #2235Commit 7448fde
  • Make meson the primary build system. (Reviewed by Stephen Frost.)
    meson is now the build system used for testing and for building the documentation. Functions not used outside their module are now hidden, which makes the binary smaller.
    e3d9df3 Make meson the primary build system.Pull request #2264
    f287178 Set function/variable visibility to hidden.Pull request #2265
  • Detect files that have not changed during non-delta incremental backup. (Reviewed by Stephen Frost.)
    During a non-delta diff or incr backup, a file that fits in a single buffer, or any block incremental file, is compared to the file in the prior backup and referenced instead of stored when it has not changed.
    Pull request #2257Commit 9d91d1b
  • Prevent invalid recovery when backup_label removed. (Reviewed by Stephen Frost.)
    When backup_label is removed from a restored cluster, PostgreSQL uses the checkpoint in pg_control for crash recovery, which nearly always corrupts the cluster. Restore now invalidates the checkpoint in pg_control, so recovery fails instead. pg_controldata shows the checkpoint as 0/DEAD.
    Pull request #2232Commit e634fd8
  • Improve archive-push WAL segment queue handling. (Reviewed by Stephen Frost.)
    The size of every WAL segment in the queue was read to measure the queue. The size of the first segment is now used for all of them.
    Pull request #2277Commit cf17515
  • Limit resume functionality to full backups. (Reviewed by Stephen Frost, Stefan Fercot.)
    Resume did not work correctly for delta diff and incr backups, and a file that changed since the prior backup is likely to change again before a resume. Only full backups are resumed now.
    Pull request #2268Commit dddcbcd
  • Update resume functionality for block incremental. (Reviewed by Stephen Frost.)
    Resume removed block incremental files, so it worked but copied all of them again. Block incremental files are now kept on resume.
    Pull request #2296Commit ff47450
  • Allow --version and --help for version and help. (Reviewed by Greg Sabino Mullane. Suggested by Greg Sabino Mullane.)
    --version and --help now work as they do for most programs. Use help for help on a specific command or option.
    Pull request #2263Commit 68db307
  • Add detailed backtrace to autoconf/make build. (Reviewed by Stephen Frost.)
    Error stack traces in the autoconf/make build now include detail from libbacktrace, which performance tests showed has no noticeable cost.
    Pull request #1970Commit 676700d
Documentation Improvements:
  • Update references to recovery.conf. (Reviewed by Stefan Fercot. Suggested by Stephen Frost.)
    References to recovery.conf now include postgresql.auto.conf, which newer versions of PostgreSQL use.
    Pull request #2281Commit 6835178
v2.50 Release Notes
Performance Improvements and Bug Fixes
Released January 22, 2024
Bug Fixes:
  • Fix short read in block incremental restore. (Reviewed by Stephen Frost. Tested by Brent Graveland. Reported by Adol Rodriguez, Brent Graveland.)
    A compressed super block can end with bytes that are not needed to decompress it but mark the end of the data. Depending on how a buffer lined up with the data, these bytes were not read and the restore failed.
    Issue #2215Issue #2238Pull request #2256Commit f4a4af2
  • Fix overflow suppressing backup progress in info output. (Fixed by Robert Donovan. Reviewed by Joe Wildish.)
    The sizes in the lock file were read as 32-bit values, so the info command did not report progress for a backup larger than 4GiB.
    Issue #2251Pull request #2252Commit 25f1489
Improvements:
  • Preserve partial files during block incremental delta restore. (Reviewed by Stephen Frost.)
    A file smaller than expected was not kept for a block incremental delta restore, although its blocks can be reused, e.g. when retrying a restore that failed or restoring over a smaller file.
    Pull request #2254Commit a42614e
  • Add support for alternate compile-time page sizes. (Contributed by Viktor Kurilko. Reviewed by David Steele.)
    PostgreSQL can be built with a different page size, e.g. 4096, and forks such as Greenplum do this.
    Pull request #2197Commit 89d5278
  • Skip files truncated during backup when bundling. (Contributed by Georgy Shelkovy. Reviewed by David Steele.)
    A file truncated to zero after the files were assigned to bundles was still stored in its bundle, and a debug build failed an assertion. These files are now skipped.
    02eea55 Skip files truncated during backup when bundling.Pull request #2227
    c879509 Allow const checksum buffers to be returned from backupFile().
    9049fec Refactor skip files truncated during backup when bundling.
    Development in v2.49:
    337da35 Add test to show behavior of bundled files truncated during backup.
  • Improve SFTP storage error messages. (Contributed by Reid Thompson. Reviewed by David Steele.)
    Pull request #2249Commit 7c17eec
v2.49 Release Notes
Remove PostgreSQL 9.3 Support
Released November 27, 2023
Bug Fixes:
  • Fix regression in retries. (Reviewed by Stephen Frost. Reported by Norman Adkins, Tanel Suurhans, Jordan English, Timothée Peignier.)
    v2.48 dropped the retry that was made when an operation used up its whole timeout, so a timeout became an error, e.g. waiting for a socket to be writable on an object store. Two retries are now made even when the timeout has expired.
    3c116e1 Remove unused header.
    fa5b2d4 Fix regression in retries.Issue #2200Issue #2214Pull request #2221
  • Fix recursive path remove in SFTP storage driver. (Fixed by Reid Thompson. Reviewed by Stephen Frost. Reported by Luc.)
    Some SFTP servers report permission denied instead of a failure when a directory is unlinked as a file, so removing a path recursively failed on those servers.
    Issue #2219Pull request #2226Commit c4dc466
Improvements:
  • Remove support for PostgreSQL 9.3. (Reviewed by Stephen Frost.)
    PostgreSQL 9.3 is no longer supported, per the policy of supporting five end-of-life versions of PostgreSQL.
    Pull request #2220Commit dcf0781
Documentation Features:
  • Document maintainer options. (Reviewed by Stefan Fercot.)
    Maintainer options are now documented in their own section with the caveats for using them, and pg-version-force is no longer internal.
    Pull request #2202Commit 21c8c8a
  • Update point-in-time recovery documentation for PostgreSQL >= 13.
    Since PostgreSQL 13 recovery errors when the recovery target is not reached. The point-in-time recovery section now works for PostgreSQL 13 and later as well as for earlier versions.
    Commit eb69e2e
Test Suite Improvements:
  • Allow config/load unit test to run without libssh2 installed. (Contributed by Reid Thompson. Reviewed by David Steele. Suggested by Wu Ning.)
    Issue #2193Pull request #2194Commit e2b734e
v2.48 Release Notes
Repository Storage Tags
Released September 25, 2023
Bug Fixes:
  • Fix issue restoring block incremental without a block list. (Reviewed by Stephen Frost. Tested by Burak Yurdakul. Reported by Burak Yurdakul.)
    A block map with no blocks, which is written when a file timestamp changes but the file does not, was not decrypted when it followed a file stored without block incremental in the same bundle read. With enough affected files the retries were exhausted and the restore failed.
    Issue #2182Pull request #2184Commit 31de127
Features:
  • Add --repo-storage-tag option to create object tags. (Reviewed by Stephen Frost, Stefan Fercot, Timothée Peignier.)
    Set repo-storage-tag to add tags to the objects written to an S3, GCS, or Azure repository. Tags are set for each repository.
    Issue #2150Pull request #2159Commit 1b4e0cc
  • Add known hosts checking for SFTP storage driver. (Contributed by Reid Thompson. Reviewed by Stephen Frost, David Steele.)
    SFTP host keys are now checked against the known hosts files by default, i.e. repo-sftp-host-key-check-type=strict. Set repo-sftp-host-key-check-type=accept-new to add new hosts automatically, or repo-sftp-host-key-check-type=none to skip the check as before.
    Pull request #2125Commit ce9ba0f
  • Support for dual stack connections. (Reviewed by Stephen Frost.)
    Each address a host name resolves to is now tried in turn, e.g. an IPv6 address with no route to the host and then an IPv4 address, until one connects or the timeout expires. Repeated retry errors are also summarized in error messages.
    5314dbf Adjust Wait object to be more accurate when nested.
    c180513 Aggregate error retries in ErrorRetry output.
    edbd520 Refactor address list lookup to include all returned addresses.Pull request #2174
    39bb8a0 Support for dual stack connections.Issue #2154Pull request #2175
  • Add backup size completed/total to info command JSON output. (Contributed by Stefan Fercot. Reviewed by David Steele.)
    The JSON output of the info command now includes the completed and total size of a backup in progress, so progress can be monitored by other programs.
    Issue #2007Pull request #2141Commit e3fcd8c
Improvements:
  • Multi-stanza check command. (Reviewed by Stephen Frost.)
    When stanza is not specified, the check command now checks every stanza in the configuration.
    Pull request #2057Commit 1141dc2
  • Retry reads of pg_control until checksum is valid. (Reviewed by Stefan Fercot, Stephen Frost.)
    On some filesystems, e.g. ext4, a read of pg_control during a concurrent write can return torn data. The read is now retried until the checksum is valid.
    Pull request #2131Commit f42d927
  • Optimize WAL segment check after successful backup. (Reviewed by Stephen Frost.)
    The check for WAL segments after a backup listed the storage once for each segment. Each WAL directory is now listed once and the list is reused.
    Pull request #2169Commit 9d3a605
  • Improve GCS multi-part performance. (Reviewed by Reid Thompson.)
    Chunks of a multi-part upload are now uploaded as soon as they are available.
    Pull request #2162Commit 6cb9c40
  • Allow archive-get command to run when stanza is stopped. (Reviewed by Tom Swartz, David Christensen, Reid Thompson.)
    The archive-get command does not write to the repository, so it can now run while the stanza is stopped, as restore can.
    Commit fbd992a
  • Accept leading tilde in paths for SFTP public/private keys. (Contributed by Reid Thompson. Reviewed by David Steele.)
    Paths for repo-sftp-private-key-file and repo-sftp-public-key-file may now begin with ~, as documented.
    Pull request #2136Commit eb32d6d
  • Reload GCS credentials before renewing authentication token. (Reviewed by Stephen Frost. Suggested by Daniel Farina.)
    The service key file is now read again before the authentication token is renewed, so the key can be replaced while a command is running.
    Pull request #2072Commit 995a8e9
Documentation Bug Fixes:
  • Fix configuration reference example for the tls-server-address option. (Fixed by Hartmut Goebel. Reviewed by David Steele.)
    The example ::* was not valid. Use * for IPv4 or :: for IPv6.
    Pull request #2165Commit 43524a4
  • Fix command reference example for the filter option.
    Commit cb3ff6e
Test Suite Improvements:
  • Allow storage/sftp unit test to run without libssh2 installed. (Contributed by Reid Thompson. Reviewed by David Steele. Suggested by Wu Ning.)
    Issue #2163Pull request #2177Commit c3c0834
v2.47 Release Notes
Performance Improvements and Bug Fixes
Released July 24, 2023
Bug Fixes:
  • Preserve block incremental info in manifest during delta backup. (Reviewed by Stephen Frost. Reported by Francisco Miguel Biete Banon.)
    When a file changed so that it would not use block incremental if it were new, e.g. it shrank below the block incremental limit or its timestamp moved far enough into the past, its block incremental info was lost from the manifest of a delta backup even though the file could still be referenced to the prior backup.
    1d42aed Improve validation of referenced files in command/backup unit test.
    4c27d74 Preserve block incremental info in manifest during delta backup.Issue #2112Pull request #2123
  • Fix block incremental file names in verify command. (Reviewed by Reid Thompson. Reported by Francisco Miguel Biete Banon.)
    The verify command used the compression extension instead of .pgbi for block incremental files stored outside a bundle, so it could not find them.
    Issue #2112Pull request #2120Commit cdb7e26
  • Fix spurious automatic delta backup on backup from standby. (Reviewed by Stephen Frost. Reported by krmozejko, Don Seiler.)
    File sizes on the standby can differ from the primary, e.g. for free space maps, so the next incremental backup could see a size change on the primary and switch to a checksum delta, which can take much longer. The original size is now kept in the manifest and used for the comparison.
    Issue #2020Pull request #2124Commit 5ed6f8d
  • Skip recovery.signal for PostgreSQL >= 12 when recovery type=none. (Reviewed by Stefan Fercot. Reported by T.Anastacio.)
    With type=none, recovery.signal is no longer written for PostgreSQL >= 12, which matches the behavior for earlier versions.
    Issue #2062Pull request #2070Commit 9cceed6
  • Fix unique label generation for diff/incr backup. (Fixed by Andrey Sokolov. Reviewed by David Steele.)
    With at least two full backups and the latest expired, a diff or incr backup failed as if the clock had gone backward, because its label was compared with the label of the expired full backup.
    Issue #1873Pull request #2104Commit 0ac0934
  • Fix time-based archive expiration when no backups are expired. (Reviewed by Stefan Fercot.)
    When time-based retention was met but no backups were expired, archive was not expired and time-based archive retention not met was logged. One more backup was then needed to expire the earlier WAL.
    Issue #2103Pull request #2109Commit 762498f
Improvements:
  • Improve performance of SFTP storage driver. (Contributed by Stephen Frost, Reid Thompson. Reviewed by David Steele.)
    The SFTP storage driver waited for a fixed time when libssh2 could not continue. It now waits until the socket can be read or written.
    e280ed9 Make result code handling in storage/sftp more consistent.
    125676a Cleanup of init/handshake in storageSftpNew().
    28b6b2d Improve performance of SFTP storage driver.Pull request #2089
  • Add timezone offset to info command date/time output. (Reviewed by Stefan Fercot, Philip Hurst. Suggested by Philip Hurst.)
    Timestamps in the info command output now include the timezone offset, so they can be used directly as a recovery target, e.g. with --target.
    9efd5cd Add timezone offset to info command date/time output.Issue #2093Pull request #2095
    aa229a1 Modify time_t casts based on complaints from Coverity.
  • Centralize error handling for unsupported features. (Reviewed by Stefan Fercot.)
    Errors for features that were not compiled in, e.g. lz4, are now more detailed and consistent. Specifying SFTP storage when it was not compiled in no longer fails an assertion.
    de46276 Refactor allow list processing in config/parse module.
    36ff81d Centralize error handling for unsupported features.Pull request #2075
Documentation Improvements:
  • Clarify preference to install from packages in the user guide. (Reviewed by Stefan Fercot. Suggested by dr-kd.)
    Pull request #2090Commit a36f480
v2.46 Release Notes
Block Incremental Backup and SFTP Storage
Released May 22, 2023
Features:
  • Block incremental backup. (Reviewed by John Morris, Stephen Frost, Stefan Fercot.)
    Block incremental stores only the parts of a file that changed since the prior backup, which saves space and time in diff and incr backups of large files. Enable it with repo-block, which requires repo-bundle.
    dd4e526 Removing chunking and block numbers from incremental block list.Pull request #2029
    822f2a5 Finalize block incremental feature.Pull request #2053
  • SFTP support for repository storage. (Contributed by Reid Thompson. Reviewed by Stephen Frost, David Steele.)
    Set repo-type=sftp and repo-sftp-host to store the repository on an SFTP server.
    Pull request #1959Commit 87087fa
    Development in v2.42:
    01b81f9 Move link creation to storage interface.Pull request #1879
  • PostgreSQL 16 support. (Reviewed by Stefan Fercot.)
    Adds the catalog version and WAL magic number for PostgreSQL 16.
    Pull request #2051Commit 3fc3690
Improvements:
  • Allow page header checks to be skipped. (Reviewed by David Christensen. Suggested by David Christensen.)
    The page header checks made while verifying page checksums can report false errors for encrypted pages. Set page-header-check=n to skip them. They are enabled by default.
    Pull request #2045Commit f5e6bc2
  • Avoid chown() on recovery files during restore. (Reviewed by Stefan Fercot, Marcelo Henrique Neppel. Suggested by Marcelo Henrique Neppel.)
    Restore skipped chown() for restored files that already had the right owner but not for the recovery files it writes. The Posix driver now also skips chown() when the owner is already correct.
    Issue #2036Pull request #2038Commit 3ff88ff
  • Add error retry detail for HTTP retries.
    An error after HTTP retries now reports how many retries were made and for how long.
    801e396 Move error modules to common/error directory.
    df419b3 Improve retry error messages.
    f33e1cf Add error retry detail for HTTP retries.
Documentation Improvements:
  • Add warning about using recovery type=none. (Reviewed by Stefan Fercot.)
    Recovery type=none does not increment the timeline at the end of recovery, which can cause PostgreSQL to archive duplicate WAL that is rejected and fills the disk, and can make tools like pg_rewind fail or corrupt the cluster. The documentation now warns against it.
    Issue #2062Pull request #2069Commit a28b72c
  • Add note about running stanza-create on already-created repositories.
    Stanzas that already exist are skipped, so stanza-create is safe to run again, e.g. after a new repository is configured.
    Commit 0c1f823
v2.45 Release Notes
Block Incremental Backup (BETA)
Released March 20, 2023
Bug Fixes:
  • Skip writing recovery.signal by default for restores of offline backups. (Reviewed by Stefan Fercot. Reported by Marcel Borger.)
    On PostgreSQL >= 12, recovery.signal makes PostgreSQL fail to start when the backup was made offline with wal_level=minimal. Restore now skips writing it for offline backups unless type is set explicitly, e.g. for Point-in-Time Recovery from an offline backup made with a higher wal_level.
    0818601 Set online flag in manifest in command/restore unit tests.
    2fa7e53 Skip writing recovery.signal by default for restores of offline backups.Issue #2018Pull request #2019
Features:
  • Block incremental backup (BETA). (Reviewed by John Morris, Stephen Frost, Stefan Fercot.)
    Block incremental stores only the parts of a file that changed since the prior backup instead of the entire file. Enable it with repo-block, which requires repo-bundle. The feature is in beta and also requires the beta option. Do not use it in production: the on-disk format will change before the GA release.
    089fae0 Add block incremental to real/all test output.
    3feed38 Improve IoChunkedRead end-of-file handling.
    d520816 Remove parameter list from deltaMapNew().
    779efe0 Consistently declare block incremental size as size_t.
    dffc933 Rename DeltaMap to BlockHash.
    a9867cb Add repo-block-age-map and repo-block-size-map options.
    16ac5ee Rename block incremental manifest keys.
    da91858 Add optional raw format for compression types.
    7e5adc0 Use raw compression/encryption to bundling and block incremental backup.
    8b5153a Block-level incremental backup super blocks.Pull request #1996
    210bed4 Use xxHash instead of SHA-1 for block incremental checksums.
    6252c0e Exclude backup set size from info for block incremental backups.
    1119a53 Rename BlockHash to BlockChecksum.
    6b409d0 Update default block size and super block values based on testing.
    1281a6e Ensure no continuations when block size equals super block size.
    5c1f78d Fix typo in blockIncrProcess().
    c30d3e4 Block incremental map fixes and improvements.Pull request #2026
    24f7252 Add beta feature infrastructure.
    04d224b Add beta feature and documentation for block incremental backup.
    Development in v2.44:
    912eec6 Block-level incremental backup.Issue #959Issue #1806Issue #1913Pull request #1916
    Development in v2.42:
    1ea6a41 Improve manifest file updates.Pull request #1888
    c647bcb Add manifest flags for file processing during backup.Pull request #1889
    102ce5d Add persistent reference list to manifest.Pull request #1890
    ac99201 Add bufferSize to cvtUInt64FromVarInt128() to further limit reads.
    5602f17 Add varint-128 encode/decode to IoRead/IoWrite.Pull request #1891
    352cbf1 Update ManifestFile booleans to bit fields.
    e7e106f Use read-only storage to calculate checksum in restoreFile().
    909be41 Swap command/backup and command/restore unit tests.
    1730ef4 Add noTruncate flag to storageNewWriteP().Pull request #1898
    fee38c2 Pass filters to remote storage as a handler array.
    5fceee8 Add backupFileRepoPathP().
    221db61 Shorten names in real/all integration test matrix.
    c9db7bc Update cipherBlockNew() to allow optional parameters.
    58b3c91 Add raw mode to CipherBlock to save space.
Improvements:
  • Keep only one all-default group index. (Reviewed by Stefan Fercot.)
    An option that does not apply, e.g. repo2-s3-key when repo2-type is not s3, could add a phantom repository that has only default values. Repository and PostgreSQL indexes with only default values are now removed unless no other index remains.
    Pull request #2011Commit 1648c13
Documentation Improvements:
  • Add explicit instructions for upgrading between 2.x versions. (Contributed by Christophe Courtois. Reviewed by David Steele.)
    A new user guide section explains that upgrading between 2.x versions requires only installing the new binaries. Downgrading is also possible when no features unsupported by the older version were used.
    Issue #1774Pull request #1993Commit 15d5dcd
  • Remove references to SSH made obsolete when TLS was introduced.
    The help for repo-host, pg-host, and their port options no longer refers to SSH as the only remote protocol. Details about SSH compression were also removed.
    Commit c5907a2
v2.44 Release Notes
Remove PostgreSQL 9.0/9.1/9.2 Support
Released January 30, 2023
Improvements:
  • Remove support for PostgreSQL 9.0/9.1/9.2. (Reviewed by Stefan Fercot.)
    pgBackRest now supports ten versions of PostgreSQL: the five supported versions and the last five EOL versions. As of PostgreSQL 15 that excludes 9.0, 9.1, and 9.2.
    Pull request #1941Commit 77c721e
  • Restore errors when no backup matches the current version of PostgreSQL. (Contributed by Stefan Fercot. Reviewed by David Steele. Suggested by Soulou.)
    After a stanza-upgrade with no new backup, restore used the latest backup, which was made from the prior PostgreSQL version. Replicas built this way could fail. Restore now errors in this case unless set or type=time/type=lsn is specified.
    Issue #1942Pull request #1967Commit b9be4fa
  • Add compress-level range checking for each compress-type. (Reviewed by Stefan Fercot. Suggested by gkleen, ViperRu.)
    The compress-level range was 0-9 for every compress-type. This is the range for gz but a subset of what lz4 and zst allow. Each type now has its own range, e.g. -7 to 22 for zst.
    Issue #1216Issue #1931Pull request #1962Commit 44da314
Documentation Improvements:
  • Add warning about enabling hierarchical namespace on Azure storage. (Reviewed by Stefan Fercot. Suggested by Vojtech Galda, Pluggi, asjonos.)
    With hierarchical namespace enabled, Azure requires directories to be deleted separately and expire fails. The user guide now warns not to enable it.
    Issue #1770Pull request #1980Commit 3aea997
  • Add replacement for linefeeds in monitoring example. (Reviewed by Stefan Fercot. Suggested by rudonx, gmustdie, Ivan Shelestov.)
    The monitoring example failed when info output contained a linefeed, e.g. in some error messages, because COPY converts \n to a linefeed that jsonb rejects. The example now replaces linefeeds before converting to jsonb.
    Issue #1910Pull request #1963Commit ae258f6
  • Clarify target-action behavior on various PostgreSQL versions. (Contributed by Chris Bandy. Reviewed by David Steele, Anton Kurochkin, Stefan Fercot. Suggested by Anton Kurochkin, Chris Bandy.)
    The effect of pause depends on hot_standby and the PostgreSQL version. With hot_standby=off, pause acts like shutdown on PostgreSQL >= 12 and like promote on earlier versions.
    Issue #987Issue #1314Pull request #1960Commit 84a3ff8
  • Updates and clarifications to index page. (Reviewed by Stefan Fercot.)
    The section about other backup solutions not supporting parallel processing was no longer accurate and has been reworded. Other sections were updated for current terminology and clarity.
    Pull request #1966Commit 36ee30d
  • Add dark mode to the website. (Suggested by Stephen Frost.)
    The website uses dark colors when the browser prefers a dark color scheme.
    Commit ed818b3
v2.43 Release Notes
Bug Fix
Released November 28, 2022
Bug Fixes:
  • Fix missing reference in diff/incr backup. (Reviewed by Stefan Fercot. Reported by Marcel Borger, ulfedf, jaymefSO.)
    In v2.42 a diff or incr backup failed with unable to find '...' in string list when its prior backup was made by an earlier version. The reference list built for a manifest from an earlier version now includes the backup's own label.
    28f6604 Move manifestBackupLabelSet() test in info/manifest unit.
    c4bf775 Fix missing reference in diff/incr backup.Issue #1933Pull request #1935
Improvements:
  • Add hint when an option is specified without an index. (Reviewed by Stefan Fercot.)
    An option that requires an index, e.g. repo-storage-ca-file, now errors with a hint that shows the indexed name, e.g. repo1-storage-ca-file. A deprecated option also gets a hint with its current name.
    Issue #1925Pull request #1929Commit 3f363cb
v2.42 Release Notes
Bug Fixes
Released November 22, 2022
Bug Fixes:
  • Fix memory leak in file bundle backup/restore. (Reviewed by John Morris. Tested by Oscar. Reported by Oscar.)
    Restore freed some I/O objects for bundled files only after every file in the bundle was restored. With many small files in a bundle, memory use grew until restore failed with unable to allocate. Backup had a similar, smaller leak when resuming.
    Issue #1877Pull request #1878Commit cd8db7d
  • Fix protocol error on short read of remote file. (Reviewed by Stephen Frost.)
    A remote file read that stopped early or failed partway left the protocol in a bad state. The next command failed with client state is 'data-get' but expected 'idle' and the original error was lost. The rest of the file is now read when the file is closed.
    ea162e8 Move storageReadRemoteOpen() in storage/remote/read module.
    7967c75 Fix protocol error on short read of remote file.Pull request #1900
Improvements:
  • Do not store references for zero-length files when bundling. (Reviewed by Stefan Fercot.)
    Bundled diff/incr backups stored a reference to a prior backup for zero-length files, which are not stored in any backup. The reference was ignored on restore but used space in the manifest.
    Pull request #1887Commit f981fb4
  • Use more generic descriptions for pg_start_backup()/pg_stop_backup(). (Reviewed by Greg Sabino Mullane, David Christensen. Suggested by Greg Sabino Mullane.)
    PostgreSQL 15 renamed these functions to pg_backup_start()/pg_backup_stop(). The logs and documentation now use descriptions that do not depend on the PostgreSQL version.
    Pull request #1901Commit ddd966c
Test Suite Improvements:
  • Update test.pl --psql-bin option to match command-line help. (Contributed by Koshi Shibagaki. Reviewed by David Steele.)
    The help showed --psql-bin but the option was named --pgsql-bin. The option now has the name shown in the help.
    Pull request #1920Commit 3ad5884
v2.41 Release Notes
Backup Annotations
Released September 19, 2022
Bug Fixes:
  • Fix incorrect time expiration being used for non-default repositories. (Reviewed by Stefan Fercot. Reported by Adam Brusselback.)
    When expire ran without repo, the time-based repo-retention-full for every repository was read from the lowest-numbered repository. Each repository now uses its own value.
    Issue #1852Pull request #1854Commit eda7f81
  • Fix issue when listing directories recursively with a filter. (Reviewed by Stephen Frost. Reported by Efremov Egor.)
    repo-ls with recurse and filter could fail with a double free or segfault when the last entry in a directory was a directory that had entries. A parent list was freed before the entries of its subdirectories were processed.
    Issue #1870Pull request #1871Commit c39c9f2
Features:
  • Backup key/value annotations. (Contributed by Stefan Fercot. Reviewed by David Steele. Suggested by Adam Berlin.)
    Add key/value annotations to a backup with the annotation option of the backup command, and add, modify, or remove them later with the new annotate command. The info command shows annotations in text output when set is specified and always includes them in JSON output.
    Issue #1709Pull request #1724Commit 381fd0a
Improvements:
  • Support --set in JSON output for info command. (Contributed by Stefan Fercot. Reviewed by David Steele. Suggested by Anton Kurochkin.)
    With set, JSON output from info now includes the details that text output already showed, e.g. the error and tablespace lists.
    Issue #1484Pull request #1501Commit db75ffd
  • Allow upload chunk size to be configured for object stores. (Reviewed by Stefan Fercot. Suggested by Anton Glushakov.)
    Set repo-storage-upload-chunk-size to change the size of each upload chunk for S3, GCS, or Azure. Larger chunks can improve performance but use more memory. The defaults are unchanged.
    ff1188f Allow quote tag in command-line help.
    b05d31f Allow upload chunk size to be configured for object stores.Issue #1843Pull request #1847
  • Update archive.info timestamps after a successful backup. (Reviewed by Stefan Fercot. Suggested by Alex Richman.)
    archive.info and its copy were written only by stanza-create and stanza-upgrade, and an object store lifecycle policy that expires old files could remove them. Their timestamps are now updated after each successful backup.
    Issue #1853Pull request #1855Commit 3b5df1e
  • Move standby timeline check after checkpoint. (Reviewed by Stefan Fercot. Tested by Keith Fiske. Suggested by Keith Fiske.)
    The check that the standby is on the expected timeline used pg_control as it was before the backup started. Right after a promotion the standby may not have written the new timeline to pg_control yet, and the backup failed with standby is on timeline ... but expected .... The check now runs after the checkpoint.
    Issue #1816Pull request #1819Commit c267ba5
  • Improve warning message on backup resume. (Suggested by Cynthia Shang.)
    The warning read as if the user needed to take action. It now states that invalid files will be removed and then the backup will resume.
    Commit cbbe93f
Documentation Improvements:
  • Add absolute path for kill in pgbackrest.service. (Suggested by Don Seiler.)
    The pgbackrest.service example now uses /bin/kill in ExecReload. Older versions of systemd require an absolute path.
    Commit e9ff524
v2.40 Release Notes
OpenSSL 3 Support
Released July 18, 2022
NOTE TO PACKAGERS: An experimental meson build has been added but packagers should continue to use the autoconf/make build for the foreseeable future.
Improvements:
  • OpenSSL 3 support. (Reviewed by Stephen Frost.)
    pgBackRest now builds with OpenSSL 3. Deprecation warnings are suppressed, and an unexpected EOF is detected with the error codes that OpenSSL 3 reports.
    Pull request #1767Commit 08242ee
  • Create snapshot when listing contents of a path. (Reviewed by John Morris, Stephen Frost.)
    A path listed without sorting was read while its entries were processed. When files were deleted during the listing, some filesystems skipped files that still existed and the path could not be removed. Listings now always use a snapshot of the path.
    61ca9b5 Replace hrnStorageInfoListCallback() with TEST_STORAGE_LIST() in tests.
    1c0bf0b Reorder null user/group checks in remote protocol and add tests.
    72960bb Rename strTrunc() to strTruncIdx() and add strTrunc().
    75623d4 Create snapshot when listing contents of a path.Issue #1754Pull request #1805
  • Force target-timeline=current when restore type=immediate. (Reviewed by Stephen Frost.)
    On PostgreSQL >= 12 the default target timeline is latest, and recovery could fail when the latest timeline in the repository cannot be reached from the backup. Restore with type=immediate does not change timelines, so it now sets the target timeline to current.
    Pull request #1814Commit 364af16
  • Truncate files during delta restore when they are larger than expected. (Reviewed by Stephen Frost.)
    Delta restore copied a file from the repository whenever its size differed from the manifest. A larger file is now truncated to the size in the manifest and copied only when its checksum does not match. Files that were only appended to, e.g. logs, are no longer copied.
    Pull request #1758Commit 7ec51e7
  • Disable incremental manifest save when resume=n. (Contributed by Reid Thompson. Reviewed by David Steele.)
    During a backup the manifest is saved periodically for use by resume. These saves are now skipped when resume=n.
    Pull request #1760Commit 60d70fa
  • Set backup percent complete to zero before copy start. (Contributed by Reid Thompson. Reviewed by David Steele.)
    The progress of a running backup was not reported until the first file was copied. It is now set to zero when copying starts.
    Pull request #1759Commit 38ad283
  • Use S3 IsTruncated flag to determine list continuation. (Reviewed by John Morris. Tested by Soulou. Suggested by Christian Montagne.)
    Recent versions of Scality send an empty NextContinuationToken when a list is not truncated, which caused an infinite loop. The IsTruncated flag now determines whether a list continues, and a missing or empty token for a truncated list is an error.
    Issue #1748Pull request #1783Commit 845d82f
Documentation Bug Fixes:
  • Skip internal options in the configuration reference. (Reported by Francisco Miguel Biete Banon.)
    Options that are internal only for some commands were listed in the configuration reference. The command-line help was not affected.
    Commit 2643050
Documentation Improvements:
  • Add link to PostgreSQL configuration in repository host section. (Reviewed by Stefan Fercot. Suggested by Julien Cigar.)
    Pull request #1809Commit 74a4ac8
Test Suite Improvements:
  • Add experimental Meson build. (Reviewed by Eli Schwartz, Sam Bassaly.)
    Meson has simpler syntax and better performance than autoconf/make. It is used for code generation and test builds, and errors on anything but a debug build. Packagers should continue to use autoconf/make.
    2feaaea Add .inc extension to C files included in other C files.
    b8fc20d Add experimental Meson build.Pull request #1765
    665da12 Update meson.build include comment to be more general.
    9fd85a1 Disable meson for all but debug builds.
    59f148b Generate -fmacro-prefix-map to strip relative path from __FILE__.
    0eccbc8 Meson builds work on version 0.45.
  • Allow any path to be passed to the --test-path option. (Contributed by Andrey Sokolov. Reviewed by David Steele.)
    Pull request #1764Commit 29b2a54
  • Fix compile error when DEBUG_EXEC_TIME is defined without DEBUG. (Contributed by Andrey Sokolov. Reviewed by David Steele.)
    Without DEBUG the ASSERT() that used the start time expanded to nothing, and the unused variable caused a compile error. The check now uses CHECK().
    Pull request #1775Commit 1a00ab1
v2.39 Release Notes
Verify and File Bundling
Released May 16, 2022
Bug Fixes:
  • Fix error thrown from FINALLY() causing an infinite loop. (Reviewed by Stephen Frost.)
    An error thrown in a FINALLY() block returned to the same block, where the error was likely thrown again and caused an infinite loop. FINALLY() now runs only once.
    9a271e9 Fix error thrown from FINALLY() causing an infinite loop.Pull request #1732
    ef4c4ab Use variable instead of function to track FINALLY() state.Pull request #1744
  • Error on all lock failures except another process holding the lock. (Reviewed by Reid Thompson. Tested by Geir Råness. Reported by Geir Råness.)
    archive-get/archive-push did not error when the lock could not be taken for another reason, e.g. permissions, and the async process was not launched. The user got a generic failure message and there was no async log. These failures are now errors.
    Issue #1722Pull request #1730Commit 9629908
Features:
  • Backup file bundling for improved small file support. (Reviewed by Reid Thompson, Stefan Fercot, Chris Bandy.)
    Bundling stores small files together in the repository to save time and space during backup, especially on object stores where creating each file is expensive. Enable it with repo-bundle and tune it with repo-bundle-size and repo-bundle-limit. Restore reads adjacent files in a bundle with a single read.
    4d2fef1 Remove redundant restoreFile() test and improve coverage.
    5141370 Add limit parameter to ioCopyP().
    dca6da8 Optimize restore command for file bundling.Issue #1149Pull request #1683
    0054677 Add bundle logging to backup command.
    3f66f42 Rename bundle-* options to repo-bundle-*.Pull request #1694
    fe9fd2f Disable repo-hardlink option when repo-bundle option is enabled.
    424008d Allow files that become zero-length after the backup manifest is built.
    f405fc6 Backup file bundling documentation.Pull request #1740
    Development in v2.38:
    a79034a Add read range to all storage drivers.Pull request #1619
    b791f1c Implement restore ownership without updating manifest internals.
    f84909f Fix issue with Posix read offset handling after an error.
    4ca0590 Refactor backupProcessQueue() to use BackupJobData struct.
    16559d9 Use the PG_FILE_POSTMTRPID constant where appropriate.
    8c062e1 Remove primary flag from manifest.Pull request #1630
    b0db4b8 Simplify base path mode in mock/all integration tests.
    4a73a02 Simplify manifest defaults.Pull request #1631
    575ae77 Convert varNewUInt64() to VARUINT64() where possible in manifest.
    61ce586 Pack manifest file structs to save memory.Pull request #1626
    ca13f11 Optimization for jsonFromStrInternal().
    e4df5b7 Simplify manifest file defaults.Pull request #1632
    7dd657b Simplify filename construction in command/verify module.
    34d6495 Bundle files in the repository during backup.Issue #1149Pull request #1655
    efc09db Limit files that can be bundled.Issue #1149Pull request #1662
    e6e1122 Pass file by reference in manifestFileAdd().
  • Verify command to validate the contents of a repository. (Contributed by Cynthia Shang, Reid Thompson. Reviewed by David Steele, Stefan Fercot.)
    The verify command checks that the backups and WAL in the repository are valid. Set output=text to print the results and verbose to include what was verified successfully along with errors.
    Pull request #1607Commit 65d22e4
  • PostgreSQL 15 support. (Reviewed by Stefan Fercot.)
    PostgreSQL 15 removes exclusive backup, renames the backup start/stop functions, and drops pg_database.datlastsysoid, which pgBackRest no longer uses.
    692fe49 Remove dependency on pg_database.datlastsysoid.Pull request #1735
    20782c8 PostgreSQL 15 support.Pull request #1736
  • Show backup percent complete in info output. (Contributed by Reid Thompson. Reviewed by David Steele.)
    info shows the percent complete of a running backup on the host where the backup is running. JSON output reports it as an integer, the percent times 100.
    d9088b2 Show backup percent complete in info output.Issue #1490Pull request #1621
    a6b1adb Remove extraneous linefeed when writing a lock file.
    Development in v2.38:
    22734eb Add ioBufferReadNewOpen() and ioBufferWriteNewOpen().
    9b2f10d Refactor lock code.Pull request #1643
  • Auto-select backup for restore command --type=lsn. (Contributed by Reid Thompson. Reviewed by Stefan Fercot, David Steele.)
    With type=lsn, restore now selects the most recent backup that stopped at or before the target LSN.
    08d9e26 Refactor target type checking for clarity in restore module.
    d8d4132 Auto-select backup for restore command --type=lsn.Pull request #1706
    ea4d73f Fix ordering of backup-lsn-stop field in command/restore unit test.
  • Suppress existing WAL warning when archive-mode-check is disabled. (Contributed by Reid Thompson. Reviewed by David Steele.)
    With archive-mode-check=n and WAL pushed from multiple hosts, a WAL file already in the archive with the same checksum is expected and no longer logs a warning. A different checksum is still an error.
    Pull request #1711Commit aad7171
  • Add AWS IMDSv2 support. (Contributed by Nuno Pires. Reviewed by David Steele.)
    IMDSv2 protects the instance metadata that provides credentials for repo-s3-key-type=auto. pgBackRest falls back to IMDSv1 when the IMDSv2 token request fails.
    Issue #1685Pull request #1691Commit 21cef09
Improvements:
  • Allow repo-hardlink option to be changed after full backup. (Reviewed by Reid Thompson.)
    Changing repo-hardlink required a new full backup. It can now be changed at any time, e.g. to disable it for file bundling.
    Pull request #1699Commit 7afaac0
  • Increase precision of percent complete logging for backup and restore. (Contributed by Reid Thompson. Reviewed by David Steele.)
    Percent complete is now logged with hundredths, which gives more frequent updates for large backups and restores.
    Pull request #1679Commit 330e199
  • Improve path validation for repo-* commands. (Contributed by Reid Thompson. Reviewed by David Steele.)
    A path may not contain //, a trailing / is removed, and an absolute path must be in the repository path.
    5ae84d5 Improve path validation for repo-* commands.Pull request #1697
    19dd015 Fix issues in improved path validation for repo-* commands.Pull request #1751
  • Improve stop command to honor stanza option. (Contributed by Reid Thompson. Reviewed by David Steele. Suggested by ragaoua.)
    stop with force and stanza now terminates only the processes holding locks for that stanza. Before, it terminated processes for all stanzas.
    Issue #1608Pull request #1676Commit f7ab002
  • Improve error message for invalid repo-azure-key. (Contributed by Reid Thompson. Reviewed by David Steele. Suggested by Seth Daniel.)
    With repo-azure-key-type=shared, repo-azure-key is now checked for valid base64.
    Issue #1686Pull request #1688Commit 7c9208b
  • Add hint to check the log on archive-get/archive-push async error. (Reviewed by Reid Thompson.)
    When the async process cannot write its status files, archive-get/archive-push times out with a generic error. The error now includes a hint with the path of the async log, which contains the actual error.
    Issue #1722Commit 03c71aa
  • Add ClockError for unexpected clock skew and timezone changes. (Reviewed by Greg Sabino Mullane, Stefan Fercot. Suggested by Greg Sabino Mullane.)
    Pull request #1739Commit 5f8c9cd
  • Strip extensions from history manifest before showing in error message. (Reviewed by Stefan Fercot.)
    When a new backup label was not later than the latest label from the backup history, the error showed the history manifest name, e.g. 20220504-222042F_20220504-222141I.manifest.gz. It now shows only the label.
    Pull request #1738Commit b6bfd9f
  • Add user:group to lock permission error. (Reviewed by Reid Thompson.)
    Issue #1722Commit 0055fa4
  • Add hint when unable to find the primary cluster.
    The unable to find primary cluster error now includes a hint asking whether all available clusters are in recovery.
    Commit 46b7b72
Documentation Bug Fixes:
  • Fix incorrect reference to stanza-update in the user guide. (Fixed by Abubakar Mohammed. Reviewed by David Steele.)
    Commit 3dd7960
  • Fix example for repo-gcs-key-type option in configuration reference. (Reviewed by Reid Thompson.)
    The example was none, which is not a valid value. It is now auto.
    Commit 166039c
  • Fix tls-server-auth example and add clarifications. (Reviewed by Reid Thompson.)
    The example was missing the client CN and is now client-cn=stanza1. The help also states that wildcards are not allowed for the client CN.
    Commit c222ce1
Documentation Improvements:
  • Simplify messaging around supported versions in the documentation. (Reviewed by Stefan Fercot, Reid Thompson, Greg Sabino Mullane.)
    The user guides listed PostgreSQL version ranges, which made it look like other versions were not supported, e.g. PostgreSQL 12 on RHEL. The ranges were removed and the introduction now explains which versions the user guides cover.
    Pull request #1742Commit eefa0b1
  • Add option type descriptions. (Contributed by Reid Thompson. Reviewed by David Steele.)
    The configuration reference now describes each option type, e.g. the units for size options, rather than repeating the description for each option.
    Pull request #1747Commit a913113
  • Add FAQ about backup types and restore speed. (Contributed by David Christensen. Reviewed by Reid Thompson.)
    A new FAQ explains that the backup type affects only the backup and not how fast a restore runs.
    Pull request #1731Commit 50d409a
  • Document required base branch for pull requests. (Contributed by David Christensen. Reviewed by Reid Thompson.)
    The contributing guide now states that pull requests must be based on the integration branch.
    Pull request #1733Commit cc5b061
v2.38 Release Notes
Minor Bug Fixes and Improvements
Released March 6, 2022
IMPORTANT NOTE: Repository size reported by the info command is now entirely based on what pgBackRest has written to storage. Previously, in certain cases, pgBackRest could detect if additional compression was being applied by the storage but this is no longer supported.
Bug Fixes:
  • Retry errors in S3 batch file delete. (Reviewed by Reid Thompson. Reported by Alex Richman.)
    A failed batch delete was retried, but errors for individual files in the batch were not, and pgBackRest could terminate during expire or when removing a backup that could not be resumed. Files that fail in a batch are now deleted individually with the usual HTTP retries.
    Issue #1650Pull request #1653Commit 551e5bc
  • Allow case-insensitive matching of HTTP connection header values. (Reviewed by Reid Thompson. Reported by Rémi Vidier.)
    The HTTP specification allows connection header values in any case, e.g. Close.
    Issue #1638Pull request #1675Commit b33cabe
Features:
  • Add support for AWS S3 server-side encryption using KMS. (Contributed by Christoph Berg. Reviewed by David Steele. Tested by Tharindu Amila.)
    Set repo-s3-kms-key-id to encrypt objects with a key managed by AWS KMS.
    Issue #1430Pull request #1567Commit 3097acd
  • Add archive-missing-retry option. (Reviewed by Stefan Fercot.)
    By default archive-get retries a WAL segment it already reported as missing, which ignores missing notifications left in the spool path by a prior restore. With archive-missing-retry=n, PostgreSQL can detect the end of the archive and switch to streaming even while WAL is being archived. The spool path must then be empty when recovery starts.
    Pull request #1642Commit 10038db
  • Add backup type filter to info command. (Contributed by Stefan Fercot. Reviewed by David Steele.)
    Set type to show only backups of that type, e.g. type=full.
    Issue #600Pull request #1651Commit b26097f
Improvements:
  • Retry on page validation failure during backup. (Reviewed by Stephen Frost, David Christensen.)
    A page that fails checksum validation is now read again. It is reported as an error only when it has not changed. A changed page is being written by PostgreSQL, and the WAL contains a full page image. Zero pages are now checked to be all zeroes rather than only by the pd_upper field.
    b489707 Move command/backup-common tests in the command/backup module.
    9eec98c Retry on page checksum validation failure during backup.Issue #952Pull request #1667
    53f1b25 Improve validation of zero pages.Issue #952Pull request #1669
  • Handle TLS servers that do not close connections gracefully. (Reviewed by David Christensen, Stephen Frost. Tested by Rémi Vidier.)
    Some servers close the socket rather than the TLS connection. When a response has no content length or chunked encoding and its content can be parsed, the closed socket is now treated as EOF. These servers stopped working in v2.35.
    Issue #1638Pull request #1677Commit 59a5373
  • Add backup LSNs to info command output. (Contributed by Stefan Fercot. Reviewed by David Steele.)
    The start and stop LSNs of a backup are shown with set and in JSON output, for use with LSN-based Point-in-Time Recovery.
    Pull request #1610Commit d866dd5
  • Automatically strip trailing slashes for repo-ls paths. (Contributed by David Christensen. Reviewed by David Steele.)
    A trailing slash on the path made repo-ls show no content on some repository storage types.
    Pull request #1673Commit 6320712
  • Do not retry fatal errors. (Reviewed by Reid Thompson.)
    Retrying fatal errors, especially out of memory errors, may cause lockups. Assertion and memory errors are now reported without retrying.
    8573a2d Improve protocol module error test for protocolClientFree().
    8d0cce6 Use normal error for protocol module error retry test.
    8046f06 Do not retry fatal errors.Pull request #1658
  • Remove support for PostgreSQL 8.3/8.4. (Reviewed by Reid Thompson, Stefan Fercot.)
    There is no evidence that these versions are still in use and supporting them costs development and test time. Use an older version of pgBackRest to back up or migrate from these versions.
    Pull request #1611Commit bb4b30d
  • Remove logic that tried to determine additional file system compression. (Reviewed by Reid Thompson, Stefan Fercot.)
    After a file was copied, pgBackRest checked its size on disk to detect compression by the file system, e.g. ZFS. This was untested, slow with many small files, and blocked file bundling. The repository size in info is now what pgBackRest wrote.
    Pull request #1652Commit cb630ff
Documentation Bug Fixes:
  • Move repo options in TLS documentation to the global section. (Reported by Anton Kurochkin.)
    The user guide set these options in the stanza section, which works in some cases but is not best practice.
    Commit 53de3e3
  • Remove unused backup-standby option from stanza commands. (Reported by Stefan Fercot.)
    stanza-create and stanza-upgrade listed backup-standby in the command reference and help, but did not use it.
    Commit 5cbb4a3
  • Fix typos in help and release notes. (Fixed by Daniel Gustafsson. Reviewed by David Steele.)
    cacfdd9 Fix typos in help and release notes.Pull request #1671
    5c332a0 Fix release note attribution in cacfdd94 and f798458e.
Documentation Improvements:
  • Add aliveness check to systemd service configuration. (Suggested by Yogesh Sharma.)
    The pgbackrest.service example now checks that the server is still running shortly after it starts. Before, a server that failed to start reported no error while systemd retried in the background.
    Commit f1bdf3e
  • Add FAQ explaining WAL archive suffix. (Contributed by Stefan Fercot. Reviewed by David Steele.)
    The suffix on a WAL file in the repository is its SHA1 checksum, which is used to verify the file. It cannot be omitted.
    Issue #1485Issue #1663Pull request #1664Commit 98d525d
  • Note that replications slots are not restored. (Contributed by Reid Thompson. Reviewed by David Steele, Stefan Fercot. Suggested by Christophe Courtois.)
    Issue #1585Pull request #1601Commit a82f017
v2.37 Release Notes
TLS Server
Released January 3, 2022
IMPORTANT NOTE: If the restore command is unable to find a backup that matches a specified time target then an error will be thrown, whereas before a warning was logged.
Bug Fixes:
  • Fix restore delta link mapping when path/file already exists. (Reviewed by Reid Thompson. Reported by Younes Alhroub.)
    When link-map or link-all mapped a path or file that already existed to a link, a delta restore left the existing path or file in place. It is now replaced by the link.
    Issue #1588Pull request #1589Commit a73fe4e
  • Fix socket leak on connection retries. (Reviewed by Reid Thompson. Reported by James Coleman.)
    In optimized builds the socket of a failed connection attempt was not closed, and each retry leaked a socket.
    Issue #1593Pull request #1594Commit 615bdff
Features:
  • Add TLS server. (Reviewed by Stephen Frost, Reid Thompson. Tested by Andrew L'Ecuyer.)
    The server command starts a TLS server that can be used instead of SSH to reach repository and PostgreSQL hosts. Set repo-host-type=tls or pg-host-type=tls on the client, and configure certificates and client authorization with the tls-server-* options. SIGHUP reloads the configuration and SIGTERM stops the server.
    2d963ce Rename server-start command to server.
    7b3ea88 Add SIGTERM and SIGHUP handling to TLS server.Pull request #1572
    f06101d Add TLS server documentation.Pull request #1597
    Development in v2.36:
    ccc255d Add TLS Server.Pull request #1504
    13d4559 Check return value of getsockopt().
    Development in v2.35:
    947c7a8 Refactor cmdLocal()/cmdRemote() to accept a ProtocolServer object.
    0999de0 Move noop from protocolClientNew() to local/remote initialization.
  • Add --cmd option. (Contributed by Reid Thompson. Reviewed by Stefan Fercot, David Steele. Suggested by Virgile CREVON.)
    Set cmd to the pgBackRest executable used in commands that pgBackRest writes, e.g. restore_command in recovery.conf.
    Issue #1537Pull request #1540Commit 2a57647
Improvements:
  • Check archive immediately after backup start. (Reviewed by Reid Thompson, David Christensen.)
    A backup failed because WAL archiving was not working only after all files were copied. The archive is now checked right after the backup starts. On an idle system a restore point is created to switch the WAL segment.
    Issue #152Pull request #1570Commit 1f14f45
  • Add timeline and checkpoint checks to backup. (Reviewed by Stefan Fercot, Reid Thompson.)
    The backup now checks that pg_control has the checkpoint and timeline of the backup start, and that a standby is following the primary, i.e. it is on the same timeline and its checkpoint is not later than the backup checkpoint.
    Pull request #1581Commit 49145d7
  • Check that clusters are alive and correctly configured during a backup. (Reviewed by Stefan Fercot.)
    A backup now fails as soon as a cluster stops or the standby is promoted. Before, a stopped primary was detected only at the end of the backup and a promoted standby was not detected.
    Pull request #1584Commit bd2ba80
  • Error when restore is unable to find a backup to match the time target. (Reviewed by Reid Thompson, Douglas J Hunley. Suggested by Douglas J Hunley.)
    This was a warning that was easy to miss, and a lot of time could be lost restoring a backup that cannot reach the target.
    Issue #1582Pull request #1586Commit be4ac39
  • Parse protocol/port in S3/Azure endpoints. (Contributed by Reid Thompson. Reviewed by David Steele.)
    repo-s3-endpoint, repo-azure-endpoint, and repo-storage-host may now include a protocol and port, e.g. https://host:9000.
    Issue #1560Pull request #1591Commit 6a12458
  • Add warning when checkpoint_timeout exceeds db-timeout. (Contributed by Stefan Fercot. Reviewed by David Steele.)
    With start-fast=n, a backup can time out waiting for the checkpoint when checkpoint_timeout is greater than db-timeout. The backup now warns in this case.
    Pull request #1564Commit 6723305
  • Add verb to HTTP error output. (Contributed by Christoph Berg. Reviewed by David Steele.)
    Pull request #1566Commit c38e2d3
  • Allow y/n arguments for boolean command-line options. (Contributed by Reid Thompson. Reviewed by David Steele.)
    Pull request #1571Commit 1a0560d
  • Make backup size logging exactly match info command output. (Contributed by Reid Thompson. Reviewed by David Steele. Suggested by Mahomed Hussein.)
    The logged backup size now includes only the files copied, plus backup_label and tablespace_map. Before, e.g. an incremental backup after a switchover logged the size of every file checked.
    6e63576 Match backup log size with size reported by info command.Issue #766Pull request #1562
    afe77e7 Update contributor for 6e635764.
    1e77fc3 Include backup_label and tablespace_map file sizes in log output.Pull request #1568
    a3d7a23 Use infoBackupDataByLabel() to log backup size.Pull request #1573
    dcb4f09 Revert changes to backupFilePut() made in 1e77fc3d.
Documentation Improvements:
  • Display size option default and allowed values with appropriate units. (Reviewed by Reid Thompson.)
    cff961e Centralize logic to build value lists during config rendering.
    038abaa Display size option default and allowed values with appropriate units.Pull request #1557
  • Fix typos and improve documentation for the tablespace-map-all option. (Reviewed by Reid Thompson. Suggested by Reid Thompson.)
    Commit df89eff
  • Remove obsolete statement about future multi-repository support. (Suggested by David Christensen.)
    The documentation stated that only one repository was allowed, but multiple repositories have been supported since v2.33.
    Commit dea7524
v2.36 Release Notes
Minor Bug Fixes and Improvements
Released November 1, 2021
Bug Fixes:
  • Allow global as a stanza prefix. (Reviewed by Stefan Fercot. Reported by Younes Alhroub.)
    A stanza name that begins with global, e.g. global_stanza, was rejected because the config parser treated it as a global section.
    Issue #1524Pull request #1525Commit 498902e
  • Fix segfault on invalid GCS key file. (Reviewed by Stephen Frost. Reported by Henrik Feldt.)
    A GCS key file without the client email, private key, or token URI caused a segfault. It now causes an error.
    Issue #1536Commit 2cea005
Improvements:
  • Allow link-map option to create new links. (Reviewed by Don Seiler, Stefan Fercot, Chris Bandy. Suggested by Don Seiler.)
    link-map could only remap links that were in the backup. It can now create a new link for any path or file in the backup.
    d89a677 Refactor restoreManifestMap() tests in the command/restore unit.
    cf1a575 Refactor restoreManifestMap() to be driven by link-map.
    68c5f3e Allow link-map option to create new links.Issue #1409Pull request #1520
  • Increase max index allowed for pg/repo options to 256. (Reviewed by Cynthia Shang.)
    The maximum index was 8 for pg options and 4 for repo options. Both are now 256, e.g. pg256-path.
    02b06aa Increase max index allowed for pg/repo options to 256.Pull request #1481
    71047a9 Use strncpy() to limit characters copied to optionName.
  • Add WebIdentity authentication for AWS S3. (Reviewed by James Callahan, Reid Thompson, Andrew L'Ecuyer. Tested by Benjamin Blattberg.)
    Set repo-s3-key-type=web-id to get credentials automatically in an EKS environment.
    cfd8233 Refactor S3 storage driver for additional auth methods.
    3879bc6 Add WebIdentity authentication for AWS S3.Issue #1203Pull request #1527
    1152f7a Fix mismatched parameters in tlsClientNew() call.
  • Add repo-azure-uri-style option.
    Set repo-azure-uri-style to host (default) or path to select the URI style for Azure. Azurite uses host-style URIs when the endpoint looks like a multipart host name.
    Commit 096829b
  • Report backup file validation errors in backup.info. (Contributed by Stefan Fercot. Reviewed by David Steele.)
    Errors found during a backup, e.g. invalid page checksums, were shown only by info with set. A flag in backup.info now shows in text and JSON output that a backup has errors. The details still require set.
    Issue #1484Pull request #1508Commit 34f7873
  • Add recovery start time to online backup restore log. (Reviewed by Tom Swartz, Stefan Fercot. Suggested by Tom Swartz.)
    Restore now logs the time that recovery will start from, which shows how much WAL must be replayed.
    Issue #1507Pull request #1518Commit 9e79f0e
  • Report original error and retries on local job failure. (Reviewed by Stefan Fercot.)
    When a local job fails after its retries, the error now reports the first error with its stack trace, followed by the retry errors. Before, only the last error was reported, which was often a cascade failure such as the protocol being out of sync.
    136d309 Allow stack trace to be specified for errorInternalThrow().
    ae40ed6 Add jobRetry parameter to HRN_CFG_LOAD().
    6af827c Report original error and retries on local job failure.Pull request #1521
  • Rename page checksum error to error list in info text output. (Reviewed by Stefan Fercot.)
    The label in info text output is now error list rather than page checksum error. A file may have an alignment error rather than a page checksum error.
    Pull request #1519Commit 9346895
  • Add hints to standby replay timeout message. (Reviewed by Cynthia Shang, Stefan Fercot. Suggested by Leigh Downs.)
    The timeout waiting for the standby to replay now has hints to check that replication is running and to disable backup-standby to back up from the primary.
    Issue #1434Commit b7ef12a
Documentation Bug Fixes:
  • Fix incorrect host name in user guide. (Fixed by Reid Thompson. Reviewed by David Steele.)
    The replication setup used the IP address of pg-primary in pg_hba.conf rather than the IP address of pg-standby.
    Pull request #1544Commit 1cb8ae1
Documentation Improvements:
  • Improve option documentation.
    The help for buffer-size now describes all the operations that use it, the descriptions of cmd-ssh, repo-host-cmd, and pg-host-cmd are consistent, and archive-header-check moved to the archive section of the configuration reference.
    3763624 Move archive-header-check option to the archive reference section.
    e1f6c06 Improve documentation for buffer-size option.
    fa564ee Improve documentation for cmd-ssh, repo-host-cmd, pg-host-cmd options.
v2.35 Release Notes
Binary Protocol
Released August 23, 2021
IMPORTANT NOTE: The log level for copied files in the backup/restore commands has been changed to detail. This makes the info log level less noisy but if these messages are required then set the log level for the backup/restore commands to detail
Bug Fixes:
  • Detect errors in S3 multi-part upload finalize. (Reviewed by Cynthia Shang. Tested by Marco Montagna. Reported by Marco Montagna, Lev Kokotov, Anderson A. Mallmann.)
    Completing a multi-part upload can fail even when S3 returns HTTP success. A response without an ETag is now treated as a failure, and the job is retried.
    8e1807c Detect errors in S3 multi-part upload finalize.Issue #1116Issue #1290Issue #1433Pull request #1438
    25508a4 Add contributors missed in 8e187cdb.
  • Fix detection of circular symlinks. (Reviewed by Stefan Fercot. Reported by Rohit Raveendran.)
    Links were followed before they were checked, and a circular link sent the manifest build into endless recursion and a crash.
    Issue #1447Pull request #1452Commit 43b8746
  • Only pass selected repo options to the remote. (Reviewed by David Christensen, Cynthia Shang. Reported by Greg Sabino Mullane, David Christensen.)
    Options for other repositories could cause conflicts on the remote, which uses exactly one repository.
    Pull request #1480Commit 935de1e
Improvements:
  • Binary protocol. (Reviewed by Cynthia Shang.)
    Local and remote processes now communicate with the binary pack format rather than JSON. Packs are more compact, faster to render and parse, and strictly typed. Each message is written in one place, which makes an error less likely to leave the protocol in a bad state, and messages have no size limit.
    6a1c033 Binary protocol.Pull request #1424
    2d5cbfc Fix memory leaks introduced by the binary protocol in 6a1c0337.
    f716cb6 Fix use after free introduced by the binary protocol in 6a1c0337.
    4fb6384 Fix more memory leaks introduced by the binary protocol in 6a1c0337.
  • Automatically create data directory on restore. (Contributed by Stefan Fercot. Reviewed by David Steele. Suggested by Chris Bandy.)
    A check migrated from Perl prevented restore from creating the data directory.
    Issue #1445Pull request #1454Commit 056a307
  • Allow restore --type=lsn. (Contributed by Stefan Fercot. Reviewed by Cynthia Shang. Suggested by James Coleman.)
    Set type=lsn and an LSN in target to recover to an LSN on PostgreSQL >= 10.
    Issue #1339Pull request #1462Commit 563d117
  • Change level of backup/restore copied file logging to detail. (Reviewed by Stefan Fercot. Suggested by Jens Wilke.)
    This makes the info log level less noisy. Set the log level to detail to see each copied file.
    Issue #1277Pull request #1455Commit 849ab34
  • Loop while waiting for checkpoint LSN to reach replay LSN. (Contributed by Stefan Fercot. Reviewed by David Steele. Suggested by Fatih Mencutekin.)
    On a standby the checkpoint LSN can lag slightly behind the replay LSN until pg_control is updated. The backup now keeps checking rather than failing.
    Issue #1450Pull request #1460Commit 8fac1ac
  • Log backup file total and restore size/file total. (Reviewed by Cynthia Shang.)
    The backup size is now logged at the end of the backup and includes files added to the manifest after the main copy, e.g. backup_label and WAL. Restore now logs its size and file total.
    Pull request #1489Commit a0bdfa4
Documentation Bug Fixes:
  • Fix incorrect host names in user guide. (Reviewed by Stefan Fercot. Reported by Greg Sabino Mullane.)
    Some examples showed pg1 rather than the host name, and the install block installed packages on the build host no matter which host was specified.
    Pull request #1479Commit 155ef85
Documentation Improvements:
  • Update contributing documentation and add pull request template. (Contributed by Cynthia Shang. Reviewed by David Steele.)
    The contributing guide now has a table of contents and sections on understanding test output and submitting a pull request. GitHub now shows a template for new pull requests.
    e3d05e2 Update contributing documentation and add pull request template.Pull request #1469
    71b654f Fix links and update child process example.Pull request #1487
  • Rearrange backup documentation in user guide. (Reviewed by Cynthia Shang.)
    The Fast Start Option and Archive Timeout sections moved to Quick Start - Perform Backup. The Automatic Stop Option section, which applies only to PostgreSQL <= 9.6, was removed.
    Pull request #1488Commit 6ab18dc
  • Clarify restore --type behavior in command reference. (Contributed by Cynthia Shang. Reviewed by David Steele.)
    The reference now states that set must be specified when the target is before the latest backup and type is not time.
    Commit a6691c6
  • Fix documentation and comment typos. (Contributed by Eric Radman. Reviewed by David Steele.)
    Pull request #1446Commit 23bdc3d
Test Suite Improvements:
  • Add check for test path inside repo path. (Reviewed by Greg Sabino Mullane. Suggested by Greg Sabino Mullane.)
    A test path inside the repository path caused strange failures because the repository is copied into the test path. test.pl now errors in this case.
    Issue #1472Pull request #1474Commit e32f9e1
  • Add CodeQL static code analysis. (Reviewed by Cynthia Shang.)
    CodeQL now runs in CI. Issues it found were fixed, e.g. gmtime()/localtime() were replaced with gmtime_r()/localtime_r().
    Pull request #1457Commit 3c8819e
  • Update tests to use standard patterns. (Contributed by Cynthia Shang. Reviewed by David Steele.)
    3f9fbc3 Update command/expire test to use standard patterns.Pull request #1420
    03021c6 Update command/stanza test to use standard patterns.Pull request #1426
    8dd882b Update info/infoArchive test to use standard patterns.Pull request #1436
    ff95edd Update command/verify test to use standard patterns.Pull request #1435
    17c9ed0 Update command/info test to use standard patterns.Pull request #1432
    bffb43e Update command/check test to use standard patterns.Pull request #1431
    fb2d111 Update info/infoBackup test to use standard patterns.Pull request #1437
    065a8c8 Replace defines with string constants in unit tests.Pull request #1440
    c620811 Add timeModified parameter to HRN_STORAGE_PUT() macro.
    6a90d46 Update info/manifest test to use standard patterns.Pull request #1444
    62e8d97 Update command/archive tests to use standard patterns.Pull request #1449
    8bb0b28 Update command/control and command/command tests to use standard patterns.Pull request #1456
    f2ec4e0 Add cipher parameters to TEST_STORAGE_GET() macro.
    4ad0bbd Update command/backup tests to use standard patterns.Pull request #1463
    117ffe8 Update command/help tests to use standard patterns.Pull request #1464
    ebe5848 Update command/local and command/remote tests to use standard patterns.Pull request #1466
    a6cdf5b Update command/repo test to use standard patterns.Pull request #1467
    4992508 Update command/restore test to use standard patterns.Pull request #1468
    4c9ddf5 Update storage tests to use standard patterns.Pull request #1470
    eeaab6a Update config tests (except parse) to use standard patterns.Pull request #1473
    f653b59 Update db/db test to use standard patterns.Pull request #1486
    e17865a Update protocol/protocol test to use standard patterns.Pull request #1491
    eca2fc6 Update config/parse test to use standard patterns.Pull request #1492
v2.34 Release Notes
PostgreSQL 14 Support
Released June 7, 2021
Bug Fixes:
  • Fix issues with leftover spool files from a prior restore. (Reviewed by Cynthia Shang, Stefan Fercot. Tested by Floris van Nee. Reported by Floris van Nee.)
    A notification left in the spool path by a prior restore could make archive-get report a WAL segment as missing. When this notification is found on the first check, it is now removed and the async process is run again. An error is reported when the async process does not respond, rather than reporting the WAL segment as missing.
    Issue #1357Pull request #1371Commit f45e76f
  • Fix issue when checking links for large numbers of tablespaces. (Reviewed by Cynthia Shang. Tested by Avinash Vallarapu. Reported by Avinash Vallarapu.)
    The link check used a lot of memory with many tablespaces and could crash. The new check is much faster, uses far less memory, and also detects duplicate file links.
    Issue #1354Pull request #1356Commit eba013b
  • Free no longer needed remotes so they do not timeout during restore. (Reviewed by Cynthia Shang. Reported by Francisco Miguel Biete Banon.)
    The connections to remotes were held for the whole restore and could time out, which logged a harmless but distracting warning at the end of a long restore. They are now closed after the manifest is loaded.
    Issue #1368Pull request #1374Commit 06fa185
  • Fix help when a valid option is invalid for the specified command. (Reviewed by Stefan Fercot. Reported by Cynthia Shang.)
    help segfaulted when asked about an option that is not valid for the command.
    Pull request #1375Commit 45f8355
Features:
  • Add PostgreSQL 14 support. (Reviewed by Cynthia Shang.)
    PostgreSQL 14 needs no code changes from PostgreSQL 13. The catalog version may now change during the PostgreSQL beta/rc period without requiring a new pgBackRest release.
    Pull request #1413Commit 2452c4d
  • Add automatic GCS authentication for GCE instances. (Reviewed by Jan Wieck. Tested by Daniel Farina.)
    Set repo-gcs-key-type=auto to get the authentication token from the instance metadata on a GCE instance.
    7b71604 Use existing variable for GCS test server port.
    26fefa6 Refactor GCS token response parsing into a separate function.
    9af0331 Add automatic GCS authentication for GCE instances.Pull request #1395
  • Add repo-retention-history option to expire backup history. (Contributed by Stefan Fercot. Reviewed by Cynthia Shang, David Steele.)
    Set the number of days of backup history to keep. By default all history is kept, and history for backups still in the repository is never expired. When a full backup manifest expires, the manifests of its differential and incremental backups expire as well.
    Pull request #1389Commit 5b332b2
  • Add db-exclude option. (Contributed by Stefan Fercot. Reviewed by Cynthia Shang.)
    Restore excludes the specified databases by writing them as sparse, zeroed files. PostgreSQL can still perform recovery, and the databases can be dropped after recovery. With db-include, db-exclude applies only to the system databases template0, template1, and postgres.
    Issue #986Pull request #1337Commit 292f836
Improvements:
  • Change archive expiration logging from detail to info level. (Contributed by Cynthia Shang. Reviewed by David Steele.)
    Pull request #1416Commit aceb956
  • Remove stanza archive spool path on restore. (Reviewed by Cynthia Shang, Stefan Fercot.)
    Files in the spool path could interfere with the new cluster, e.g. old archive-push acknowledgements could make it skip archiving WAL.
    Issue #1357Pull request #1386Commit 320c6e1
  • Do not write files atomically or sync paths during backup copy. (Reviewed by Stephen Frost, Stefan Fercot, Cynthia Shang.)
    Atomic writes are not needed since checksums are validated when a failed backup is resumed, and all paths are synced at the end of the backup.
    Pull request #1373Commit aa72c19
Documentation Improvements:
  • Update contributing documentation. (Contributed by Cynthia Shang. Reviewed by David Steele, Stefan Fercot.)
    The contributing guide has more examples of how to write code, add configuration options, and test.
    Pull request #1400Commit 68faf14
  • Consolidate RHEL/CentOS user guide into a single document. (Reviewed by Cynthia Shang.)
    The second guide existed mainly to document stop-auto for PostgreSQL <= 9.5, which is now EOL. The option is still documented in the reference.
    Pull request #1405Commit ccac75e
  • Clarify that repo-s3-role is not an ARN. (Contributed by Isaac Yuen. Reviewed by David Steele.)
    Pull request #1365Commit 5bf1606
v2.33 Release Notes
Multi-Repository and GCS Support
Released April 5, 2021
Bug Fixes:
  • Fix option warnings breaking async archive-get/archive-push. (Reviewed by Cynthia Shang. Reported by Lev Kokotov.)
    An option warning in the async process was logged to a closed stdout, which made the process abort. Since the async role can now have different valid options than the default role, this happened more often. Option warnings are now logged only for the default role.
    Issue #1299Pull request #1301Commit 3837e61
  • Fix memory leak in backup during archive copy. (Reviewed by Cynthia Shang. Reported by Christian ROUX, Efremov Egor.)
    Copying WAL into the backup with archive-copy leaked memory, especially when the WAL needed to be recompressed.
    Issue #1319Commit 778adbf
  • Fix stack overflow in cipher passphrase generation. (Reviewed by Cynthia Shang. Reported by bsiara.)
    The buffer for the generated passphrase had no room for the terminating zero. This was found on arm64 with musl libc.
    Issue #1294Pull request #1295Commit d29855b
  • Fix repo-ls / on S3 repositories. (Reviewed by Cynthia Shang. Reported by Lesovsky Alexey.)
    S3 reports / as a file without the expected headers, which caused an error. / is now reported as not existing on storage that does not support paths.
    Issue #1317Pull request #1336Commit b1d945e
Features:
  • Multiple repository support. (Contributed by Cynthia Shang, David Steele. Reviewed by Stefan Fercot, Stephen Frost.)
    Up to four repositories may be configured, e.g. a local repository for fast restores and a remote repository for redundancy. archive-push pushes WAL to all repositories, and backups are scheduled for each repository. Some commands work with all repositories, while others require repo. repo is not required when only repo1 is configured.
    3408f1e Enhance expire command multi-repo support.Pull request #1289
    e28f6f1 Expire continues if an error occurs processing a repository.Pull request #1308
    bec3e20 Add archive-get command multi-repo support.Pull request #1292
    118d9e6 Enhance restore command multi-repo support.Pull request #1300
    065b2ff Refactor info command repoMin/Max.
    0ddc038 Remove restore default repo from integration tests.
    13dc8e6 Make --repo optional for backup command.Pull request #1316
    a1280c4 Refactor archive-push command warnings to work like archive-get.
    3b8f0ef Add write fault-tolerance to archive-push command.Pull request #1316
    95063f6 Make --repo optional for remaining commands except stanza-delete.
    1dbb3bf Multiple repository support.Pull request #1227
    31c7824 Allow stanza-* commands to be run remotely.Pull request #1326
    2789d3b Improve info command fault tolerance.Pull request #1342
    01b8e22 Improve archive-push command fault tolerance.Pull request #1343
  • GCS support for repository storage. (Reviewed by Cynthia Shang. Tested by Daniel Farina.)
    Set repo-type=gcs to store the repository on GCS or a GCS-compatible object store.
    dcb79ab Decode JSON \u escaped characters.
    1b4b353 Rename uri to path where appropriate in HTTP and storage modules.
    66a4ff4 Encode path before passing to HttpRequest.
    d485609 Add strNewEncode(), strCatEncode(), and bufNewDecode().
    abcbe0f Combine encode module files into a single file.
    edab2a0 Use switch rather than if-else for encoding types.
    f6c3262 Do not expose valid/validate functions from encode module.
    a1f4fd3 Add ASSERT_MSG().
    00b60e5 Add base64url encoding.
    54c4eb0 Make remote storage objects writeable.
    088662d GCS support for repository storage.Issue #631Issue #743Pull request #1320
  • Add archive-header-check option. (Reviewed by Stephen Frost, Cynthia Shang. Suggested by Hans-Jürgen Schönig.)
    The WAL header is checked against the PostgreSQL version and system identifier to make sure WAL is pushed to the correct stanza. The check is enabled by default and can be disabled when needed, e.g. for encrypted WAL.
    Pull request #1298Commit b6106f3
Improvements:
  • Include recreated system databases during selective restore. (Contributed by Stefan Fercot. Reviewed by Cynthia Shang.)
    A system database (template0, template1, or postgres) that was recreated has an OID that makes it look like a user database. These databases are now always restored, whatever their OID.
    Issue #986Pull request #1307Commit 6942ff5
  • Exclude content-length from S3 signed headers. (Reviewed by Cynthia Shang. Suggested by Brian P Bockelman.)
    Some proxies modify the content-length header, which made authentication fail when it was signed.
    Issue #1340Pull request #1341Commit 7d7ac0e
  • Consolidate less commonly used repository storage options. (Reviewed by Cynthia Shang.)
    The S3 and Azure CA, host, port, and TLS verification options are renamed to repo-storage-*, e.g. repo1-s3-host is now repo1-storage-host. The old names are still accepted.
    Pull request #1321Commit d1aa765
  • Allow custom config-path default with ./configure --with-configdir. (Contributed by Michael Schout. Reviewed by David Steele.)
    Packagers can set a different default for config-path when building. Without the option the default is still /etc/pgbackrest.
    6a717e0 Set config path in configure script.
    9243962 Allow custom config-path default with ./configure --with-configdir.Issue #1251Issue #1293Pull request #1255
  • Log archive copy during backup. (Reviewed by Cynthia Shang, Stefan Fercot.)
    Issue #1319Pull request #1328Commit c862e96
Documentation Improvements:
  • Update reference to include links to user guide examples. (Contributed by Cynthia Shang. Reviewed by David Steele.)
    The command reference now links to the user guide sections with examples, and some descriptions were clarified, e.g. set for expire.
    Pull request #1353Commit d372dd6
  • Update selective restore documentation with caveats. (Reviewed by Cynthia Shang, Stefan Fercot.)
    Recovery may fail unless type=immediate is specified, because PostgreSQL reports zeroed pages as errors after consistency is reached. On PostgreSQL >= 13 ignore_invalid_pages may be used, but check the logs for invalid pages in the selected databases.
    Issue #796Pull request #1329Commit 92d12cc
  • Add compress-type clarification to archive-copy documentation. (Reviewed by Cynthia Shang, Stefan Fercot.)
    WAL must be recompressed when archive-push and backup use a different compress-type, which can be expensive.
    Issue #1319Pull request #1327Commit 9506ffa
  • Add compress-level defaults per compress-type value. (Contributed by Cynthia Shang. Reviewed by David Steele.)
    The defaults are 9 for bz2, 6 for gz, 1 for lz4, and 3 for zst.
    Issue #1242Pull request #1346Commit 3e20608
  • Add note about required NFS settings being the same as PostgreSQL. (Contributed by Cynthia Shang. Reviewed by David Steele.)
    Issue #871Pull request #1347Commit 7598762
v2.32 Release Notes
Repository Commands
Released February 8, 2021
Bug Fixes:
  • Fix resume after partial delete of backup by prior resume. (Reviewed by Cynthia Shang. Reported by Tom Swartz.)
Features:
  • Add repo-ls command. (Reviewed by Cynthia Shang. Tested by Stefan Fercot.)
  • Add repo-get command. (Contributed by Stefan Fercot, David Steele. Reviewed by Cynthia Shang.)
  • Add archive-mode-check option. (Contributed by Stefan Fercot. Reviewed by David Steele. Tested by Michael Banck.)
Improvements:
  • Improve archive-get performance. (Reviewed by Cynthia Shang.)
Documentation Improvements:
  • Improve expire command documentation. (Contributed by Cynthia Shang. Reviewed by David Steele.)
v2.31 Release Notes
Minor Bug Fixes and Improvements
Released December 7, 2020
Bug Fixes:
  • Allow [, #, and space as the first character in database names. (Reviewed by Stefan Fercot, Cynthia Shang. Reported by Jefferson Alexandre.)
  • Create standby.signal only on PostgreSQL 12 when restore type is standby. (Fixed by Stefan Fercot. Reviewed by David Steele. Reported by Keith Fiske.)
Features:
  • Expire history files. (Contributed by Stefan Fercot. Reviewed by David Steele.)
  • Report page checksum errors in info command text output. (Contributed by Stefan Fercot. Reviewed by Cynthia Shang.)
  • Add repo-azure-endpoint option. (Reviewed by Cynthia Shang. Tested by Brian Peterson. Suggested by Brian Peterson.)
  • Add pg-database option. (Reviewed by Cynthia Shang.)
Improvements:
  • Improve info command output when a stanza is specified but missing. (Contributed by Stefan Fercot. Reviewed by Cynthia Shang, David Steele. Suggested by uspen.)
  • Improve performance of large file lists in backup/restore commands. (Reviewed by Cynthia Shang. Tested by Oscar.)
  • Add retries to PostgreSQL sleep when starting a backup. (Reviewed by Cynthia Shang. Suggested by Vitaliy Kukharik.)
Documentation Improvements:
  • Replace RHEL/CentOS 6 documentation with RHEL/CentOS 8.
v2.30 Release Notes
PostgreSQL 13 Support
Released October 5, 2020
Bug Fixes:
  • Error with hints when backup user cannot read pg_settings. (Reviewed by Stefan Fercot, Cynthia Shang. Reported by Mohamed Insaf K.)
Features:
  • PostgreSQL 13 support. (Reviewed by Cynthia Shang.)
Improvements:
  • Improve PostgreSQL version identification. (Reviewed by Cynthia Shang, Stephen Frost.)
  • Improve working directory error message. (Reviewed by Stefan Fercot.)
  • Add hint about starting the stanza when WAL segment not found. (Contributed by David Christensen. Reviewed by David Steele.)
  • Add hint for protocol version mismatch. (Reviewed by Cynthia Shang. Suggested by loop-evgeny.)
Documentation Improvements:
  • Add note that pgBackRest versions must match when running remotely. (Reviewed by Cynthia Shang. Suggested by loop-evgeny.)
  • Move info command text to the reference and link to user guide. (Reviewed by Cynthia Shang. Suggested by Christophe Courtois.)
  • Update yum repository path for CentOS/RHEL user guide. (Contributed by Heath Lord. Reviewed by David Steele.)
v2.29 Release Notes
Auto S3 Credentials on AWS
Released August 31, 2020
Bug Fixes:
  • Suppress errors when closing local/remote processes. Since the command has completed it is counterproductive to throw an error but still warn to indicate that something unusual happened. (Reviewed by Cynthia Shang. Reported by argdenis.)
  • Fix issue with = character in file or database names. (Reviewed by Bastian Wegge, Cynthia Shang. Reported by Brad Nicholson, Bastian Wegge.)
Features:
  • Automatically retrieve temporary S3 credentials on AWS instances. (Contributed by David Steele, Stephen Frost. Reviewed by Cynthia Shang, Aleš Zelený, Jeanette Bromage. Tested by David Youatt.)
  • Add archive-mode option to disable archiving on restore. (Reviewed by Stephen Frost. Suggested by Stephen Frost.)
Improvements:
  • PostgreSQL 13 beta3 support. Changes to the control/catalog/WAL versions in subsequent betas may break compatibility but pgBackRest will be updated with each release to keep pace.
  • Asynchronous list/remove for S3/Azure storage. (Reviewed by Cynthia Shang, Stephen Frost.)
  • Improve memory usage of unlogged relation detection in manifest build. (Reviewed by Cynthia Shang, Stephen Frost, Oscar. Tested by Brad Nicholson. Suggested by Oscar, Brad Nicholson.)
  • Proactively close file descriptors after forking async process. (Reviewed by Stephen Frost, Cynthia Shang.)
  • Delay backup remote connection close until after archive check. (Contributed by Floris van Nee. Reviewed by David Steele.)
  • Improve detailed error output. (Reviewed by Cynthia Shang.)
  • Improve TLS error reporting. (Reviewed by Cynthia Shang, Stephen Frost.)
Documentation Bug Fixes:
  • Add none to compress-type option reference and fix example. (Reported by Ugo Bellavance, Don Seiler.)
  • Add missing azure type in repo-type option reference. (Fixed by Don Seiler. Reviewed by David Steele.)
  • Fix typo in repo-cipher-type option reference. (Fixed by Don Seiler. Reviewed by David Steele.)
Documentation Improvements:
  • Clarify that expire must be run regularly when expire-auto is disabled. (Reviewed by Douglas J Hunley. Suggested by Douglas J Hunley.)
v2.28 Release Notes
Azure Repository Storage
Released July 20, 2020
Bug Fixes:
  • Fix restore --force acting like --force --delta. This caused restore to replace files based on timestamp and size rather than overwriting, which meant some files that should have been updated were left unchanged. Normal restore and restore --delta were not affected by this issue. (Reviewed by Cynthia Shang.)
Features:
  • Azure support for repository storage. (Reviewed by Cynthia Shang. Tested by Don Seiler.)
  • Add expire-auto option. This allows automatic expiration after a successful backup to be disabled. (Contributed by Stefan Fercot. Reviewed by Cynthia Shang, David Steele.)
Improvements:
  • Asynchronous S3 multipart upload. (Reviewed by Stephen Frost.)
  • Automatic retry for backup, restore, archive-get, and archive-push. (Reviewed by Cynthia Shang.)
  • Disable query parallelism in PostgreSQL sessions used for backup control. (Reviewed by Stefan Fercot.)
  • PostgreSQL 13 beta2 support. Changes to the control/catalog/WAL versions in subsequent betas may break compatibility but pgBackRest will be updated with each release to keep pace.
  • Improve handling of invalid HTTP response status. (Reviewed by Cynthia Shang.)
  • Improve error when pg1-path option missing for archive-get command. (Reviewed by Cynthia Shang.)
  • Add hint when checksum delta is enabled after a timeline switch. (Reviewed by Matt Bunter, Cynthia Shang.)
  • Use PostgreSQL instead of postmaster where appropriate. (Reviewed by Cynthia Shang.)
Documentation Bug Fixes:
  • Fix incorrect example for repo-retention-full-type option. (Reported by Höseyin Sönmez.)
  • Remove internal commands from HTML and man command references. (Reported by Cynthia Shang.)
Documentation Improvements:
  • Update PostgreSQL versions used to build user guides. Also add version ranges to indicate that a user guide is accurate for a range of PostgreSQL versions even if it was built for a specific version. (Reviewed by Stephen Frost.)
  • Update FAQ for expiring a specific backup set. (Contributed by Cynthia Shang. Reviewed by David Steele.)
  • Update FAQ to clarify default PITR behavior. (Contributed by Cynthia Shang. Reviewed by David Steele.)
v2.27 Release Notes
Expiration Improvements and Compression Drivers
Released May 26, 2020
Bug Fixes:
  • Fix issue checking if file links are contained in path links. (Reviewed by Cynthia Shang. Reported by Christophe Cavallié.)
  • Allow pg-path1 to be optional for synchronous archive-push. (Reviewed by Cynthia Shang. Reported by Jerome Peng.)
  • The expire command now checks if a stop file is present. (Fixed by Cynthia Shang. Reviewed by David Steele.)
  • Handle missing reason phrase in HTTP response. (Reviewed by Cynthia Shang. Reported by Tenuun.)
  • Increase buffer size for lz4 compression flush. (Reviewed by Cynthia Shang. Reported by Eric Radman.)
  • Ignore pg-host* and repo-host* options for the remote command. (Reviewed by Cynthia Shang. Reported by Pavel Suderevsky.)
  • Fix possibly missing pg1-* options for the remote command. (Reviewed by Cynthia Shang. Reported by Andrew L'Ecuyer.)
Features:
  • Time-based retention for full backups. The --repo-retention-full-type option allows retention of full backups based on a time period, specified in days. (Contributed by Cynthia Shang, Pierre Ducroquet. Reviewed by David Steele.)
  • Ad hoc backup expiration. Allow the user to remove a specified backup regardless of retention settings. (Contributed by Cynthia Shang. Reviewed by David Steele.)
  • Zstandard compression support. Note that setting compress-type=zst will make new backups and archive incompatible (unrestorable) with prior versions of pgBackRest. (Reviewed by Cynthia Shang.)
  • bzip2 compression support. Note that setting compress-type=bz2 will make new backups and archive incompatible (unrestorable) with prior versions of pgBackRest. (Contributed by Stephen Frost. Reviewed by David Steele, Cynthia Shang.)
  • Add backup/expire running status to the info command. (Contributed by Stefan Fercot. Reviewed by David Steele.)
Improvements:
  • Expire WAL archive only when repo-retention-archive threshold is met. WAL prior to the first full backup was previously expired after the first full backup. Now it is preserved according to retention settings. (Contributed by Cynthia Shang. Reviewed by David Steele.)
  • Add local MD5 implementation so S3 works when FIPS is enabled. (Reviewed by Cynthia Shang, Stephen Frost. Suggested by Brian Almeida, John Kelly.)
  • PostgreSQL 13 beta1 support. Changes to the control/catalog/WAL versions in subsequent betas may break compatibility but pgBackRest will be updated with each release to keep pace. (Reviewed by Cynthia Shang.)
  • Reduce buffer-size default to 1MiB. (Reviewed by Stephen Frost.)
  • Throw user-friendly error if expire is not run on repository host. (Contributed by Cynthia Shang. Reviewed by David Steele.)
v2.26 Release Notes
Non-blocking TLS
Released April 20, 2020
Bug Fixes:
  • Remove empty subexpression from manifest regular expression. MacOS was not happy about this though other platforms seemed to work fine. (Fixed by David Raftis. Reviewed by David Steele.)
Improvements:
  • Non-blocking TLS implementation. (Reviewed by Cynthia Shang, Stephen Frost. Tested by Slava Moudry.)
  • Only limit backup copy size for WAL-logged files. The prior behavior could possibly lead to postgresql.conf or postgresql.auto.conf being truncated in the backup. (Reviewed by Cynthia Shang.)
  • TCP keep-alive options are configurable. (Suggested by Marc Cousin.)
  • Add io-timeout option. (Reviewed by Cynthia Shang.)
v2.25 Release Notes
LZ4 Compression Support
Released March 26, 2020
Features:
  • Add lz4 compression support. Note that setting compress-type=lz4 will make new backups and archive incompatible (unrestorable) with prior versions of pgBackRest. (Reviewed by Cynthia Shang.)
  • Add --dry-run option to the expire command. Use dry-run to see which backups/archive would be removed by the expire command without actually removing anything. (Contributed by Cynthia Shang, Luca Ferrari. Reviewed by David Steele. Suggested by Marc Cousin.)
Improvements:
  • Improve performance of remote manifest build. (Suggested by Jens Wilke.)
  • Fix detection of keepalive options on Linux. (Contributed by Marc Cousin. Reviewed by David Steele.)
  • Add configure host detection to set standards flags correctly. (Contributed by Marc Cousin. Reviewed by David Steele.)
  • Remove compress/compress-level options from commands where unused. These commands (e.g. restore, archive-get) never used the compress options but allowed them to be passed on the command line. Now they will error when these options are passed on the command line. If these errors occur then remove the unused options. (Reviewed by Cynthia Shang.)
  • Limit backup file copy size to size reported at backup start. If a file grows during the backup it will be reconstructed by WAL replay during recovery so there is no need to copy the additional data. (Reviewed by Cynthia Shang.)
v2.24 Release Notes
Auto-Select Backup Set for Time Target
Released February 25, 2020
Bug Fixes:
  • Prevent defunct processes in asynchronous archive commands. (Reviewed by Stephen Frost. Reported by Adam Brusselback, ejberdecia.)
  • Error when archive-get/archive-push/restore are not run on a PostgreSQL host. (Reviewed by Stephen Frost. Reported by Jesper St John.)
  • Read HTTP content to eof when size/encoding not specified. (Reviewed by Cynthia Shang. Reported by Christian ROUX.)
  • Fix resume when the resumable backup was created by Perl. In this case the resumable backup should be ignored, but the C code was not able to load the partial manifest written by Perl since the format differs slightly. Add validations to catch this case and continue gracefully. (Reported by Kacey Holston.)
Features:
  • Auto-select backup set on restore when time target is specified. Auto-selection is performed only when --set is not specified. If a backup set for the given target time cannot not be found, the latest (default) backup set will be used. (Contributed by Cynthia Shang. Reviewed by David Steele.)
Improvements:
  • Skip pg_internal.init temp file during backup. (Reviewed by Cynthia Shang. Suggested by Michael Paquier.)
  • Add more validations to the manifest on backup. (Reviewed by Cynthia Shang.)
Documentation Improvements:
  • Prevent lock-bot from adding comments to locked issues. (Suggested by Christoph Berg.)
v2.23 Release Notes
Bug Fix
Released January 27, 2020
Bug Fixes:
  • Fix missing files corrupting the manifest. If a file was removed by PostgreSQL during the backup (or was missing from the standby) then the next file might not be copied and updated in the manifest. If this happened then the backup would error when restored. (Reviewed by Cynthia Shang. Reported by Vitaliy Kukharik.)
Improvements:
  • Use pkg-config instead of xml2-config for libxml2 build options. (Contributed by David Steele, Adrian Vondendriesch.)
  • Validate checksums are set in the manifest on backup/restore. (Reviewed by Cynthia Shang.)
v2.22 Release Notes
Bug Fix
Released January 21, 2020
Bug Fixes:
  • Fix error in timeline conversion. The timeline is required to verify WAL segments in the archive after a backup. The conversion was performed base 10 instead of 16, which led to errors when the timeline was ≥ 0xA. (Reported by Lukas Ertl, Eric Veldhuyzen.)
v2.21 Release Notes
C Migration Complete
Released January 15, 2020
Bug Fixes:
  • Fix options being ignored by asynchronous commands. The asynchronous archive-get/archive-push processes were not loading options configured in command configuration sections, e.g. [global:archive-get]. (Reviewed by Cynthia Shang. Reported by Urs Kramer.)
  • Fix handling of \ in filenames. \ was not being properly escaped when calculating the manifest checksum which prevented the manifest from loading. Since instances of \ in cluster filenames should be rare to nonexistent this does not seem likely to be a serious problem in the field.
Features:
  • pgBackRest is now pure C.
  • Add pg-user option. Specifies the database user name when connecting to PostgreSQL. If not specified pgBackRest will connect with the local OS user or PGUSER, which was the previous behavior. (Contributed by Mike Palmiotto. Reviewed by David Steele.)
  • Allow path-style URIs in S3 driver.
Improvements:
  • The backup command is implemented entirely in C. (Reviewed by Cynthia Shang.)
v2.20 Release Notes
Bug Fixes
Released December 12, 2019
Bug Fixes:
  • Fix archive-push/archive-get when PGDATA is symlinked. These commands tried to use cwd() as PGDATA but this would disagree with the path configured in pgBackRest if PGDATA was symlinked. If cwd() does not match the pgBackRest path then chdir() to the path and make sure the next cwd() matches the result from the first call. (Reported by Stephen Frost, Milosz Suchy.)
  • Fix reference list when backup.info is reconstructed in expire command. Since the backup command is still using the Perl version of reconstruct this issue will not express unless 1) there is a backup missing from backup.info and 2) the expire command is run directly instead of running after backup as usual. This unlikely combination of events means this is probably not a problem in the field.
  • Fix segfault on unexpected EOF in gzip decompression. (Reported by Stephen Frost.)
v2.19 Release Notes
C Migrations and Bug Fixes
Released November 12, 2019
Bug Fixes:
  • Fix remote timeout in delta restore. When performing a delta restore on a largely unchanged cluster the remote could timeout if no files were fetched from the repository within protocol-timeout. Add keep-alives to prevent remote timeout. (Reported by James Sewell, Jens Wilke.)
  • Fix handling of repeated HTTP headers. When HTTP headers are repeated they should be considered equivalent to a single comma-separated header rather than generating an error, which was the prior behavior. (Reported by donicrosby.)
Improvements:
  • JSON output from the info command is no longer pretty-printed. Monitoring systems can more easily ingest the JSON without linefeeds. External tools such as jq can be used to pretty-print if desired. (Contributed by Cynthia Shang. Reviewed by David Steele.)
  • The check command is implemented entirely in C. (Contributed by Cynthia Shang. Reviewed by David Steele.)
Documentation Improvements:
  • Document how to contribute to pgBackRest. (Contributed by Cynthia Shang, David Steele.)
  • Document maximum version for auto-stop option. (Contributed by Brad Nicholson. Reviewed by David Steele.)
Test Suite Improvements:
  • Fix container test path being used when --vm=none. (Suggested by Stephen Frost.)
  • Fix mismatched timezone in expect test. (Suggested by Stephen Frost.)
  • Don't autogenerate embedded libc code by default. (Suggested by Stephen Frost.)
v2.18 Release Notes
PostgreSQL 12 Support
Released October 1, 2019
Features:
  • PostgreSQL 12 support.
  • Add info command set option for detailed text output. The additional details include databases that can be used for selective restore and a list of tablespaces and symlinks with their default destinations. (Contributed by Cynthia Shang. Reviewed by David Steele. Suggested by Stephen Frost, ejberdecia.)
  • Add standby restore type. This restore type automatically adds standby_mode=on to recovery.conf for PostgreSQL < 12 and creates standby.signal for PostgreSQL ≥ 12, creating a common interface between PostgreSQL versions. (Reviewed by Cynthia Shang.)
Improvements:
  • The restore command is implemented entirely in C. (Reviewed by Cynthia Shang.)
Documentation Improvements:
  • Document the relationship between db-timeout and protocol-timeout. (Contributed by Cynthia Shang. Reviewed by David Steele. Suggested by James Chanco Jr.)
  • Add documentation clarifications regarding standby repositories. (Contributed by Cynthia Shang. Reviewed by David Steele.)
  • Add FAQ for time-based Point-in-Time Recovery. (Contributed by Cynthia Shang. Reviewed by David Steele.)
v2.17 Release Notes
C Migrations and Bug Fixes
Released September 3, 2019
Bug Fixes:
  • Improve slow manifest build for very large quantities of tables/segments. (Reported by Jens Wilke.)
  • Fix exclusions for special files. (Reported by CluelessTechnologist, Janis Puris, Rachid Broum.)
Improvements:
  • The stanza-create/update/delete commands are implemented entirely in C. (Contributed by Cynthia Shang. Reviewed by David Steele.)
  • The start/stop commands are implemented entirely in C. (Contributed by Cynthia Shang. Reviewed by David Steele.)
  • Create log directories/files with 0750/0640 mode. (Suggested by Damiano Albani.)
Documentation Bug Fixes:
  • Fix yum.p.o package being installed when custom package specified. (Reported by Joe Ayers, John Harvey.)
Documentation Improvements:
  • Build pgBackRest as an unprivileged user. (Suggested by Laurenz Albe.)
v2.16 Release Notes
C Migrations and Bug Fixes
Released August 5, 2019
Bug Fixes:
  • Retry S3 RequestTimeTooSkewed errors instead of immediately terminating. (Reported by sean0101n, Tim Garton, Jesper St John, Aleš Zelený.)
  • Fix incorrect handling of transfer-encoding response to HEAD request. (Reported by Pavel Suderevsky.)
  • Fix scoping violations exposed by optimizations in gcc 9. (Reported by Christian Lange, Ned T. Crigler.)
Features:
  • Add repo-s3-port option for setting a non-standard S3 service port.
Improvements:
  • The local command for backup is implemented entirely in C. (Contributed by David Steele, Cynthia Shang.)
  • The check command is implemented partly in C. (Reviewed by Cynthia Shang.)
v2.15 Release Notes
C Implementation of Expire
Released June 25, 2019
Bug Fixes:
  • Fix archive retention expiring too aggressively. (Fixed by Cynthia Shang. Reviewed by David Steele. Reported by Mohamad El-Rifai.)
Improvements:
  • The expire command is implemented entirely in C. (Contributed by Cynthia Shang. Reviewed by David Steele.)
  • The local command for restore is implemented entirely in C.
  • Remove hard-coded PostgreSQL user so $PGUSER works. (Suggested by Julian Zhang, Janis Puris.)
  • Honor configure --prefix option. (Suggested by Daniel Westermann.)
  • Rename repo-s3-verify-ssl option to repo-s3-verify-tls. The new name is preferred because pgBackRest does not support any SSL protocol versions (they are all considered to be insecure). The old name will continue to be accepted.
Documentation Improvements:
  • Add FAQ to the documentation. (Contributed by Cynthia Shang. Reviewed by David Steele.)
  • Use wal_level=replica in the documentation for PostgreSQL ≥ 9.6. (Suggested by Patrick McLaughlin.)
v2.14 Release Notes
Bug Fix and Improvements
Released May 20, 2019
Bug Fixes:
  • Fix segfault when process-max > 8 for archive-push/archive-get. (Reported by Jens Wilke.)
Improvements:
  • Bypass database checks when stanza-delete issued with force. (Contributed by Cynthia Shang. Reviewed by David Steele. Suggested by hatifnatt.)
  • Add configure script for improved multi-platform support.
Documentation Features:
  • Add user guides for CentOS/RHEL 6/7.
v2.13 Release Notes
Bug Fixes
Released April 18, 2019
Bug Fixes:
  • Fix zero-length reads causing problems for IO filters that did not expect them. (Reported by brunre01, Jens Wilke, Tomasz Kontusz, guruguruguru.)
  • Fix reliability of error reporting from local/remote processes.
  • Fix Posix/CIFS error messages reporting the wrong filename on write/sync/close.
v2.12 Release Notes
C Implementation of Archive Push
Released April 11, 2019
IMPORTANT NOTE: The new TLS/SSL implementation forbids dots in S3 bucket names per RFC-2818. This security fix is required for compliant hostname verification.
Bug Fixes:
  • Fix issues when a path option is / terminated. (Reported by Marc Cousin.)
  • Fix issues when log-level-file=off is set for the archive-get command. (Reported by Brad Nicholson.)
  • Fix C code to recognize host:port option format like Perl does. (Reported by Kyle Nevins.)
  • Fix issues with remote/local command logging options.
Improvements:
  • The archive-push command is implemented entirely in C.
  • Increase process-max limit to 999. (Suggested by Rakshitha-BR.)
  • Improve error message when an S3 bucket name contains dots.
Documentation Improvements:
  • Clarify that S3-compatible object stores are supported. (Suggested by Magnus Hagander.)
v2.11 Release Notes
C Implementation of Archive Get
Released March 11, 2019
Bug Fixes:
  • Fix possible truncated WAL segments when an error occurs mid-write. (Reported by blogh.)
  • Fix info command missing WAL min/max when stanza specified. (Fixed by Stefan Fercot. Reviewed by David Steele.)
  • Fix non-compliant JSON for options passed from C to Perl. (Reported by Leo Khomenko.)
Improvements:
  • The archive-get command is implemented entirely in C.
  • Enable socket keep-alive on older Perl versions. (Contributed by Marc Cousin. Reviewed by David Steele.)
  • Error when parameters are passed to a command that does not accept parameters. (Suggested by Jason O'Donnell.)
  • Add hints when unable to find a WAL segment in the archive. (Suggested by Hans-Jürgen Schönig.)
  • Improve error when hostname cannot be found in a certificate. (Suggested by James Badger.)
  • Add additional options to backup.manifest for debugging purposes. (Contributed by blogh. Reviewed by David Steele.)
Documentation Improvements:
  • Update default documentation version to PostgreSQL 10.
v2.10 Release Notes
Bug Fixes
Released February 9, 2019
Bug Fixes:
  • Add unimplemented S3 driver method required for archive-get. (Reported by mibiio.)
  • Fix check for improperly configured pg-path. (Reported by James Chanco Jr.)
v2.09 Release Notes
Minor Improvements and Bug Fixes
Released January 30, 2019
Bug Fixes:
  • Fix issue with multiple async status files causing a hard error. (Reported by Vidhya Gurumoorthi, Joe Ayers, Douglas J Hunley.)
Improvements:
  • The info command is implemented entirely in C. (Contributed by Cynthia Shang. Reviewed by David Steele.)
  • Simplify info command text message when no stanzas are present. Replace the repository path with the repository.
  • Add _DARWIN_C_SOURCE flag to Makefile for MacOS builds. (Contributed by Douglas J Hunley. Reviewed by David Steele.)
  • Update address lookup in C TLS client to use modern methods. (Suggested by Bruno Friedmann.)
  • Include Posix-compliant header for strcasecmp() and fd_set. (Suggested by ucando.)
Documentation Bug Fixes:
  • Fix hard-coded repository path. (Reported by Heath Lord.)
Documentation Improvements:
  • Clarify that encryption is always performed client-side. (Suggested by Bruce Burdick.)
  • Add examples for building a documentation host.
  • Allow if in manifest variables, lists, and list items.
v2.08 Release Notes
Minor Improvements and Bug Fixes
Released January 2, 2019
Bug Fixes:
  • Remove request for S3 object info directly after putting it. (Reported by Matt Kunkel.)
  • Correct archive-get-queue-max to be size type. (Reported by Ronan Dunklau.)
  • Add error message when current user uid/gid does not map to a name. (Reported by Camilo Aguilar.)
  • Error when --target-action=shutdown specified for PostgreSQL < 9.5.
Improvements:
  • Set TCP keepalives on S3 connections. (Suggested by Ronan Dunklau.)
  • Reorder info command text output so most recent backup is output last. (Contributed by Cynthia Shang. Reviewed by David Steele. Suggested by Ryan Lambert.)
  • Change file ownership only when required.
  • Redact authentication header when throwing S3 errors. (Suggested by Brad Nicholson.)
Documentation Improvements:
  • Clarify when target-action is effective and PostgreSQL version support. (Suggested by Keith Fiske.)
  • Clarify that region/endpoint must be configured correctly for the bucket. (Suggested by Pritam Barhate.)
  • Add documentation for building the documentation.
v2.07 Release Notes
Automatic Backup Checksum Delta
Released November 16, 2018
Bug Fixes:
  • Fix issue with archive-push-queue-max not being honored on connection error. (Reported by Lardière Sébastien.)
  • Fix static WAL segment size used to determine if archive-push-queue-max has been exceeded.
  • Fix error after log file open failure when processing should continue. (Reported by vthriller.)
Features:
  • Automatically enable backup checksum delta when anomalies (e.g. timeline switch) are detected. (Contributed by Cynthia Shang. Reviewed by David Steele.)
Improvements:
  • Retry all S3 5xx errors rather than just 500 internal errors. (Suggested by Craig A. James.)
v2.06 Release Notes
Checksum Delta Backup and PostgreSQL 11 Support
Released October 15, 2018
Bug Fixes:
  • Fix missing URI encoding in S3 driver. (Reported by Dan Farrell.)
  • Fix incorrect error message for duplicate options in configuration files. (Reported by Jesper St John.)
  • Fix incorrectly reported error return in info logging. A return code of 1 from the archive-get was being logged as an error message at info level but otherwise worked correctly.
Features:
  • Add checksum delta for incremental backups. Checksum delta backups uses checksums rather than timestamps to determine if files have changed. (Contributed by Cynthia Shang. Reviewed by David Steele.)
  • PostgreSQL 11 support, including configurable WAL segment size.
Improvements:
  • Ignore all files in a linked tablespace directory except the subdirectory for the current version of PostgreSQL. Previously an error would be generated if other files were present and not owned by the PostgreSQL user.
  • Improve info command to display the stanza cipher type. (Contributed by Cynthia Shang. Reviewed by David Steele. Suggested by Douglas J Hunley.)
  • Improve support for special characters in filenames.
  • Allow delta option to be specified in the pgBackRest configuration file. (Contributed by Cynthia Shang. Reviewed by David Steele.)
Documentation Improvements:
  • Use command in authorized_hosts to improve SSH security. (Suggested by Stephen Frost, Magnus Hagander.)
  • List allowable values for the buffer-size option in the configuration reference. (Contributed by Cynthia Shang. Reviewed by David Steele. Suggested by Stéphane Schildknecht.)
v2.05 Release Notes
Environment Variable Options and Exclude Temporary/Unlogged Relations
Released August 31, 2018
Bug Fixes:
  • Fix issue where relative links in $PGDATA could be stored in the backup with the wrong path. This issue did not affect absolute links and relative tablespace links were caught by other checks. (Reported by Cynthia Shang.)
  • Remove incompletely implemented online option from the check command. Offline operation runs counter to the purpose of this command, which is to check if archiving and backups are working correctly. (Reported by Jason O'Donnell.)
  • Fix issue where errors raised in C were not logged when called from Perl. pgBackRest properly terminated with the correct error code but lacked an error message to aid in debugging. (Reported by Douglas J Hunley.)
  • Fix issue when a boolean option (e.g. delta) was specified more than once. (Reported by Yogesh Sharma.)
Features:
  • Allow any option to be set in an environment variable. This includes options that previously could only be specified on the command line, e.g. stanza, and secret options that could not be specified on the command-line, e.g. repo1-s3-key-secret.
  • Exclude temporary and unlogged relation (table/index) files from backup. Implemented using the same logic as the patches adding this feature to PostgreSQL, 8694cc96 and 920a5e50. Temporary relation exclusion is enabled in PostgreSQL ≥ 9.0. Unlogged relation exclusion is enabled in PostgreSQL ≥ 9.1, where the feature was introduced. (Contributed by Cynthia Shang. Reviewed by David Steele.)
  • Allow arbitrary directories and/or files to be excluded from a backup. Misuse of this feature can lead to inconsistent backups so read the --exclude documentation carefully before using. (Reviewed by Cynthia Shang.)
  • Add log-subprocess option to allow file logging for local and remote subprocesses.
  • PostgreSQL 11 Beta 3 support.
Improvements:
  • Allow zero-size files in backup manifest to reference a prior manifest regardless of timestamp delta. (Contributed by Cynthia Shang. Reviewed by David Steele.)
  • Improve asynchronous archive-get/archive-push performance by directly checking status files. (Contributed by Stephen Frost. Reviewed by David Steele.)
  • Improve error message when a command is missing the stanza option. (Suggested by Sarah Conway.)
Documentation Bug Fixes:
  • Fix invalid log level in log-path option reference. (Reported by Camilo Aguilar.)
Documentation Improvements:
  • Stop trying to arrange contributors in release.xml by last/first name. Contributor names have always been presented in the release notes exactly as given, but we tried to assign internal IDs based on last/first name which can be hard to determine and ultimately doesn't make sense. Inspired by Christophe's PostgresOpen 2017 talk, Human Beings Do Not Have a Primary Key. (Suggested by Christophe Pettus.)
Test Suite Improvements:
  • Error if LibC build is performed outside the test environment. LibC is no longer required for production builds.
v2.04 Release Notes
Critical Bug Fix for Backup Resume
Released July 5, 2018
IMPORTANT NOTE: This release fixes a critical bug in the backup resume feature. All resumed backups prior to this release should be considered inconsistent. A backup will be resumed after a prior backup fails, unless resume=n has been specified. A resumed backup can be identified by checking the backup log for the message aborted backup of same type exists, will be cleaned to remove invalid files and resumed. If the message exists, do not use this backup or any backup in the same set for a restore and check the restore logs to see if a resumed backup was restored. If so, there may be inconsistent data in the cluster.
Bug Fixes:
  • Fix critical bug in resume that resulted in inconsistent backups. A regression in v0.82 removed the timestamp comparison when deciding which files from the aborted backup to keep on resume. See note above for more details. (Reported by David Youatt, Yogesh Sharma, Stephen Frost.)
  • Fix error in selective restore when only one user database exists in the cluster. (Fixed by Cynthia Shang. Reviewed by David Steele. Reported by Nj Baliyan.)
  • Fix non-compliant ISO-8601 timestamp format in S3 authorization headers. AWS and some gateways were tolerant of space rather than zero-padded hours while others were not. (Fixed by Andrew Schwartz. Reviewed by David Steele.)
Features:
  • PostgreSQL 11 Beta 2 support.
Improvements:
  • Improve the HTTP client to set content-length to 0 when not specified by the server. S3 (and gateways) always set content-length or transfer-encoding but HTTP 1.1 does not require it and proxies (e.g. HAProxy) may not include either. (Suggested by Adam K. Sumner.)
  • Set search_path = 'pg_catalog' on PostgreSQL connections. (Suggested by Stephen Frost.)
Documentation Improvements:
  • Create a new section to describe building pgBackRest and build on a separate host.
  • Add sample S3 policy to restrict bucket privileges. (Suggested by Douglas J Hunley, Jason O'Donnell.)
v2.03 Release Notes
Single Executable to Deploy
Released May 22, 2018
Bug Fixes:
  • Fix potential buffer overrun in error message handling. (Reported by Lætitia.)
  • Fix archive write lock being taken for the synchronous archive-get command. (Reported by uspen.)
Improvements:
  • Embed exported C functions and Perl modules directly into the pgBackRest executable.
  • Use time_t instead of __time_t for better portability. (Suggested by Nick Floersch.)
  • Print total runtime in milliseconds at command end.
v2.02 Release Notes
Parallel Asynchronous Archive Get and Configuration Includes
Released May 6, 2018
Bug Fixes:
  • Fix directory syncs running recursively when only the specified directory should be synced. (Reported by Craig A. James.)
  • Fix archive-copy throwing path not found error for incr/diff backups. (Reported by yummyliu, Vitaliy Kukharik.)
  • Fix failure in manifest build when two or more files in PGDATA are linked to the same directory. (Reported by Vitaliy Kukharik.)
  • Fix delta restore failing when a linked file is missing.
  • Fix rendering of key/value and list options in help. (Reported by Clinton Adams.)
Features:
  • Add asynchronous, parallel archive-get. This feature maintains a queue of WAL segments to help reduce latency when PostgreSQL requests a WAL segment with restore_command.
  • Add support for additional pgBackRest configuration files. The directory is specified by the --config-include-path option. Add --config-path option for overriding the default base path of the --config and --config-include-path option. (Contributed by Cynthia Shang. Reviewed by David Steele.)
  • Add repo-s3-token option to allow temporary credentials tokens to be configured. pgBackRest currently has no way to request new credentials so the entire command (e.g. backup, restore) must complete before the credentials expire. (Contributed by Yogesh Sharma. Reviewed by David Steele.)
Improvements:
  • Update the archive-push-queue-max, manifest-save-threshold, and buffer-size options to accept values in KB, MB, GB, TB, or PB where the multiplier is a power of 1024. (Contributed by Cynthia Shang. Reviewed by David Steele.)
  • Make backup/restore path sync more efficient. Scanning the entire directory can be very expensive if there are a lot of small tables. The backup manifest contains the path list so use it to perform syncs instead of scanning the backup/restore path.
  • Show command parameters as well as command options in initial info log message.
  • Rename archive-queue-max option to archive-push-queue-max. This is consistent with the new archive-get-queue-max option. The old option name will continue to be accepted.
Documentation Bug Fixes:
  • Update docs with 32-bit support and caveats. 32-bit support was added in v1.26. (Reported by Viorel Tabara.)
Documentation Improvements:
  • Add monitoring examples using PostgreSQL and jq. (Suggested by Stephen Frost, Brian Faherty.)
  • Add example of command section usage to archiving configuration. (Suggested by Christophe Courtois.)
  • Remove documentation describing info --output=json as experimental.
  • Update out-of-date description for the spool-path option.
Test Suite Features:
  • Use lcov for C unit test coverage reporting. Switch from Devel::Cover because it would not report on branch coverage for reports converted from gcov. Incomplete branch coverage for a module now generates an error. Coverage of unit tests is not displayed in the report unless they are incomplete for either statement or branch coverage.
v2.01 Release Notes
Minor Bug Fixes and Improvements
Released March 19, 2018
Bug Fixes:
  • Fix --target-action and --recovery-option options being reported as invalid when restoring with --type=immediate. (Reported by Brad Nicholson.)
  • Immediately error when a secure option (e.g. repo1-s3-key) is passed on the command line. Since pgBackRest would not pass secure options on to sub-processes an obscure error was thrown. The new error is much clearer and provides hints about how to fix the problem. Update command documentation to omit secure options that cannot be specified on the command-line. (Reported by Brad Nicholson.)
  • Fix issue passing --no-config to embedded Perl. (Reported by Ibrahim Edib Kokdemir.)
  • Fix issue where specifying log-level-stderr > warn would cause a local/remote process to error on exit due to output found on stderr when none was expected. The max value for a local/remote process is now error since there is no reason for these processes to emit warnings. (Reported by Clinton Adams.)
  • Fix manifest test in the check command when tablespaces are present. (Fixed by Cynthia Shang. Reviewed by David Steele. Reported by Thomas Flatley.)
Improvements:
  • Error when multiple arguments are set in the config file for an option that does not accept multiple arguments. (Contributed by Cynthia Shang. Reviewed by David Steele.)
  • Remove extraneous sudo commands from src/Makefile. (Contributed by Adrian Vondendriesch. Reviewed by David Steele.)
Documentation Improvements:
  • Show index in examples for indexed options, i.e. repo-*, pg-*. (Suggested by Stephen Frost.)
  • Simplify table of contents on command page by only listing commands. (Suggested by Stephen Frost.)
  • Remove references to the C library being optional.
Test Suite Features:
  • Add CentOS/RHEL package builds.
  • Use clang for static code analysis. Nothing found initially except for some functions that should have been marked __noreturn__.
v2.00 Release Notes
Performance Improvements for Archive Push
Released February 23, 2018
Features:
  • The archive-push command is now partially coded in C which allows the PostgreSQL archive_command to run significantly faster when processing status messages from the asynchronous archive process. (Reviewed by Cynthia Shang.)
Improvements:
  • Improve check command to verify that the backup manifest can be built. (Contributed by Cynthia Shang. Reviewed by David Steele.)
  • Improve performance of HTTPS client. Buffering now takes the pending bytes on the socket into account (when present) rather than relying entirely on select(). In some instances the final bytes would not be flushed until the connection was closed.
  • Improve S3 delete performance. The constant S3_BATCH_MAX had been replaced with a hard-coded value of 2, probably during testing.
  • Allow any non-command-line option to be reset to default on the command-line. This allows options in pgbackrest.conf to be reset to default which reduces the need to write new configuration files for specific needs.
  • The C library is now required. This eliminates conditional loading and eases development of new library features.
  • The pgbackrest executable is now a C binary instead of Perl. This allows certain time-critical commands (like async archive-push) to run more quickly.
  • Rename db-* options to pg-* and backup-* options to repo-* to improve consistency. repo-* options are now indexed although currently only one is allowed.
Documentation Features:
  • All clusters in the documentation are initialized with checksums.
Documentation Improvements:
  • List deprecated option names in documentation and command-line help.
  • Clarify that S3 buckets must be created by the user. (Suggested by David Youatt.)
v1.29 Release Notes
Critical Bug Fix for Backup Resume
Released July 5, 2018
IMPORTANT NOTE: This release fixes a critical bug in the backup resume feature. All resumed backups prior to this release should be considered inconsistent. A backup will be resumed after a prior backup fails, unless resume=n has been specified. A resumed backup can be identified by checking the backup log for the message aborted backup of same type exists, will be cleaned to remove invalid files and resumed. If the message exists, do not use this backup or any backup in the same set for a restore and check the restore logs to see if a resumed backup was restored. If so, there may be inconsistent data in the cluster.
Bug Fixes:
  • Fix critical bug in resume that resulted in inconsistent backups. A regression in v0.82 removed the timestamp comparison when deciding which files from the aborted backup to keep on resume. See note above for more details. (Reported by David Youatt, Yogesh Sharma, Stephen Frost.)
  • Fix non-compliant ISO-8601 timestamp format in S3 authorization headers. AWS and some gateways were tolerant of space rather than zero-padded hours while others were not. (Fixed by Andrew Schwartz. Reviewed by David Steele.)
  • Fix directory syncs running recursively when only the specified directory should be synced. (Reported by Craig A. James.)
  • Fix --target-action and --recovery-option options being reported as invalid when restoring with --type=immediate. (Reported by Brad Nicholson.)
  • Fix archive-copy throwing path not found error for incr/diff backups. (Reported by yummyliu, Vitaliy Kukharik.)
  • Fix failure in manifest build when two or more files in PGDATA are linked to the same directory. (Reported by Vitaliy Kukharik.)
  • Fix delta restore failing when a linked file was missing.
  • Fix error in selective restore when only one user database exists in the cluster. (Fixed by Cynthia Shang. Reviewed by David Steele. Reported by Nj Baliyan.)
Improvements:
  • Improve the HTTP client to set content-length to 0 when not specified by the server. S3 (and gateways) always set content-length or transfer-encoding but HTTP 1.1 does not require it and proxies (e.g. HAProxy) may not include either. (Suggested by Adam K. Sumner.)
  • Improve performance of HTTPS client. Buffering now takes the pending bytes on the socket into account (when present) rather than relying entirely on select(). In some instances the final bytes would not be flushed until the connection was closed.
  • Improve S3 delete performance. The constant S3_BATCH_MAX had been replaced with a hard-coded value of 2, probably during testing.
  • Make backup/restore path sync more efficient. Scanning the entire directory can be very expensive if there are a lot of small tables. The backup manifest contains the path list so use it to perform syncs instead of scanning the backup/restore path. Remove recursive path sync functionality since it is no longer used.
Documentation Bug Fixes:
  • Update docs with 32-bit support and caveats. 32-bit support was added in v1.26. (Reported by Viorel Tabara.)
Documentation Improvements:
  • Clarify that S3 buckets must be created by the user. (Suggested by David Youatt.)
  • Update out-of-date description for the spool-path option.
v1.28 Release Notes
Stanza Delete
Released February 1, 2018
Bug Fixes:
  • Fixed inability to restore a single database contained in a tablespace using --db-include. (Fixed by Cynthia Shang. Reviewed by David Steele. Reported by Chiranjeevi Ravilla.)
  • Ensure latest db-id is selected on when matching archive.info to backup.info. This provides correct matching in the event there are system-id and db-version duplicates (e.g. after reverting a pg_upgrade). (Fixed by Cynthia Shang. Reviewed by David Steele. Reported by Adam K. Sumner.)
  • Fixed overly chatty error message when reporting an invalid command. (Reported by Jason O'Donnell.)
Features:
  • Add stanza-delete command to cleanup unused stanzas. (Contributed by Cynthia Shang. Reviewed by David Steele. Suggested by Magnus Hagander.)
Improvements:
  • Improve stanza-create command so that it does not error when the stanza already exists. (Contributed by Cynthia Shang. Reviewed by David Steele.)
Documentation Improvements:
  • Update stanza-create --force documentation to urge caution when using. (Suggested by Jason O'Donnell.)
v1.27 Release Notes
Bug Fixes and Documentation
Released December 19, 2017
Bug Fixes:
  • Fixed an issue that suppressed locality errors for backup and restore. When a backup host is present, backups should only be allowed on the backup host and restores should only be allowed on the database host unless an alternate configuration is created that ignores the remote host. (Reported by Lardière Sébastien.)
  • Fixed an issue where WAL was not expired on PostgreSQL 10. This was caused by a faulty regex that expected all PostgreSQL major versions to be X.X. (Reported by Adam Brusselback.)
  • Fixed an issue where the --no-config option was not passed to child processes. This meant the child processes would still read the local config file and possibly cause unexpected behaviors.
  • Fixed info command to eliminate "db (prior)" output if no backups or archives exist for a prior version of the cluster. (Fixed by Cynthia Shang. Reviewed by David Steele. Reported by Stephen Frost.)
Documentation Features:
  • Document the relationship between the archive-copy and archive-check options. (Suggested by Markus Nullmeier.)
  • Improve archive-copy reference documentation.
v1.26 Release Notes
Repository Encryption
Released November 21, 2017
Bug Fixes:
  • Fixed an issue that could cause copying large manifests to fail during restore. (Reported by Craig A. James.)
  • Fixed incorrect WAL offset for 32-bit architectures. (Fixed by Javier Wilson. Reviewed by David Steele.)
  • Fixed an issue retrieving WAL for old database versions. After a stanza-upgrade it should still be possible to restore backups from the previous version and perform recovery with archive-get. However, archive-get only checked the most recent db version/id and failed. Also clean up some issues when the same db version/id appears multiple times in the history. (Fixed by Cynthia Shang. Reviewed by David Steele. Reported by Clinton Adams.)
  • Fixed an issue with invalid backup groups being set correctly on restore. If the backup cannot map a group to a name it stores the group in the manifest as false then uses either the owner of $PGDATA to set the group during restore or failing that the group of the current user. This logic was not working correctly because the selected group was overwriting the user on restore leaving the group undefined and the user incorrectly set to the group. (Reported by Jeff McCormick.)
  • Fixed an issue passing parameters to remotes. When more than one db was specified the path, port, and socket path would for db1 were passed no matter which db was actually being addressed. (Reported by uspen.)
Features:
  • Repository encryption support. (Contributed by Cynthia Shang, David Steele.)
Improvements:
  • Disable gzip filter when --compress-level-network=0. The filter was used with compress level set to 0 which added overhead without any benefit.
  • Inflate performance improvement for gzip filter.
Documentation Features:
  • Add template to improve initial information gathered for issue submissions. (Contributed by Cynthia Shang. Reviewed by David Steele.)
Documentation Improvements:
  • Clarify usage of the archive-timeout option and describe how it is distinct from the PostgreSQL archive_timeout setting. (Contributed by Cynthia Shang. Reviewed by David Steele. Suggested by Keith Fiske.)
Test Suite Features:
  • Automated tests for 32-bit i386/i686 architecture.
v1.25 Release Notes
S3 Performance Improvements
Released October 24, 2017
Bug Fixes:
  • Fix custom settings for compress-level option being ignored. (Reported by Jens Wilke.)
  • Remove error when overlapping timelines are detected. Overlapping timelines are valid in many Point-in-Time-Recovery (PITR) scenarios. (Reported by blogh.)
  • Fix instances where database-id was not rendered as an integer in JSON info output. (Fixed by Cynthia Shang. Reviewed by David Steele. Reported by Jason O'Donnell.)
Features:
  • Improve performance of list requests on S3. Any beginning literal portion of a filter expression is used to generate a search prefix which often helps keep the request small enough to avoid rate limiting. (Suggested by Mihail Shvein.)
Test Suite Features:
  • Add I/O performance tests.
v1.24 Release Notes
New Backup Exclusions
Released September 28, 2017
Bug Fixes:
  • Fixed an issue where warnings were being emitted in place of lower priority log messages during backup from standby initialization. (Reported by uspen.)
  • Fixed an issue where some db-* options (e.g. db-port) were not being passed to remotes. (Reported by uspen.)
Features:
  • Exclude contents of pg_snapshots, pg_serial, pg_notify, and pg_dynshmem from backup since they are rebuilt on startup.
  • Exclude pg_internal.init files from backup since they are rebuilt on startup.
Improvements:
  • Open log file after async process is completely separated from the main process to prevent the main process from also logging to the file. (Suggested by Jens Wilke.)
Documentation Features:
  • Add passwordless SSH configuration.
Documentation Improvements:
  • Rename master to primary in documentation to align with PostgreSQL convention.
v1.23 Release Notes
Multiple Standbys and PostgreSQL 10 Support
Released September 3, 2017
Bug Fixes:
  • Fixed an issue that could cause compression to abort on growing files. (Reported by Jesper St John, Aleksandr Rogozin.)
  • Fixed an issue with keep-alives not being sent to the remote from the local process. (Reported by William Cox.)
Features:
  • Up to seven standbys can be configured for backup from standby. (Contributed by Cynthia Shang. Reviewed by David Steele.)
  • PostgreSQL 10 support.
  • Allow content-length (in addition to chunked encoding) when reading XML data to improve compatibility with third-party S3 gateways. (Suggested by Victor Gdalevich.)
Improvements:
  • Increase HTTP timeout for S3.
  • Add HTTP retries to harden against transient S3 network errors.
Documentation Bug Fixes:
  • Fixed document generation to include section summaries on the Configuration page. (Fixed by Cynthia Shang. Reviewed by David Steele.)
v1.22 Release Notes
Fixed S3 Retry
Released August 9, 2017
Bug Fixes:
  • Fixed authentication issue in S3 retry.
v1.21 Release Notes
Improved Info Output and SSH Port Option
Released August 8, 2017
Bug Fixes:
  • The archive_status directory is now recreated on restore to support PostgreSQL 8.3 which does not recreate it automatically like more recent versions do. (Reported by Stephen Frost.)
  • Fixed an issue that could cause the empty archive directory for an old PostgreSQL version to be left behind after a stanza-upgrade. (Fixed by Cynthia Shang. Reviewed by David Steele.)
Features:
  • Modified the info command (both text and JSON output) to display the archive ID and minimum/maximum WAL currently present in the archive for the current and prior, if any, database cluster version. (Contributed by Cynthia Shang. Reviewed by David Steele.)
  • Added --backup-ssh-port and --db-ssh-port options to support non-default SSH ports. (Contributed by Cynthia Shang. Reviewed by David Steele.)
Improvements:
  • Retry when S3 returns an internal error (500).
Documentation Bug Fixes:
  • Fix description of --online based on the command context.
Documentation Features:
  • Add creation of /etc/pgbackrest.conf to manual installation instructions.
Documentation Improvements:
  • Move repository options into a separate section in command/command-line help. (Suggested by Stephen Frost.)
v1.20 Release Notes
Critical 8.3/8.4 Bug Fix
Released June 27, 2017
IMPORTANT NOTE: PostgreSQL 8.3 and 8.4 installations utilizing tablespaces should upgrade immediately from any v1 release and run a full backup. A bug prevented tablespaces from being backed up on these versions only. PostgreSQL ≥ 9.0
Bug Fixes:
  • Fixed an issue that prevented tablespaces from being backed up on PostgreSQL ≤ 8.4.
  • Fixed missing flag in C library build that resulted in a mismatched binary on 32-bit systems. (Reported by Adrian Vondendriesch.)
Features:
  • Add s3-repo-ca-path and s3-repo-ca-file options to accommodate systems where CAs are not automatically found by IO::Socket::SSL, i.e. RHEL7, or to load custom CAs. (Suggested by Scott Frazer.)
Test Suite Features:
  • Add documentation builds to CI.
v1.19 Release Notes
S3 Support
Released June 12, 2017
Bug Fixes:
  • Fixed the info command so the WAL archive min/max displayed is for the current database version. (Fixed by Cynthia Shang. Reviewed by David Steele.)
  • Fixed the backup command so the backup-standby option is reset (and the backup proceeds on the primary) if the standby is not configured and/or reachable. (Fixed by Cynthia Shang. Reviewed by David Steele.)
  • Fixed config warnings raised from a remote process causing errors in the master process. (Fixed by Cynthia Shang. Reviewed by David Steele.)
Features:
  • Amazon S3 repository support. (Reviewed by Cynthia Shang.)
Documentation Bug Fixes:
  • Changed invalid max-archive-mb option in configuration reference to archive-queue-max.
  • Fixed missing sudo in installation section. (Fixed by Lætitia. Reviewed by David Steele.)
v1.18 Release Notes
Stanza Upgrade, Refactoring, and Locking Improvements
Released April 12, 2017
Bug Fixes:
  • Fixed an issue where read-only operations that used local worker processes (i.e. restore) were creating write locks that could interfere with parallel archive-push. (Reported by Jens Wilke.)
Features:
  • Added the stanza-upgrade command to provide a mechanism for upgrading a stanza after upgrading to a new major version of PostgreSQL. (Contributed by Cynthia Shang. Reviewed by David Steele.)
  • Added validation of pgbackrest.conf to display warnings if options are not valid or are not in the correct section. (Contributed by Cynthia Shang. Reviewed by David Steele.)
Improvements:
  • Simplify locking scheme. Now, only the master process will hold write locks (for archive-push and backup commands) and not all local and remote worker processes as before.
  • Do not set timestamps of files in the backup directories to match timestamps in the cluster directory. This was originally done to enable backup resume, but that process is now implemented with checksums.
  • Improved error message when the restore command detects the presence of postmaster.pid. (Suggested by Yogesh Sharma.)
  • Renumber return codes between 25 and 125 to avoid PostgreSQL interpreting some as fatal signal exceptions. (Suggested by Yogesh Sharma.)
v1.17 Release Notes
Page Checksum Bug Fix
Released March 13, 2017
Bug Fixes:
  • Fixed an issue where newly initialized (but unused) pages would cause page checksum warnings. (Reported by Stephen Frost.)
v1.16 Release Notes
Page Checksum Improvements, CI, and Package Testing
Released March 2, 2017
Bug Fixes:
  • Fixed an issue where tables over 1GB would report page checksum warnings after the first segment. (Reported by Stephen Frost.)
  • Fixed an issue where databases created with a non-default tablespace would raise bogus warnings about pg_filenode.map and pg_internal.init not being page aligned. (Reported by blogh.)
Test Suite Features:
  • Continuous integration using travis-ci.
  • Automated builds of Debian packages for all supported distributions.
v1.15 Release Notes
Refactoring and Bug Fixes
Released February 13, 2017
Bug Fixes:
  • Fixed a regression introduced in v1.13 that could cause backups to fail if files were removed (e.g. tables dropped) while the manifest was being built. (Reported by Navid Golpayegani.)
v1.14 Release Notes
Refactoring and Bug Fixes
Released February 13, 2017
Bug Fixes:
  • Fixed an issue where an archive-push error would not be retried and would instead return errors to PostgreSQL indefinitely (unless the .error file was manually deleted). (Reported by Jens Wilke.)
  • Fixed a race condition in parallel archiving where creation of new paths generated an error when multiple processes attempted to do so at the same time. (Reported by Jens Wilke.)
Improvements:
  • Improved performance of wal archive min/max provided by the info command. (Suggested by Jens Wilke.)
Documentation Features:
  • Updated async archiving documentation to more accurately describe how the new method works and how it differs from the old method. (Suggested by Jens Wilke.)
v1.13 Release Notes
Parallel Archiving, Stanza Create, Improved Info and Check
Released February 5, 2017
IMPORTANT NOTE: The new implementation of asynchronous archiving no longer copies WAL to a separate queue. If there is any WAL left over in the old queue after upgrading to 1.13, it will be abandoned and not pushed to the repository.

To prevent this outcome, stop archiving by setting archive_command = false. Next, drain the async queue by running pgbackrest --stanza=[stanza-name] archive-push and wait for the process to complete. Check that the queue in [spool-path]/archive/[stanza-name]/out is empty. Finally, install 1.13 and restore the original archive_command.

IMPORTANT NOTE: The stanza-create command is not longer optional and must be executed before backup or archiving can be performed on a new stanza. Pre-existing stanzas do not require stanza-create to be executed.
Bug Fixes:
  • Fixed const assignment giving compiler warning in C library. (Fixed by Adrian Vondendriesch. Reviewed by David Steele.)
  • Fixed a few directory syncs that were missed for the --repo-sync option.
  • Fixed an issue where a missing user/group on restore could cause an uninitialized value error in File->owner(). (Reported by Leonardo GG Avellar.)
  • Fixed an issue where protocol mismatch errors did not output the expected value.
  • Fixed a spurious archive-get log message that indicated an exit code of 1 was an abnormal termination.
Features:
  • Improved, multi-process implementation of asynchronous archiving.
  • Improved stanza-create command so that it can repair broken repositories in most cases and is robust enough to be made mandatory. (Contributed by Cynthia Shang. Reviewed by David Steele.)
  • Improved check command to run on a standby, though only basic checks are done because pg_switch_xlog() cannot be executed on a replica. (Contributed by Cynthia Shang. Reviewed by David Steele.)
  • Added archive and backup WAL ranges to the info command.
  • Added warning to update pg_tablespace.spclocation when remapping tablespaces in PostgreSQL < 9.2. (Contributed by blogh. Reviewed by David Steele.)
  • Remove remote lock requirements for the archive-get, restore, info, and check commands since they are read-only operations. (Suggested by Michael Vitale.)
Improvements:
  • Log file banner is not output until the first log entry is written. (Suggested by Jens Wilke.)
  • Reduced the likelihood of torn pages causing a false positive in page checksums by filtering on start backup LSN.
  • Remove Intel-specific optimization from C library build flags. (Contributed by Adrian Vondendriesch. Reviewed by David Steele.)
  • Remove --lock option. This option was introduced before the lock directory could be located outside the repository and is now obsolete.
  • Added --log-timestamp option to allow timestamps to be suppressed in logging. This is primarily used to avoid filters in the automated documentation.
  • Return proper error code when unable to convert a relative path to an absolute path. (Suggested by Yogesh Sharma.)
Documentation Features:
  • Added documentation to the User Guide for the process-max option. (Contributed by Cynthia Shang. Reviewed by David Steele.)
v1.12 Release Notes
Page Checksums, Configuration, and Bug Fixes
Released December 12, 2016
IMPORTANT NOTE: In prior releases it was possible to specify options on the command-line that were invalid for the current command without getting an error. An error will now be generated for invalid options so it is important to carefully check command-line options in your environment to prevent disruption.
Bug Fixes:
  • Fixed an issue where options that were invalid for the specified command could be provided on the command-line without generating an error. The options were ignored and did not cause any change in behavior, but it did lead to some confusion. Invalid options will now generate an error. (Reported by Nikhilchandra Kulkarni.)
  • Fixed an issue where internal symlinks were not being created for tablespaces in the repository. This issue was only apparent when trying to bring up clusters in-place manually using filesystem snapshots and did not affect normal backup and restore.
  • Fixed an issue that prevented errors from being output to the console before the logging system was initialized, i.e. while parsing options. Error codes were still being returned accurately so this would not have made a process look like it succeeded when it did not. (Reported by Adrian Vondendriesch.)
  • Fixed an issue where the db-port option specified on the backup server would not be properly passed to the remote unless it was from the first configured database. (Reported by Michael Vitale.)
Features:
  • Added the --checksum-page option to allow pgBackRest to validate page checksums in data files when checksums are enabled on PostgreSQL >= 9.3. Note that this functionality requires a C library which may not initially be available in OS packages. The option will automatically be enabled when the library is present and checksums are enabled on the cluster. (Suggested by Stephen Frost.)
  • Added the --repo-link option to allow internal symlinks to be suppressed when the repository is located on a filesystem that does not support symlinks. This does not affect any pgBackRest functionality, but the convenience link latest will not be created and neither will internal tablespace symlinks, which will affect the ability to bring up clusters in-place manually using filesystem snapshots.
  • Added the --repo-sync option to allow directory syncs in the repository to be disabled for file systems that do not support them, e.g. NTFS.
  • Added a predictable log entry to signal that a command has completed successfully. For example a backup ends successfully with: INFO: backup command end: completed successfully. (Suggested by Jens Wilke.)
Improvements:
  • For simplicity, the pg_control file is now copied with the rest of the files instead of by itself of at the end of the process. The backup command does not require this behavior and the restore copies to a temporary file which is renamed at the end of the restore.
Documentation Bug Fixes:
  • Fixed an issue that suppressed exceptions in PDF builds.
  • Fixed regression in section links introduced in v1.10.
Documentation Features:
  • Added Retention to QuickStart section.
v1.11 Release Notes
Bug Fix for Asynchronous Archiving Efficiency
Released November 17, 2016
Bug Fixes:
  • Fixed an issue where asynchronous archiving was transferring one file per execution instead of transferring files in batches. This regression was introduced in v1.09 and affected efficiency only, all WAL segments were correctly archived in asynchronous mode. (Reported by Stephen Frost.)
v1.10 Release Notes
Stanza Creation and Minor Bug Fixes
Released November 8, 2016
Bug Fixes:
  • Fixed an issue where a backup could error if no changes were made to a database between backups and only pg_control changed.
  • Fixed an issue where tablespace paths with the same prefix would cause an invalid link error. (Reported by Nikhilchandra Kulkarni.)
Features:
  • Added the stanza-create command to formalize creation of stanzas in the repository. (Contributed by Cynthia Shang. Reviewed by David Steele.)
Improvements:
  • Removed extraneous use lib directives from Perl modules. (Suggested by Devrim Gündüz.)
v1.09 Release Notes
9.6 Support, Configurability, and Bug Fixes
Released October 10, 2016
Bug Fixes:
  • Fixed the check command to prevent an error message from being logged if the backup directory does not exist. (Fixed by Cynthia Shang. Reviewed by David Steele.)
  • Fixed error message to properly display the archive command when an invalid archive command is detected. (Reported by Jason O'Donnell.)
  • Fixed an issue where the async archiver would not be started if archive-push did not have enough space to queue a new WAL segment. This meant that the queue would never be cleared without manual intervention (such as calling archive-push directly). PostgreSQL now receives errors when there is not enough space to store new WAL segments but the async process will still be started so that space is eventually freed. (Reported by Jens Wilke.)
  • Fixed a remote timeout that occurred when a local process generated checksums (during resume or restore) but did not copy files, allowing the remote to go idle. (Reported by Jens Wilke.)
Features:
  • Non-exclusive backups will automatically be used on PostgreSQL 9.6.
  • Added the cmd-ssh option to allow the ssh client to be specified. (Suggested by Jens Wilke.)
  • Added the log-level-stderr option to control whether console log messages are sent to stderr or stdout. By default this is set to warn which represents a change in behavior from previous versions, even though it may be more intuitive. Setting log-level-stderr=off will preserve the old behavior. (Suggested by Sascha Biberhofer.)
  • Set application_name to "pgBackRest [command]" for database connections. (Suggested by Jens Wilke.)
  • Check that archive_mode is enabled when archive-check option enabled.
Improvements:
  • Clarified error message when unable to acquire pgBackRest advisory lock to make it clear that it is not a PostgreSQL backup lock. (Suggested by Jens Wilke.)
  • pgBackRest version number included in command start INFO log output.
  • Process ID logged for local process start/stop INFO log output.
Documentation Features:
  • Added archive-timeout option documentation to the user guide. (Contributed by Cynthia Shang. Reviewed by David Steele.)
v1.08 Release Notes
Bug Fixes and Log Improvements
Released September 14, 2016
Bug Fixes:
  • Fixed an issue where local processes were not disconnecting when complete and could later timeout. (Reported by Todd Vernick.)
  • Fixed an issue where the protocol layer could timeout while waiting for WAL segments to arrive in the archive. (Reported by Todd Vernick.)
Improvements:
  • Cache file log output until the file is created to create a more complete log.
v1.07 Release Notes
Thread to Process Conversion and Bug Fixes
Released September 7, 2016
Bug Fixes:
  • Fixed an issue where tablespaces were copied from the primary during standby backup.
  • Fixed the check command so backup info is checked remotely and not just locally. (Fixed by Cynthia Shang. Reviewed by David Steele.)
  • Fixed an issue where retention-archive was not automatically being set when retention-archive-type=diff, resulting in a less aggressive than intended expiration of archive. (Fixed by Cynthia Shang. Reviewed by David Steele.)
Features:
  • Converted Perl threads to processes to improve compatibility and performance.
  • Exclude contents of $PGDATA/pg_replslot directory so that replication slots on the primary do not become part of the backup.
  • The archive-start and archive-stop settings are now filled in backup.manifest even when archive-check=n. (Suggested by Jens Wilke.)
  • Additional warnings when archive retention settings may not have the intended effect or would allow indefinite retention. (Contributed by Cynthia Shang. Reviewed by David Steele.)
  • Experimental support for non-exclusive backups in PostgreSQL 9.6 rc1. Changes to the control/catalog/WAL versions in subsequent release candidates may break compatibility but pgBackRest will be updated with each release to keep pace.
Documentation Bug Fixes:
  • Fixed minor documentation reproducibility issues related to binary paths.
Documentation Features:
  • Documentation for archive retention. (Contributed by Cynthia Shang. Reviewed by David Steele.)
v1.06 Release Notes
Backup from Standby and Bug Fixes
Released August 25, 2016
Bug Fixes:
  • Fixed an issue where a tablespace link that referenced another link would not produce an error, but instead skip the tablespace entirely. (Reported by Michael Vitale.)
  • Fixed an issue where options that should not allow multiple values could be specified multiple times in pgbackrest.conf without an error being raised. (Reported by Michael Vitale.)
  • Fixed an issue where the protocol-timeout option was not automatically increased when the db-timeout option was increased. (Reported by Todd Vernick.)
Features:
  • Backup from a standby cluster. A connection to the primary cluster is still required to start/stop the backup and copy files that are not replicated, but the vast majority of files are copied from the standby in order to reduce load on the primary.
  • More flexible configuration for databases. Master and standby can both be configured on the backup server and pgBackRest will automatically determine which is the primary. This means no configuration changes for backup are required after failing over from a primary to standby when a separate backup server is used.
  • Exclude directories during backup that are cleaned, recreated, or zeroed by PostgreSQL at startup. These include pgsql_tmp and pg_stat_tmp. The postgresql.auto.conf.tmp file is now excluded in addition to files that were already excluded: backup_label.old, postmaster.opts, postmaster.pid, recovery.conf, recovery.done.
  • Experimental support for non-exclusive backups in PostgreSQL 9.6 beta4. Changes to the control/catalog/WAL versions in subsequent betas may break compatibility but pgBackRest will be updated with each release to keep pace.
Improvements:
  • Improve error message for links that reference links in manifest build.
  • Added hints to error message when relative paths are detected in archive-push or archive-get.
  • Improve backup log messages to indicate which host the files are being copied from.
v1.05 Release Notes
Bug Fix for Tablespace Link Checking
Released August 9, 2016
Bug Fixes:
  • Fixed an issue where tablespace paths that had $PGDATA as a substring would be identified as a subdirectories of $PGDATA even when they were not. Also hardened relative path checking a bit. (Reported by Chris Fort.)
Documentation Features:
  • Added documentation for scheduling backups with cron. (Contributed by Cynthia Shang. Reviewed by David Steele.)
Documentation Improvements:
  • Moved the backlog from the pgBackRest website to the GitHub repository wiki. (Contributed by Cynthia Shang. Reviewed by David Steele.)
v1.04 Release Notes
Various Bug Fixes
Released July 30, 2016
Bug Fixes:
  • Fixed an issue an where an extraneous remote was created causing threaded backup/restore to possibly timeout and/or throw a lock conflict. (Reported by Michael Vitale.)
  • Fixed an issue where db-path was not required for the check command so an assert was raised when it was missing rather than a polite error message. (Reported by Michael Vitale.)
  • Fixed check command to throw an error when database version/id does not match that of the archive. (Fixed by Cynthia Shang. Reviewed by David Steele.)
  • Fixed an issue where a remote could try to start its own remote when the backup-host option was not present in pgbackrest.conf on the database server. (Reported by Lardière Sébastien.)
  • Fixed an issue where the contents of pg_xlog were being backed up if the directory was symlinked. This didn't cause any issues during restore but was a waste of space.
  • Fixed an invalid log() call in lock routines.
Features:
  • Experimental support for non-exclusive backups in PostgreSQL 9.6 beta3. Changes to the control/catalog/WAL versions in subsequent betas may break compatibility but pgBackRest will be updated with each release to keep pace.
Improvements:
  • Suppress banners on SSH protocol connections.
  • Improved remote error messages to identify the host where the error was raised.
  • All remote types now take locks. The exceptions date to when the test harness and pgBackRest were running in the same VM and no longer apply.
Documentation Features:
  • Added clarification on why the default for the backrest-user option is backrest. (Suggested by Michael Vitale.)
  • Updated information about package availability on supported platforms. (Suggested by Michael Vitale.)
v1.03 Release Notes
Check Command and Bug Fixes
Released July 2, 2016
Bug Fixes:
  • Fixed an issue where keep-alives could be starved out by lots of small files during multi-threaded backup. They were also completely absent from single/multi-threaded backup resume and restore checksumming. (Reported by Janice Parkinson, Chris Barber.)
  • Fixed an issue where the expire command would refuse to run when explicitly called from the command line if the db-host option was set. This was not an issue when expire was run automatically after a backup (Reported by Chris Barber.)
  • Fixed an issue where validation was being running on archive_command even when the archive-check option was disabled.
Features:
  • Added check command to validate that pgBackRest is configured correctly for archiving and backups. (Contributed by Cynthia Shang. Reviewed by David Steele.)
  • Added the protocol-timeout option. Previously protocol-timeout was set as db-timeout + 30 seconds.
  • Failure to shutdown remotes at the end of the backup no longer throws an exception. Instead a warning is generated that recommends a higher protocol-timeout.
  • Experimental support for non-exclusive backups in PostgreSQL 9.6 beta2. Changes to the control/catalog/WAL versions in subsequent betas may break compatibility but pgBackRest will be updated with each release to keep pace.
Improvements:
  • Improved handling of users/groups captured during backup that do not exist on the restore host. Also explicitly handle the case where user/group is not mapped to a name.
  • Option handling is now far more strict. Previously it was possible for a command to use an option that was not explicitly assigned to it. This was especially true for the backup-host and db-host options which are used to determine locality.
Documentation Improvements:
  • Allow a static date to be used for documentation to generate reproducible builds. (Suggested by Adrian Vondendriesch.)
  • Added documentation for asynchronous archiving to the user guide. (Contributed by Cynthia Shang. Reviewed by David Steele.)
  • Recommended install location for pgBackRest modules is now /usr/share/perl5 since /usr/lib/perl5 has been removed from the search path in newer versions of Perl.
  • Added instructions for removing prior versions of pgBackRest.
v1.02 Release Notes
Bug Fix for Perl 5.22
Released June 2, 2016
Bug Fixes:
  • Fix usage of sprintf() due to new constraints in Perl 5.22. Parameters not referenced in the format string are no longer allowed. (Fixed by Adrian Vondendriesch. Reviewed by David Steele.)
Documentation Bug Fixes:
  • Fixed syntax that was not compatible with Perl 5.2X. (Fixed by Christoph Berg, Adrian Vondendriesch. Reviewed by David Steele.)
  • Fixed absolute paths that were used for the PDF logo. (Reported by Adrian Vondendriesch.)
Documentation Features:
  • Release notes are now broken into sections so that bugs, features, and refactors are clearly delineated. An Additional Notes section has been added for changes to documentation and the test suite that do not affect the core code.
  • Added man page generation. (Contributed by Adrian Vondendriesch, David Steele.)
  • The change log was the last piece of documentation to be rendered in Markdown only. Wrote a converter so the document can be output by the standard renderers. The change log will now be located on the website and has been renamed to Releases. (Contributed by Cynthia Shang. Reviewed by David Steele.)
v1.01 Release Notes
Enhanced Info, Selective Restore, and 9.6 Support
Released May 17, 2016
Features:
  • Enhanced text output of info command to include timestamps, sizes, and the reference list for all backups. (Contributed by Cynthia Shang. Reviewed by David Steele.)
  • Allow selective restore of databases from a cluster backup. This feature can result in major space and time savings when only specific databases are restored. Unrestored databases will not be accessible but must be manually dropped before they will be removed from the shared catalogue. (Reviewed by Cynthia Shang, Greg Smith, Stephen Frost. Suggested by Stephen Frost.)
  • Experimental support for non-exclusive backups in PostgreSQL 9.6 beta1. Changes to the control/catalog/WAL versions in subsequent betas may break compatibility but pgBackRest will be updated with each release to keep pace. (Reviewed by Cynthia Shang.)
v1.00 Release Notes
New Repository Format and Configuration Scheme, Link Support
Released April 14, 2016
IMPORTANT NOTE: This flag day release breaks compatibility with older versions of pgBackRest. The manifest format, on-disk structure, configuration scheme, and the exe/path names have all changed. You must create a new repository to hold backups for this version of pgBackRest and keep your older repository for a time in case you need to do a restore. Restores from the prior repository will require the prior version of pgBackRest but because of name changes it is possible to have 1.00 and a prior version of pgBackRest installed at the same time. See the notes below for more detailed information on what has changed.
Features:
  • Implemented a new configuration scheme which should be far simpler to use. See the User Guide and Configuration Reference for details but for a simple configuration all options can now be placed in the stanza section. Options that are shared between stanzas can be placed in the [global] section. More complex configurations can still make use of command sections though this should be a rare use case. (Suggested by Michael Renner.)
  • The repo-path option now always refers to the repository where backups and archive are stored, whether local or remote, so the repo-remote-path option has been removed. The new spool-path option can be used to define a location for queueing WAL segments when archiving asynchronously. A local repository is no longer required.
  • The default configuration filename is now pgbackrest.conf instead of pg_backrest.conf. This was done for consistency with other naming changes but also to prevent old config files from being loaded accidentally when migrating to 1.00. (Suggested by Michael Renner, Stephen Frost.)
  • The default repository name was changed from /var/lib/backup to /var/lib/pgbackrest. (Suggested by Michael Renner, Stephen Frost.)
  • Lock files are now stored in /tmp/pgbackrest by default. These days /run/pgbackrest is the preferred location but that would require init scripts which are not part of this release. The lock-path option can be used to configure the lock directory.
  • Log files are now stored in /var/log/pgbackrest by default and no longer have the date appended so they can be managed with logrotate. The log-path option can be used to configure the log directory. (Suggested by Stephen Frost.)
  • Executable filename changed from pg_backrest to pgbackrest. (Suggested by Michael Renner, Stephen Frost.)
  • All files and directories linked from PGDATA are now included in the backup. By default links will be restored directly into PGDATA as files or directories. The --link-all option can be used to restore all links to their original locations. The --link-map option can be used to remap a link to a new location.
  • Removed --tablespace option and replaced with --tablespace-map-all option which should more clearly indicate its function.
  • Added detail log level which will output more information than info without being as verbose as debug.
Pre-Stable Releases
v0.92 Release Notes
Command-line Repository Path Fix
Released April 6, 2016
Bug Fixes:
  • Fixed an issue where the master process was passing --repo-remote-path instead of --repo-path to the remote and causing the lock files to be created in the default repository directory (/var/lib/backup), generally ending in failure. This was only an issue when --repo-remote-path was defined on the command line rather than in pg_backrest.conf. (Reported by Jan Wieck.)
v0.91 Release Notes
Tablespace Bug Fix and Minor Enhancements
Released March 22, 2016
IMPORTANT BUG FIX FOR TABLESPACES: A change to the repository format was accidentally introduced in 0.90 which means the on-disk backup was no longer a valid PostgreSQL cluster when the backup contained tablespaces. This only affected users who directly copied the backups to restore PostgreSQL clusters rather than using the restore command. However, the fix breaks compatibility with older backups that contain tablespaces no matter how they are being restored (pgBackRest will throw errors and refuse to restore). New full backups should be taken immediately after installing version 0.91 for any clusters that contain tablespaces. If older backups need to be restored then use a version of pgBackRest that matches the backup version.
Bug Fixes:
  • Fixed repository incompatibility introduced in pgBackRest 0.90. (Reported by Evan Benoit.)
Features:
  • Copy global/pg_control last during backups.
  • Write .info and .manifest files to temp before moving them to their final locations and fsync'ing.
  • Rename --no-start-stop option to --no-online.
Test Suite Features:
  • Static source analysis using Perl-Critic, currently passes on gentle.
v0.90 Release Notes
9.5 Support, Various Enhancements, and Minor Bug Fixes
Released February 7, 2016
Bug Fixes:
  • Fixed an issue where specifying --no-archive-check would throw a configuration error. (Reported by Jason O'Donnell.)
  • Fixed an issue where a temp WAL file left over after a well-timed system crash could cause the next archive-push to fail.
  • The retention-archive option can now be be safely set to less than backup retention (retention-full or retention-diff) without also specifying archive-copy=n. The WAL required to make the backups that fall outside of archive retention consistent will be preserved in the archive. However, in this case PITR will not be possible for the backups that fall outside of archive retention.
Features:
  • When backing up and restoring tablespaces pgBackRest only operates on the subdirectory created for the version of PostgreSQL being run against. Since multiple versions can live in a tablespace (especially during a binary upgrade) this prevents too many files from being copied during a backup and other versions possibly being wiped out during a restore. This only applies to PostgreSQL >= 9.0 — prior versions of PostgreSQL could not share a tablespace directory.
  • Generate an error when archive-check=y but archive_command does not execute pg_backrest. (Contributed by Jason O'Donnell. Reviewed by David Steele.)
  • Improved error message when repo-path or repo-remote-path does not exist.
  • Added checks for --delta and --force restore options to ensure that the destination is a valid $PGDATA directory. pgBackRest will check for the presence of PG_VERSION or backup.manifest (left over from an aborted restore). If neither file is found then --delta and --force will be disabled but the restore will proceed unless there are files in the $PGDATA directory (or any tablespace directories) in which case the operation will be aborted.
  • When restore --set=latest (the default) the actual backup restored will be output to the log.
  • Support for PostgreSQL 9.5 partial WAL segments and recovery_target_action setting. The archive_mode = 'always' setting is not yet supported.
  • Support for recovery_target = 'immediate' recovery setting introduced in PostgreSQL 9.4.
  • The following tablespace checks have been added: paths or files in pg_tblspc, relative links in pg_tblspc, tablespaces in $PGDATA. All three will generate errors.
v0.89 Release Notes
Timeout Bug Fix and Restore Read-Only Repositories
Released December 24, 2015
Bug Fixes:
  • Fixed an issue where longer-running backups/restores would timeout when remote and threaded. Keepalives are now used to make sure the remote for the main process does not timeout while the thread remotes do all the work. The error message for timeouts was also improved to make debugging easier. (Reported by Stephen Frost.)
Features:
  • Allow restores to be performed on a read-only repository by using --no-lock and --log-level-file=off. The --no-lock option can only be used with restores.
v0.88 Release Notes
Documentation and Minor Bug Fixes
Released November 22, 2015
Bug Fixes:
  • Fixed an issue where the start/stop commands required the --config option. (Reported by Dmitry Didovicher.)
  • Fixed an issue where log files were being overwritten instead of appended. (Reported by Stephen Frost, Dmitry Didovicher.)
  • Fixed an issue where backup-user was not optional.
Features:
  • Symlinks are no longer created in backup directories in the repository. These symlinks could point virtually anywhere and potentially be dangerous. Symlinks are still recreated during a restore. (Suggested by Stephen Frost.)
  • Added better messaging for backup expiration. Full and differential backup expirations are logged on a single line along with a list of all dependent backups expired.
  • Archive retention is automatically set to full backup retention if not explicitly configured.
Documentation Features:
  • Added documentation in the user guide for delta restores, expiration, dedicated backup hosts, starting and stopping pgBackRest, and replication.
v0.87 Release Notes
Website and User Guide
Released October 28, 2015
Features:
  • The backup_label.old and recovery.done files are now excluded from backups.
Documentation Features:
  • Added a new user guide that covers pgBackRest basics and some advanced topics including PITR. Much more to come, but it's a start. (Contributed by David Steele, Stephen Frost. Reviewed by Michael Renner, Cynthia Shang, Eric Radman, Dmitry Didovicher.)
v0.85 Release Notes
Start/Stop Commands and Minor Bug Fixes
Released October 8, 2015
Bug Fixes:
  • Fixed an issue where an error could be returned after a backup or restore completely successfully.
  • Fixed an issue where a resume would fail if temp files were left in the root backup directory when the backup failed. This scenario was likely if the backup process got terminated during the copy phase.
Features:
  • Added stop and start commands to prevent pgBackRest processes from running on a system where PostgreSQL is shutdown or the system needs to be quiesced for some other reason.
  • Experimental support for PostgreSQL 9.5 beta1. This may break when the control version or WAL magic changes in future versions but will be updated in each pgBackRest release to keep pace. All regression tests pass except for --target-resume tests (this functionality has changed in 9.5) and there is no testing yet for .partial WAL segments.
v0.82 Release Notes
Refactoring, Command-line Help, and Minor Bug Fixes
Released September 14, 2015
Bug Fixes:
  • Fixed an issue where resumed compressed backups were not preserving existing files.
  • Fixed an issue where resume and incr/diff would not ensure that the prior backup had the same compression and hardlink settings.
  • Fixed an issue where a cold backup using --no-start-stop could be started on a running PostgreSQL cluster without --force specified.
  • Fixed an issue where a thread could be started even when none were requested.
  • Fixed an issue where the pgBackRest version number was not being updated in backup.info and archive.info after an upgrade/downgrade.
  • Fixed an issue where the info command was throwing an exception when the repository contained no stanzas. (Reported by Stephen Frost.)
  • Fixed an issue where the PostgreSQL pg_stop_backup() NOTICEs were being output to stderr. (Reported by Stephen Frost.)
Features:
  • Experimental support for PostgreSQL 9.5 alpha2. This may break when the control version or WAL magic changes in future versions but will be updated in each pgBackRest release to keep pace. All regression tests pass except for --target-resume tests (this functionality has changed in 9.5) and there is no testing yet for .partial WAL segments.
Improvements:
  • Renamed recovery-setting option and section to recovery-option to be more consistent with pgBackRest naming conventions.
  • Added dynamic module loading to speed up commands, especially asynchronous archiving.
Documentation Features:
  • Command-line help is now extracted from the same XML source that is used for the other documentation and includes much more detail.
v0.80 Release Notes
DBI Support, Stability, and Convenience Features
Released August 9, 2015
Bug Fixes:
  • Fixed an issue that caused the formatted timestamp for both the oldest and newest backups to be reported as the current time by the info command. Only text output was affected -- json output reported the correct epoch values. (Reported by Michael Renner.)
  • Fixed protocol issue that was preventing ssh errors (especially on connection) from being logged.
Features:
  • The repository is now created and updated with consistent directory and file modes. By default umask is set to 0000 but this can be disabled with the neutral-umask setting. (Suggested by Cynthia Shang.)
  • Added the stop-auto option to allow failed backups to automatically be stopped when a new backup starts.
  • Added the db-timeout option to limit the amount of time pgBackRest will wait for pg_start_backup() and pg_stop_backup() to return.
  • Remove pg_control file at the beginning of the restore and copy it back at the very end. This prevents the possibility that a partial restore can be started by PostgreSQL.
  • Added checks to be sure the db-path setting is consistent with db-port by comparing the data_directory as reported by the cluster against the db-path setting and the version as reported by the cluster against the value read from pg_control. The db-socket-path setting is checked to be sure it is an absolute path.
  • Experimental support for PostgreSQL 9.5 alpha1. This may break when the control version or WAL magic changes in future versions but will be updated in each pgBackRest release to keep pace. All regression tests pass except for --target-resume tests (this functionality has changed in 9.5) and there is no testing yet for .partial WAL segments.
Improvements:
  • Now using Perl DBI and DBD::Pg for connections to PostgreSQL rather than psql. The cmd-psql and cmd-psql-option settings have been removed and replaced with db-port and db-socket-path. Follow the instructions in the Installation Guide to install DBD::Pg on your operating system.
Test Suite Features:
  • Added vagrant test configurations for Ubuntu 14.04 and CentOS 7.
v0.78 Release Notes
Remove CPAN Dependencies, Stability Improvements
Released July 13, 2015
Improvements:
  • Removed dependency on CPAN packages for multi-threaded operation. While it might not be a bad idea to update the threads and Thread::Queue packages, it is no longer necessary.
  • Modified wait backoff to use a Fibonacci rather than geometric sequence. This will make wait time grow less aggressively while still giving reasonable values.
Test Suite Features:
  • Added vagrant test configurations for Ubuntu 12.04 and CentOS 6.
v0.77 Release Notes
CentOS/RHEL 6 Support and Protocol Improvements
Released June 30, 2015
Features:
  • Added file and directory syncs to the File object for additional safety during backup/restore and archiving. (Suggested by Andres Freund.)
  • Added support for Perl 5.10.1 and OpenSSH 5.3 which are default for CentOS/RHEL 6. (Suggested by Eric Radman.)
  • Improved error message when backup is run without archive_command set and without --no-archive-check specified. (Suggested by Eric Radman.)
v0.75 Release Notes
New Repository Format, Info Command and Experimental 9.5 Support
Released June 14, 2015
IMPORTANT NOTE: This flag day release breaks compatibility with older versions of pgBackRest. The manifest format, on-disk structure, and the binary names have all changed. You must create a new repository to hold backups for this version of pgBackRest and keep your older repository for a time in case you need to do a restore. The pg_backrest.conf file has not changed but you'll need to change any references to pg_backrest.pl in cron (or elsewhere) to pg_backrest (without the .pl extension).
Features:
  • Added the info command.
  • Logging now uses unbuffered output. This should make log files that are being written by multiple threads less chaotic. (Suggested by Michael Renner.)
  • Experimental support for PostgreSQL 9.5. This may break when the control version or WAL magic changes but will be updated in each release.
Improvements:
  • More efficient file ordering for backup. Files are copied in descending size order so a single thread does not end up copying a large file at the end. This had already been implemented for restore.
v0.70 Release Notes
Stability Improvements for Archiving, Improved Logging and Help
Released June 1, 2015
Bug Fixes:
  • Fixed an issue where archive-copy would fail on an incr/diff backup when hardlink=n. In this case the pg_xlog path does not already exist and must be created. (Reported by Michael Renner.)
  • Fixed an issue in async archiving where archive-push was not properly returning 0 when archive-max-mb was reached and moved the async check after transfer to avoid having to remove the stop file twice. Also added unit tests for this case and improved error messages to make it clearer to the user what went wrong. (Reported by Michael Renner.)
  • Fixed a locking issue that could allow multiple operations of the same type against a single stanza. This appeared to be benign in terms of data integrity but caused spurious errors while archiving and could lead to errors in backup/restore. (Reported by Michael Renner.)
Features:
  • Allow duplicate WAL segments to be archived when the checksum matches. This is necessary for some recovery scenarios.
  • Allow comments/disabling in pg_backrest.conf using the # character. Only # characters in the first character of the line are honored. (Suggested by Michael Renner.)
  • Better logging before pg_start_backup() to make it clear when the backup is waiting on a checkpoint. (Suggested by Michael Renner.)
  • Various command behavior and logging fixes. (Reviewed by Michael Renner. Suggested by Michael Renner.)
Improvements:
  • Replaced JSON module with JSON::PP which ships with core Perl.
Documentation Bug Fixes:
  • Various help fixes. (Reviewed by Michael Renner. Reported by Michael Renner.)
v0.65 Release Notes
Improved Resume and Restore Logging, Compact Restores
Released May 11, 2015
Bug Fixes:
  • Fixed an issue where an absolute path was not written into recovery.conf when the restore was run with a relative path.
Features:
  • Better resume support. Resumed files are checked to be sure they have not been modified and the manifest is saved more often to preserve checksums as the backup progresses. More unit tests to verify each resume case.
  • Resume is now optional. Use the resume setting or --no-resume from the command line to disable.
  • More info messages during restore. Previously, most of the restore messages were debug level so not a lot was output in the log.
  • Added tablespace setting to allow tablespaces to be restored into the pg_tblspc path. This produces compact restores that are convenient for development, staging, etc. Currently these restores cannot be backed up as pgBackRest expects only links in the pg_tblspc path.
v0.61 Release Notes
Bug Fix for Uncompressed Remote Destination
Released April 21, 2015
Bug Fixes:
  • Fixed a buffering error that could occur on large, highly-compressible files when copying to an uncompressed remote destination. The error was detected in the decompression code and resulted in a failed backup rather than corruption so it should not affect successful backups made with previous versions.
v0.60 Release Notes
Better Version Support and WAL Improvements
Released April 19, 2015
Bug Fixes:
  • Pushing duplicate WAL now generates an error. This worked before only if checksums were disabled.
Features:
  • Database System IDs are used to make sure that all WAL in an archive matches up. This should help prevent misconfigurations that send WAL from multiple clusters to the same archive.
Test Suite Features:
  • Regression tests working back to PostgreSQL 8.3.
v0.50 Release Notes
Restore and Much More
Released March 25, 2015
Bug Fixes:
  • Fixed broken checksums and now they work with normal and resumed backups. Finally realized that checksums and checksum deltas should be functionally separated and this simplified a number of things. Issue #28 has been created for checksum deltas.
  • Fixed an issue where a backup could be resumed from an aborted backup that didn't have the same type and prior backup.
Features:
  • Added restore functionality.
  • All options can now be set on the command-line making pg_backrest.conf optional.
  • De/compression is now performed without threads and checksum/size is calculated in stream. That means file checksums are no longer optional.
  • Added option --no-start-stop to allow backups when Postgres is shut down. If postmaster.pid is present then --force is required to make the backup run (though if Postgres is running an inconsistent backup will likely be created). This option was added primarily for the purpose of unit testing, but there may be applications in the real world as well.
  • Checksum for backup.manifest to detect a corrupted/modified manifest.
  • Link latest always points to the last backup. This has been added for convenience and to make restores simpler.
Test Suite Features:
  • More comprehensive unit tests in all areas.
v0.30 Release Notes
Core Restructuring and Unit Tests
Released October 5, 2014
Documentation Features:
  • Added much needed documentation
Test Suite Features:
  • Fairly comprehensive unit tests for all the basic operations. More work to be done here for sure, but then there is always more work to be done on unit tests.
v0.19 Release Notes
Improved Error Reporting/Handling
Released May 13, 2014
Bug Fixes:
  • Found and squashed a nasty bug where file_copy() was defaulted to ignore errors. There was also an issue in file_exists() that was causing the test to fail when the file actually did exist. Together they could have resulted in a corrupt backup with no errors, though it is very unlikely.
v0.18 Release Notes
Return Soft Error When Archive Missing
Released April 13, 2014
Bug Fixes:
  • The archive-get command now returns a 1 when the archive file is missing to differentiate from hard errors (ssh connection failure, file copy error, etc.) This lets PostgreSQL know that the archive stream has terminated normally. However, this does not take into account possible holes in the archive stream. (Reported by Stephen Frost.)
v0.17 Release Notes
Warn When Archive Directories Cannot Be Deleted
Released April 3, 2014
Bug Fixes:
  • If an archive directory which should be empty could not be deleted backrest was throwing an error. There's a good fix for that coming, but for the time being it has been changed to a warning so processing can continue. This was impacting backups as sometimes the final archive file would not get pushed if the first archive file had been in a different directory (plus some bad luck).
v0.16 Release Notes
RequestTTY=yes for SSH Sessions
Released April 1, 2014
Bug Fixes:
  • Added RequestTTY=yes to ssh sessions. Hoping this will prevent random lockups.
v0.15 Release Notes
Added archive-get
Released March 29, 2014
Features:
  • Added archive-get functionality to aid in restores.
  • Added option to force a checkpoint when starting the backup, start-fast=y.
v0.11 Release Notes
Minor Fixes
Released March 26, 2014
Bug Fixes:
  • Removed master_stderr_discard option on database SSH connections. There have been occasional lockups and they could be related to issues originally seen in the file code. (Reported by Stephen Frost.)
  • Changed lock file conflicts on backup and expire commands to ERROR. They were set to DEBUG due to a copy-and-paste from the archive locks.
v0.10 Release Notes
Backup and Archiving are Functional
Released March 5, 2014
Features:
  • No restore functionality, but the backup directories are consistent PostgreSQL data directories. You'll need to either uncompress the files or turn off compression in the backup. Uncompressed backups on a ZFS (or similar) filesystem are a good option because backups can be restored locally via a snapshot to create logical backups or do spot data recovery.
  • Archiving is single-threaded. This has not posed an issue on our multi-terabyte databases with heavy write volume. Recommend a large WAL volume or to use the async option with a large volume nearby.
  • Backups are multi-threaded, but the Net::OpenSSH library does not appear to be 100% thread-safe so it will very occasionally lock up on a thread. There is an overall process timeout that resolves this issue by killing the process. Yes, very ugly.
  • Checksums are lost on any resumed backup. Only the final backup will record checksum on multiple resumes. Checksums from previous backups are correctly recorded and a full backup will reset everything.
  • The backup.manifest is being written as Storable because Config::IniFile does not seem to handle large files well. Would definitely like to save these as human-readable text.
Documentation Features:
  • Absolutely no documentation (outside the code). Well, excepting these release notes.