You've already forked pgbackrest
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:
@ -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"/>
|
||||
|
||||
|
@ -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(
|
||||
|
@ -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,
|
||||
|
@ -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;
|
||||
|
@ -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");
|
||||
|
||||
|
Reference in New Issue
Block a user