diff --git a/doc/src/sgml/ref/pg_xlogdump.sgml b/doc/src/sgml/ref/pg_xlogdump.sgml index d9f4a6a499..1d78cf1a75 100644 --- a/doc/src/sgml/ref/pg_xlogdump.sgml +++ b/doc/src/sgml/ref/pg_xlogdump.sgml @@ -215,6 +215,12 @@ PostgreSQL documentation Only the specified timeline is displayed (or the default, if none is specified). Records in other timelines are ignored. + + + pg_xlogdump cannot read WAL files with suffix + .partial. If those files need to be read, .partial + suffix needs to be removed from the filename. + diff --git a/doc/src/sgml/ref/pgarchivecleanup.sgml b/doc/src/sgml/ref/pgarchivecleanup.sgml index 779159d7fc..db39deaca1 100644 --- a/doc/src/sgml/ref/pgarchivecleanup.sgml +++ b/doc/src/sgml/ref/pgarchivecleanup.sgml @@ -60,8 +60,10 @@ archive_cleanup_command = 'pg_archivecleanup archivelocation %r' When used as a standalone program all WAL files logically preceding the oldestkeptwalfile will be removed from archivelocation. - In this mode, if you specify a .backup file name, then only the file prefix - will be used as the oldestkeptwalfile. This allows you to remove + In this mode, if you specify a .partial or .backup + file name, then only the file prefix will be used as the + oldestkeptwalfile. This treatment of .backup + file name allows you to remove all WAL files archived prior to a specific base backup without error. For example, the following example will remove all files older than WAL file name 000000010000003700000010: diff --git a/src/bin/pg_archivecleanup/pg_archivecleanup.c b/src/bin/pg_archivecleanup/pg_archivecleanup.c index 579a9bb843..c5569f32a3 100644 --- a/src/bin/pg_archivecleanup/pg_archivecleanup.c +++ b/src/bin/pg_archivecleanup/pg_archivecleanup.c @@ -125,7 +125,7 @@ CleanupPriorWALFiles(void) * file. Note that this means files are not removed in the order * they were originally written, in case this worries you. */ - if (IsXLogFileName(walfile) && + if ((IsXLogFileName(walfile) || IsPartialXLogFileName(walfile)) && strcmp(walfile + 8, exclusiveCleanupFileName + 8) < 0) { /* @@ -181,7 +181,7 @@ CleanupPriorWALFiles(void) * SetWALFileNameForCleanup() * * Set the earliest WAL filename that we want to keep on the archive - * and decide whether we need_cleanup + * and decide whether we need cleanup */ static void SetWALFileNameForCleanup(void) @@ -192,9 +192,10 @@ SetWALFileNameForCleanup(void) /* * If restartWALFileName is a WAL file name then just use it directly. If - * restartWALFileName is a .backup filename, make sure we use the prefix - * of the filename, otherwise we will remove wrong files since - * 000000010000000000000010.00000020.backup is after + * restartWALFileName is a .partial or .backup filename, make sure we use + * the prefix of the filename, otherwise we will remove wrong files since + * 000000010000000000000010.partial and + * 000000010000000000000010.00000020.backup are after * 000000010000000000000010. */ if (IsXLogFileName(restartWALFileName)) @@ -202,6 +203,26 @@ SetWALFileNameForCleanup(void) strcpy(exclusiveCleanupFileName, restartWALFileName); fnameOK = true; } + else if (IsPartialXLogFileName(restartWALFileName)) + { + int args; + uint32 tli = 1, + log = 0, + seg = 0; + + args = sscanf(restartWALFileName, "%08X%08X%08X.partial", + &tli, &log, &seg); + if (args == 3) + { + fnameOK = true; + + /* + * Use just the prefix of the filename, ignore everything after + * first period + */ + XLogFileNameById(exclusiveCleanupFileName, tli, log, seg); + } + } else if (IsBackupHistoryFileName(restartWALFileName)) { int args; diff --git a/src/bin/pg_resetxlog/pg_resetxlog.c b/src/bin/pg_resetxlog/pg_resetxlog.c index e19a72b4c1..e7e8059a38 100644 --- a/src/bin/pg_resetxlog/pg_resetxlog.c +++ b/src/bin/pg_resetxlog/pg_resetxlog.c @@ -906,7 +906,8 @@ FindEndOfXLOG(void) while (errno = 0, (xlde = readdir(xldir)) != NULL) { - if (IsXLogFileName(xlde->d_name)) + if (IsXLogFileName(xlde->d_name) || + IsPartialXLogFileName(xlde->d_name)) { unsigned int tli, log, @@ -976,7 +977,8 @@ KillExistingXLOG(void) while (errno = 0, (xlde = readdir(xldir)) != NULL) { - if (IsXLogFileName(xlde->d_name)) + if (IsXLogFileName(xlde->d_name) || + IsPartialXLogFileName(xlde->d_name)) { snprintf(path, MAXPGPATH, "%s/%s", XLOGDIR, xlde->d_name); if (unlink(path) < 0) @@ -1028,7 +1030,9 @@ KillExistingArchiveStatus(void) { if (strspn(xlde->d_name, "0123456789ABCDEF") == XLOG_FNAME_LEN && (strcmp(xlde->d_name + XLOG_FNAME_LEN, ".ready") == 0 || - strcmp(xlde->d_name + XLOG_FNAME_LEN, ".done") == 0)) + strcmp(xlde->d_name + XLOG_FNAME_LEN, ".done") == 0 || + strcmp(xlde->d_name + XLOG_FNAME_LEN, ".partial.ready") == 0 || + strcmp(xlde->d_name + XLOG_FNAME_LEN, ".partial.done") == 0)) { snprintf(path, MAXPGPATH, "%s/%s", ARCHSTATDIR, xlde->d_name); if (unlink(path) < 0)