mirror of
https://github.com/pgbackrest/pgbackrest.git
synced 2026-06-20 01:17:49 +02:00
Add expire-auto option.
This allows automatic expiration after a successful backup to be disabled.
This commit is contained in:
@@ -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,
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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
|
||||
(
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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
|
||||
(
|
||||
|
||||
@@ -75,6 +75,7 @@ typedef enum
|
||||
cfgDefOptDelta,
|
||||
cfgDefOptDryRun,
|
||||
cfgDefOptExclude,
|
||||
cfgDefOptExpireAuto,
|
||||
cfgDefOptFilter,
|
||||
cfgDefOptForce,
|
||||
cfgDefOptHostId,
|
||||
|
||||
@@ -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,
|
||||
|
||||
+10
-7
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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
|
||||
------------------------------------------------------------------------------------------------------------------------------------
|
||||
|
||||
@@ -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'}});
|
||||
|
||||
|
||||
Reference in New Issue
Block a user