1
0
mirror of https://github.com/pgbackrest/pgbackrest.git synced 2025-10-30 23:37:45 +02:00

Add expire-auto option.

This allows automatic expiration after a successful backup to be disabled.
This commit is contained in:
Stefan Fercot
2020-07-14 14:12:25 +02:00
committed by GitHub
parent 083350aeda
commit d3dd32a031
11 changed files with 229 additions and 8 deletions

View File

@@ -251,6 +251,7 @@ use constant CFGOPT_ARCHIVE_COPY => 'archive-
use constant CFGOPT_BACKUP_STANDBY => 'backup-standby';
use constant CFGOPT_CHECKSUM_PAGE => 'checksum-page';
use constant CFGOPT_EXCLUDE => 'exclude';
use constant CFGOPT_EXPIRE_AUTO => 'expire-auto';
use constant CFGOPT_MANIFEST_SAVE_THRESHOLD => 'manifest-save-threshold';
use constant CFGOPT_RESUME => 'resume';
use constant CFGOPT_START_FAST => 'start-fast';
@@ -2345,6 +2346,17 @@ my %hConfigDefine =
},
},
&CFGOPT_EXPIRE_AUTO =>
{
&CFGDEF_SECTION => CFGDEF_SECTION_GLOBAL,
&CFGDEF_TYPE => CFGDEF_TYPE_BOOLEAN,
&CFGDEF_DEFAULT => true,
&CFGDEF_COMMAND =>
{
&CFGCMD_BACKUP => {},
}
},
&CFGOPT_MANIFEST_SAVE_THRESHOLD =>
{
&CFGDEF_SECTION => CFGDEF_SECTION_GLOBAL,

View File

@@ -757,6 +757,15 @@
<example>5G</example>
</config-key>
<!-- CONFIG - BACKUP SECTION - EXPIRE-AUTO -->
<config-key id="expire-auto" name="Expire Auto">
<summary>Automatically run the <cmd>expire</cmd> command after a successful backup.</summary>
<text>The setting is enabled by default. Use caution when disabling this option; doing so will result in retaining all backups and archives indefinitely which could cause your repository to run out of space.</text>
<example>y</example>
</config-key>
<!-- CONFIG - BACKUP SECTION - RESUME -->
<config-key id="resume" name="Resume">
<summary>Allow resume of failed backup.</summary>

View File

@@ -39,6 +39,18 @@
<p>Azure support for repository storage.</p>
</release-item>
<release-item>
<release-item-contributor-list>
<release-item-contributor id="stefan.fercot"/>
<release-item-reviewer id="cynthia.shang"/>
<release-item-reviewer id="david.steele"/>
</release-item-contributor-list>
<p>Add <br-option>expire-auto</br-option> option.</p>
<p>This allows automatic expiration after a successful backup to be disabled.</p>
</release-item>
</release-feature-list>
<release-improvement-list>

View File

@@ -306,6 +306,7 @@ STRING_EXTERN(CFGOPT_DB_TIMEOUT_STR, CFGOPT_DB_TI
STRING_EXTERN(CFGOPT_DELTA_STR, CFGOPT_DELTA);
STRING_EXTERN(CFGOPT_DRY_RUN_STR, CFGOPT_DRY_RUN);
STRING_EXTERN(CFGOPT_EXCLUDE_STR, CFGOPT_EXCLUDE);
STRING_EXTERN(CFGOPT_EXPIRE_AUTO_STR, CFGOPT_EXPIRE_AUTO);
STRING_EXTERN(CFGOPT_FILTER_STR, CFGOPT_FILTER);
STRING_EXTERN(CFGOPT_FORCE_STR, CFGOPT_FORCE);
STRING_EXTERN(CFGOPT_HOST_ID_STR, CFGOPT_HOST_ID);
@@ -675,6 +676,14 @@ static ConfigOptionData configOptionData[CFG_OPTION_TOTAL] = CONFIG_OPTION_LIST
CONFIG_OPTION_DEFINE_ID(cfgDefOptExclude)
)
//------------------------------------------------------------------------------------------------------------------------------
CONFIG_OPTION
(
CONFIG_OPTION_NAME(CFGOPT_EXPIRE_AUTO)
CONFIG_OPTION_INDEX(0)
CONFIG_OPTION_DEFINE_ID(cfgDefOptExpireAuto)
)
//------------------------------------------------------------------------------------------------------------------------------
CONFIG_OPTION
(

View File

@@ -99,6 +99,8 @@ Option constants
STRING_DECLARE(CFGOPT_DRY_RUN_STR);
#define CFGOPT_EXCLUDE "exclude"
STRING_DECLARE(CFGOPT_EXCLUDE_STR);
#define CFGOPT_EXPIRE_AUTO "expire-auto"
STRING_DECLARE(CFGOPT_EXPIRE_AUTO_STR);
#define CFGOPT_FILTER "filter"
STRING_DECLARE(CFGOPT_FILTER_STR);
#define CFGOPT_FORCE "force"
@@ -458,7 +460,7 @@ Option constants
#define CFGOPT_TYPE "type"
STRING_DECLARE(CFGOPT_TYPE_STR);
#define CFG_OPTION_TOTAL 202
#define CFG_OPTION_TOTAL 203
/***********************************************************************************************************************************
Command enum
@@ -515,6 +517,7 @@ typedef enum
cfgOptDelta,
cfgOptDryRun,
cfgOptExclude,
cfgOptExpireAuto,
cfgOptFilter,
cfgOptForce,
cfgOptHostId,

View File

@@ -1186,6 +1186,37 @@ static ConfigDefineOptionData configDefineOptionData[] = CFGDEFDATA_OPTION_LIST
)
)
// -----------------------------------------------------------------------------------------------------------------------------
CFGDEFDATA_OPTION
(
CFGDEFDATA_OPTION_NAME("expire-auto")
CFGDEFDATA_OPTION_REQUIRED(true)
CFGDEFDATA_OPTION_SECTION(cfgDefSectionGlobal)
CFGDEFDATA_OPTION_TYPE(cfgDefOptTypeBoolean)
CFGDEFDATA_OPTION_INTERNAL(false)
CFGDEFDATA_OPTION_INDEX_TOTAL(1)
CFGDEFDATA_OPTION_SECURE(false)
CFGDEFDATA_OPTION_HELP_SECTION("backup")
CFGDEFDATA_OPTION_HELP_SUMMARY("Automatically run the expire command after a successful backup.")
CFGDEFDATA_OPTION_HELP_DESCRIPTION
(
"The setting is enabled by default. Use caution when disabling this option; doing so will result in retaining all "
"backups and archives indefinitely which could cause your repository to run out of space."
)
CFGDEFDATA_OPTION_COMMAND_LIST
(
CFGDEFDATA_OPTION_COMMAND(cfgDefCmdBackup)
)
CFGDEFDATA_OPTION_OPTIONAL_LIST
(
CFGDEFDATA_OPTION_OPTIONAL_DEFAULT("1")
)
)
// -----------------------------------------------------------------------------------------------------------------------------
CFGDEFDATA_OPTION
(

View File

@@ -75,6 +75,7 @@ typedef enum
cfgDefOptDelta,
cfgDefOptDryRun,
cfgDefOptExclude,
cfgDefOptExpireAuto,
cfgDefOptFilter,
cfgDefOptForce,
cfgDefOptHostId,

View File

@@ -298,6 +298,21 @@ static const struct option optionList[] =
.val = PARSE_OPTION_FLAG | PARSE_RESET_FLAG | cfgOptExclude,
},
// expire-auto option
// -----------------------------------------------------------------------------------------------------------------------------
{
.name = CFGOPT_EXPIRE_AUTO,
.val = PARSE_OPTION_FLAG | cfgOptExpireAuto,
},
{
.name = "no-" CFGOPT_EXPIRE_AUTO,
.val = PARSE_OPTION_FLAG | PARSE_NEGATE_FLAG | cfgOptExpireAuto,
},
{
.name = "reset-" CFGOPT_EXPIRE_AUTO,
.val = PARSE_OPTION_FLAG | PARSE_RESET_FLAG | cfgOptExpireAuto,
},
// filter option
// -----------------------------------------------------------------------------------------------------------------------------
{
@@ -2704,6 +2719,7 @@ static const ConfigOption optionResolveOrder[] =
cfgOptDelta,
cfgOptDryRun,
cfgOptExclude,
cfgOptExpireAuto,
cfgOptFilter,
cfgOptHostId,
cfgOptIgnoreMissing,

View File

@@ -118,14 +118,17 @@ main(int argListSize, const char *argList[])
// Run backup
cmdBackup();
// Switch to expire command
cmdEnd(0, NULL);
cfgCommandSet(cfgCmdExpire, cfgCmdRoleDefault);
cfgLoadLogFile();
cmdBegin(true);
if (cfgOptionBool(cfgOptExpireAuto))
{
// Switch to expire command
cmdEnd(0, NULL);
cfgCommandSet(cfgCmdExpire, cfgCmdRoleDefault);
cfgLoadLogFile();
cmdBegin(true);
// Run expire
cmdExpire();
// Run expire
cmdExpire();
}
break;
}

View File

@@ -196,6 +196,109 @@ repo1-path=[TEST_PATH]/backup/repo
archive-copy=y
start-fast=y
full backup - with disabled expire-auto (backup host)
> [CONTAINER-EXEC] backup [BACKREST-BIN] --config=[TEST_PATH]/backup/pgbackrest.conf --repo1-retention-full=1 --no-expire-auto --type=full --stanza=db backup
------------------------------------------------------------------------------------------------------------------------------------
+ supplemental file: [TEST_PATH]/db-primary/pgbackrest.conf
-----------------------------------------------------------
[db]
pg1-path=[TEST_PATH]/db-primary/db/base
pg1-port=6543
pg1-socket-path=[TEST_PATH]/db-primary/db
[global]
buffer-size=[BUFFER-SIZE]
compress-level=3
compress-level-network=1
compress-type=none
db-timeout=45
lock-path=[TEST_PATH]/db-primary/lock
log-level-console=detail
log-level-file=[LOG-LEVEL-FILE]
log-level-stderr=off
log-path=[TEST_PATH]/db-primary/log
log-subprocess=[LOG-SUBPROCESS]
log-timestamp=n
protocol-timeout=60
repo1-host=backup
repo1-host-cmd=[BACKREST-BIN]
repo1-host-config=[TEST_PATH]/backup/pgbackrest.conf
repo1-host-user=[USER-1]
spool-path=[TEST_PATH]/db-primary/spool
+ supplemental file: [TEST_PATH]/db-standby/pgbackrest.conf
-----------------------------------------------------------
[db]
pg1-path=[TEST_PATH]/db-standby/db/base
pg1-port=6544
pg1-socket-path=[TEST_PATH]/db-standby/db
[global]
buffer-size=[BUFFER-SIZE]
compress-level=3
compress-level-network=1
compress-type=none
db-timeout=45
lock-path=[TEST_PATH]/db-standby/lock
log-level-console=detail
log-level-file=[LOG-LEVEL-FILE]
log-level-stderr=off
log-path=[TEST_PATH]/db-standby/log
log-subprocess=[LOG-SUBPROCESS]
log-timestamp=n
protocol-timeout=60
repo1-host=backup
repo1-host-cmd=[BACKREST-BIN]
repo1-host-config=[TEST_PATH]/backup/pgbackrest.conf
repo1-host-user=[USER-1]
spool-path=[TEST_PATH]/db-standby/spool
+ supplemental file: [TEST_PATH]/backup/pgbackrest.conf
-------------------------------------------------------
[db]
pg1-host=db-primary
pg1-host-cmd=[BACKREST-BIN]
pg1-host-config=[TEST_PATH]/db-primary/pgbackrest.conf
pg1-host-user=[USER-1]
pg1-path=[TEST_PATH]/db-primary/db/base
pg1-port=6543
pg2-host=bogus
pg2-host-cmd=[BACKREST-BIN]
pg2-host-config=[TEST_PATH]/db-standby/pgbackrest.conf
pg2-host-user=[USER-1]
pg2-path=[TEST_PATH]/db-standby/db/base
pg8-host=db-standby
pg8-host-cmd=[BACKREST-BIN]
pg8-host-config=[TEST_PATH]/db-standby/pgbackrest.conf
pg8-host-user=[USER-1]
pg8-path=[TEST_PATH]/db-standby/db/base
pg8-port=6544
[global]
buffer-size=[BUFFER-SIZE]
compress-level=3
compress-level-network=1
compress-type=none
db-timeout=45
lock-path=[TEST_PATH]/backup/lock
log-level-console=detail
log-level-file=[LOG-LEVEL-FILE]
log-level-stderr=off
log-path=[TEST_PATH]/backup/log
log-subprocess=[LOG-SUBPROCESS]
log-timestamp=n
protocol-timeout=60
repo1-path=[TEST_PATH]/backup/repo
[global:backup]
archive-copy=y
start-fast=y
expire full=1 (backup host)
> [CONTAINER-EXEC] backup [BACKREST-BIN] --config=[TEST_PATH]/backup/pgbackrest.conf --repo1-retention-full=1 --stanza=db expire
------------------------------------------------------------------------------------------------------------------------------------
restore, type 'standby', remap - restore backup on replica (db-standby host)
> [CONTAINER-EXEC] db-standby [BACKREST-BIN] --config=[TEST_PATH]/db-standby/pgbackrest.conf --recovery-option="primary_conninfo=host=db-primary port=6543 user=replicator" --type=standby --link-map="pg_xlog=[TEST_PATH]/db-standby/db/pg_xlog" --link-all --stanza=db restore
------------------------------------------------------------------------------------------------------------------------------------

View File

@@ -416,6 +416,28 @@ sub run
CFGOPTVAL_BACKUP_TYPE_FULL, 'update during backup',
{strOptionalParam => ' --buffer-size=16384'});
# Make a new backup with expire-auto disabled then run the expire command and compare backup numbers to ensure that expire
# was really disabled
$oBackupInfo = new pgBackRestTest::Env::BackupInfo($oHostBackup->repoBackupPath());
push(my @backupLst1, $oBackupInfo->list());
$strFullBackup = $oHostBackup->backup(
CFGOPTVAL_BACKUP_TYPE_FULL, 'with disabled expire-auto',
{strOptionalParam => ' --repo1-retention-full='.scalar(@backupLst1). ' --no-expire-auto'});
$oBackupInfo = new pgBackRestTest::Env::BackupInfo($oHostBackup->repoBackupPath());
push(my @backupLst2, $oBackupInfo->list());
&log(INFO, " run the expire command");
$oHostBackup->expire({iRetentionFull => scalar(@backupLst1)});
$oBackupInfo = new pgBackRestTest::Env::BackupInfo($oHostBackup->repoBackupPath());
push(my @backupLst3, $oBackupInfo->list());
unless (scalar(@backupLst2) == scalar(@backupLst1) + 1 && scalar(@backupLst1) == scalar(@backupLst3))
{
confess "expire-auto option didn't work as expected";
}
# Enabled async archiving
$oHostBackup->configUpdate({&CFGDEF_SECTION_GLOBAL => {'archive-async' => 'y'}});