1
0
mirror of https://github.com/pgbackrest/pgbackrest.git synced 2025-07-15 01:04:37 +02:00

Add backup LSNs to info command output.

The backup LSNs are useful for performing LSN-based PITR. LSNs will not be displayed in the general text output (without --set) because they are probably not useful enough to deserve their own line.
This commit is contained in:
Stefan Fercot
2022-01-07 20:09:58 +01:00
committed by GitHub
parent bb4b30ddd3
commit d866dd5c29
5 changed files with 96 additions and 2 deletions

View File

@ -17,6 +17,17 @@
<release date="XXXX-XX-XX" version="2.38dev" title="UNDER DEVELOPMENT">
<release-core-list>
<release-improvement-list>
<release-item>
<github-pull-request id="1610"/>
<release-item-contributor-list>
<release-item-contributor id="stefan.fercot"/>
<release-item-reviewer id="david.steele"/>
</release-item-contributor-list>
<p>Add backup LSNs to <cmd>info</cmd> command output.</p>
</release-item>
<release-item>
<github-pull-request id="1611"/>

View File

@ -41,6 +41,7 @@ VARIANT_STRDEF_STATIC(BACKUP_KEY_DATABASE_REF_VAR, "database-re
VARIANT_STRDEF_STATIC(BACKUP_KEY_INFO_VAR, "info");
VARIANT_STRDEF_STATIC(BACKUP_KEY_LABEL_VAR, "label");
VARIANT_STRDEF_STATIC(BACKUP_KEY_LINK_VAR, "link");
VARIANT_STRDEF_STATIC(BACKUP_KEY_LSN_VAR, "lsn");
VARIANT_STRDEF_STATIC(BACKUP_KEY_PRIOR_VAR, "prior");
VARIANT_STRDEF_STATIC(BACKUP_KEY_REFERENCE_VAR, "reference");
VARIANT_STRDEF_STATIC(BACKUP_KEY_TABLESPACE_VAR, "tablespace");
@ -395,6 +396,10 @@ backupListAdd(
Variant *backupInfo = varNewKv(kvNew());
// Flags used to decide what data to add
const bool outputJson = cfgOptionStrId(cfgOptOutput) == CFGOPTVAL_OUTPUT_JSON;
const bool backupLabelMatch = backupLabel != NULL && strEq(backupData->backupLabel, backupLabel);
// main keys
kvPut(varKv(backupInfo), BACKUP_KEY_LABEL_VAR, VARSTR(backupData->backupLabel));
kvPut(varKv(backupInfo), BACKUP_KEY_TYPE_VAR, VARSTR(strIdToStr(backupData->backupType)));
@ -450,8 +455,16 @@ backupListAdd(
if (backupData->backupError != NULL)
kvPut(varKv(backupInfo), BACKUP_KEY_ERROR_VAR, backupData->backupError);
// Add start/stop backup lsn info to json output or --set text
if ((outputJson || backupLabelMatch) && backupData->backupLsnStart != NULL && backupData->backupLsnStop != NULL)
{
KeyValue *const lsnInfo = kvPutKv(varKv(backupInfo), BACKUP_KEY_LSN_VAR);
kvPut(lsnInfo, KEY_START_VAR, VARSTR(backupData->backupLsnStart));
kvPut(lsnInfo, KEY_STOP_VAR, VARSTR(backupData->backupLsnStop));
}
// If a backup label was specified and this is that label, then get the data from the loaded manifest
if (backupLabel != NULL && strEq(backupData->backupLabel, backupLabel))
if (backupLabelMatch)
{
// Get the list of databases in this backup
VariantList *databaseSection = varLstNew();
@ -821,6 +834,16 @@ formatTextBackup(const DbGroup *dbGroup, String *resultStr)
else
strCatZ(resultStr, "n/a\n");
const KeyValue *const lsnInfo = varKv(kvGet(backupInfo, BACKUP_KEY_LSN_VAR));
if (lsnInfo != NULL)
{
strCatFmt(
resultStr, " lsn start/stop: %s / %s\n",
strZ(varStr(kvGet(lsnInfo, KEY_START_VAR))),
strZ(varStr(kvGet(lsnInfo, KEY_STOP_VAR))));
}
KeyValue *info = varKv(kvGet(backupInfo, BACKUP_KEY_INFO_VAR));
strCatFmt(

View File

@ -38,6 +38,8 @@ VARIANT_STRDEF_STATIC(INFO_BACKUP_KEY_BACKUP_INFO_REPO_SIZE_VAR, "backup-info
VARIANT_STRDEF_STATIC(INFO_BACKUP_KEY_BACKUP_INFO_REPO_SIZE_DELTA_VAR, "backup-info-repo-size-delta");
VARIANT_STRDEF_STATIC(INFO_BACKUP_KEY_BACKUP_INFO_SIZE_VAR, "backup-info-size");
VARIANT_STRDEF_STATIC(INFO_BACKUP_KEY_BACKUP_INFO_SIZE_DELTA_VAR, "backup-info-size-delta");
VARIANT_STRDEF_STATIC(INFO_BACKUP_KEY_BACKUP_LSN_START_VAR, "backup-lsn-start");
VARIANT_STRDEF_STATIC(INFO_BACKUP_KEY_BACKUP_LSN_STOP_VAR, "backup-lsn-stop");
VARIANT_STRDEF_STATIC(INFO_BACKUP_KEY_BACKUP_PRIOR_VAR, "backup-prior");
VARIANT_STRDEF_STATIC(INFO_BACKUP_KEY_BACKUP_REFERENCE_VAR, "backup-reference");
VARIANT_STRDEF_STATIC(INFO_BACKUP_KEY_BACKUP_TIMESTAMP_START_VAR, "backup-timestamp-start");
@ -159,6 +161,8 @@ infoBackupLoadCallback(void *data, const String *section, const String *key, con
// Possible NULL values
.backupArchiveStart = strDup(varStr(kvGet(backupKv, INFO_BACKUP_KEY_BACKUP_ARCHIVE_START_VAR))),
.backupArchiveStop = strDup(varStr(kvGet(backupKv, INFO_BACKUP_KEY_BACKUP_ARCHIVE_STOP_VAR))),
.backupLsnStart = strDup(varStr(kvGet(backupKv, INFO_BACKUP_KEY_BACKUP_LSN_START_VAR))),
.backupLsnStop = strDup(varStr(kvGet(backupKv, INFO_BACKUP_KEY_BACKUP_LSN_STOP_VAR))),
.backupPrior = strDup(varStr(kvGet(backupKv, INFO_BACKUP_KEY_BACKUP_PRIOR_VAR))),
.backupReference =
kvGet(backupKv, INFO_BACKUP_KEY_BACKUP_REFERENCE_VAR) != NULL ?
@ -245,6 +249,11 @@ infoBackupSaveCallback(void *data, const String *sectionNext, InfoSave *infoSave
kvPut(backupDataKv, INFO_BACKUP_KEY_BACKUP_ARCHIVE_START_VAR, VARSTR(backupData.backupArchiveStart));
kvPut(backupDataKv, INFO_BACKUP_KEY_BACKUP_ARCHIVE_STOP_VAR, VARSTR(backupData.backupArchiveStop));
if (backupData.backupLsnStart != NULL)
kvPut(backupDataKv, INFO_BACKUP_KEY_BACKUP_LSN_START_VAR, VARSTR(backupData.backupLsnStart));
if (backupData.backupLsnStop != NULL)
kvPut(backupDataKv, INFO_BACKUP_KEY_BACKUP_LSN_STOP_VAR, VARSTR(backupData.backupLsnStop));
if (backupData.backupPrior != NULL)
kvPut(backupDataKv, INFO_BACKUP_KEY_BACKUP_PRIOR_VAR, VARSTR(backupData.backupPrior));
@ -399,6 +408,8 @@ infoBackupDataAdd(const InfoBackup *this, const Manifest *manifest)
.backupArchiveStart = strDup(manData->archiveStart),
.backupArchiveStop = strDup(manData->archiveStop),
.backupLsnStart = strDup(manData->lsnStart),
.backupLsnStop = strDup(manData->lsnStop),
.optionArchiveCheck = manData->backupOptionArchiveCheck,
.optionArchiveCopy = manData->backupOptionArchiveCopy,

View File

@ -52,6 +52,8 @@ typedef struct InfoBackupData
uint64_t backupInfoRepoSizeDelta;
uint64_t backupInfoSize;
uint64_t backupInfoSizeDelta;
const String *backupLsnStart;
const String *backupLsnStop;
unsigned int backupPgId;
const String *backupPrior;
StringList *backupReference;

View File

@ -654,6 +654,7 @@ testRun(void)
"\"backrest-format\":5,\"backrest-version\":\"2.08dev\",\"backup-archive-start\":\"000000010000000000000003\","
"\"backup-info-repo-size\":2369186,"
"\"backup-info-repo-size-delta\":346,\"backup-info-size\":20162900,\"backup-info-size-delta\":8428,"
"\"backup-lsn-start\":\"285/89000028\",\"backup-lsn-stop\":\"285/89001F88\","
"\"backup-prior\":\"20181119-152138F_20181119-152152D\","
"\"backup-reference\":[\"20181119-152138F\",\"20181119-152138F_20181119-152152D\"],"
"\"backup-timestamp-start\":1542640915,\"backup-timestamp-stop\":1542640917,\"backup-type\":\"incr\","
@ -672,6 +673,7 @@ testRun(void)
"\"backup-archive-start\":\"000000010000000000000005\",\"backup-archive-stop\":\"000000010000000000000005\","
"\"backup-error\":false,\"backup-info-repo-size\":2369186,"
"\"backup-info-repo-size-delta\":346,\"backup-info-size\":20162900,\"backup-info-size-delta\":8428,"
"\"backup-lsn-start\":\"285/89000028\","
"\"backup-prior\":\"20201116-155000F\",\"backup-reference\":[\"20201116-155000F\"],"
"\"backup-timestamp-start\":1605799260,\"backup-timestamp-stop\":1605799263,\"backup-type\":\"incr\","
"\"db-id\":2,\"option-archive-check\":true,\"option-archive-copy\":false,\"option-backup-standby\":false,"
@ -1149,6 +1151,9 @@ testRun(void)
"\"size\":20162900"
"},"
"\"label\":\"20181119-152138F_20181119-152155I\","
"\"lsn\":{"
"\"start\":\"285/89000028\","
"\"stop\":\"285/89001F88\"},"
"\"prior\":\"20181119-152138F_20181119-152152D\","
"\"reference\":["
"\"20181119-152138F\","
@ -1588,6 +1593,7 @@ testRun(void)
" incr backup: 20181119-152138F_20181119-152155I\n"
" timestamp start/stop: 2018-11-19 15:21:55 / 2018-11-19 15:21:57\n"
" wal start/stop: n/a\n"
" lsn start/stop: 285/89000028 / 285/89001F88\n"
" database size: 19.2MB, database backup size: 8.2KB\n"
" repo1: backup set size: 2.3MB, backup size: 346B\n"
" backup reference list: 20181119-152138F, 20181119-152138F_20181119-152152D\n"
@ -1701,6 +1707,7 @@ testRun(void)
" incr backup: 20181119-152138F_20181119-152155I\n"
" timestamp start/stop: 2018-11-19 15:21:55 / 2018-11-19 15:21:57\n"
" wal start/stop: n/a\n"
" lsn start/stop: 285/89000028 / 285/89001F88\n"
" database size: 19.2MB, database backup size: 8.2KB\n"
" repo1: backup set size: 2.3MB, backup size: 346B\n"
" backup reference list: 20181119-152138F, 20181119-152138F_20181119-152152D\n"
@ -1762,12 +1769,52 @@ testRun(void)
" incr backup: 20181119-152138F_20181119-152155I\n"
" timestamp start/stop: 2018-11-19 15:21:55 / 2018-11-19 15:21:57\n"
" wal start/stop: n/a\n"
" lsn start/stop: 285/89000028 / 285/89001F88\n"
" database size: 19.2MB, database backup size: 8.2KB\n"
" repo1: backup set size: 2.3MB, backup size: 346B\n"
" backup reference list: 20181119-152138F, 20181119-152138F_20181119-152152D\n"
" database list: none\n",
"text - backup set requested, no db and no checksum error");
//--------------------------------------------------------------------------------------------------------------------------
TEST_TITLE("backup set requested with missing backup lsn stop location");
argList2 = strLstDup(argListTextStanzaOpt);
hrnCfgArgRawZ(argList2, cfgOptSet, "20201116-155000F_20201119-152100I");
hrnCfgArgRawZ(argList2, cfgOptRepo, "1");
HRN_CFG_LOAD(cfgCmdInfo, argList2);
HRN_INFO_PUT(
storageRepoWrite(), STORAGE_REPO_BACKUP "/20201116-155000F_20201119-152100I/" BACKUP_MANIFEST_FILE,
TEST_MANIFEST_HEADER2
TEST_MANIFEST_TARGET_NO_LINK
TEST_MANIFEST_NO_DB
TEST_MANIFEST_FILE_NO_CHECKSUM_ERROR
TEST_MANIFEST_FILE_DEFAULT
TEST_MANIFEST_LINK
TEST_MANIFEST_LINK_DEFAULT
TEST_MANIFEST_PATH
TEST_MANIFEST_PATH_DEFAULT,
.comment = "write manifest - without lsn info in header");
TEST_RESULT_STR_Z(
infoRender(),
"stanza: stanza1\n"
" status: ok\n"
" cipher: none\n"
"\n"
" db (current)\n"
" wal archive min/max (9.5): 000000010000000000000002/000000010000000000000005\n"
"\n"
" incr backup: 20201116-155000F_20201119-152100I\n"
" timestamp start/stop: 2020-11-19 15:21:00 / 2020-11-19 15:21:03\n"
" wal start/stop: 000000010000000000000005 / 000000010000000000000005\n"
" database size: 19.2MB, database backup size: 8.2KB\n"
" repo1: backup set size: 2.3MB, backup size: 346B\n"
" backup reference list: 20201116-155000F\n"
" database list: none\n",
"text - backup set requested, no lsn start/stop location");
//--------------------------------------------------------------------------------------------------------------------------
TEST_TITLE("multi-repo: stanza found");