diff --git a/expected/backup.out b/expected/backup.out index 848b23d4..331e7133 100644 --- a/expected/backup.out +++ b/expected/backup.out @@ -1,34 +1,27 @@ \! bash sql/backup.sh ###### BACKUP COMMAND TEST-0001 ###### ###### full backup mode ###### -NOTICE: pg_stop_backup complete, all required WAL segments have been archived 0 1 3 ###### BACKUP COMMAND TEST-0002 ###### ###### page-level backup mode ###### -NOTICE: pg_stop_backup complete, all required WAL segments have been archived 0 2 6 ###### BACKUP COMMAND TEST-0003 ###### ###### full backup with smooth checkpoint ###### -NOTICE: pg_stop_backup complete, all required WAL segments have been archived 0 1 3 ###### BACKUP COMMAND TEST-0004 ###### ###### full backup with keep-data-generations and keep-data-days ###### -NOTICE: pg_stop_backup complete, all required WAL segments have been archived 0 -NOTICE: pg_stop_backup complete, all required WAL segments have been archived 0 -NOTICE: pg_stop_backup complete, all required WAL segments have been archived 0 The number of existing full backups validated is greater than 2. OK. Let's try to test --keep-data-generations=1. 9 -NOTICE: pg_stop_backup complete, all required WAL segments have been archived 0 Number of remaining full backups validated: 2 Number of deleted backups : 2 @@ -36,8 +29,6 @@ Number of deleted backups : 2 ###### BACKUP COMMAND TEST-0005 ###### ###### switch backup mode from page to full ###### page-level backup without validated full backup -INFO: database backup start -ERROR: Valid full backup not found for differential backup. Either create a full backup or validate existing one. 10 0 0 diff --git a/expected/restore.out b/expected/restore.out index 28438c90..95b6d1bb 100644 --- a/expected/restore.out +++ b/expected/restore.out @@ -1,21 +1,17 @@ \! bash sql/restore.sh ###### RESTORE COMMAND TEST-0001 ###### ###### recovery to latest from full backup ###### -NOTICE: pg_stop_backup complete, all required WAL segments have been archived 0 0 ###### RESTORE COMMAND TEST-0002 ###### ###### recovery to latest from full + page backups ###### -NOTICE: pg_stop_backup complete, all required WAL segments have been archived 0 -NOTICE: pg_stop_backup complete, all required WAL segments have been archived 0 0 ###### RESTORE COMMAND TEST-0003 ###### ###### recovery to target timeline ###### -NOTICE: pg_stop_backup complete, all required WAL segments have been archived 0 0 0 @@ -24,21 +20,17 @@ OK: recovery.conf has the given target timeline. ###### RESTORE COMMAND TEST-0004 ###### ###### recovery to target time ###### -NOTICE: pg_stop_backup complete, all required WAL segments have been archived 0 0 ###### RESTORE COMMAND TEST-0005 ###### ###### recovery to target XID ###### -NOTICE: pg_stop_backup complete, all required WAL segments have been archived 0 0 OK: recovery-target-xid options works well. ###### RESTORE COMMAND TEST-0006 ###### ###### recovery with target inclusive false ###### -NOTICE: pg_stop_backup complete, all required WAL segments have been archived 0 0 OK: recovery-target-inclusive=false works well. - diff --git a/sql/backup.sh b/sql/backup.sh index 46ba2deb..203b3517 100644 --- a/sql/backup.sh +++ b/sql/backup.sh @@ -11,16 +11,16 @@ init_backup echo '###### BACKUP COMMAND TEST-0001 ######' echo '###### full backup mode ######' -pg_arman backup -B ${BACKUP_PATH} -b full -p ${TEST_PGPORT} -d postgres --quiet;echo $? -pg_arman validate -B ${BACKUP_PATH} --quiet +pg_arman backup -B ${BACKUP_PATH} -b full -p ${TEST_PGPORT} -d postgres --verbose > ${TEST_BASE}/TEST-0001-run.log 2>&1;echo $? +pg_arman validate -B ${BACKUP_PATH} --verbose >> ${TEST_BASE}/TEST-0001-run.log 2>&1 pg_arman show -B ${BACKUP_PATH} > ${TEST_BASE}/TEST-0001.log 2>&1 grep -c OK ${TEST_BASE}/TEST-0001.log grep OK ${TEST_BASE}/TEST-0001.log | sed -e 's@[^-]@@g' | wc -c | sed 's/^ *//' echo '###### BACKUP COMMAND TEST-0002 ######' echo '###### page-level backup mode ######' -pg_arman backup -B ${BACKUP_PATH} -b page -p ${TEST_PGPORT} -d postgres --quiet;echo $? -pg_arman validate -B ${BACKUP_PATH} --quiet +pg_arman backup -B ${BACKUP_PATH} -b page -p ${TEST_PGPORT} -d postgres --verbose > ${TEST_BASE}/TEST-0002-run.log 2>&1;echo $? +pg_arman validate -B ${BACKUP_PATH} >> ${TEST_BASE}/TEST-0002-run.log 2>&1 pg_arman show -B ${BACKUP_PATH} > ${TEST_BASE}/TEST-0002.log 2>&1 grep -c OK ${TEST_BASE}/TEST-0002.log grep OK ${TEST_BASE}/TEST-0002.log | sed -e 's@[^-]@@g' | wc -c | sed 's/^ *//' @@ -28,8 +28,8 @@ grep OK ${TEST_BASE}/TEST-0002.log | sed -e 's@[^-]@@g' | wc -c | sed 's/^ *//' echo '###### BACKUP COMMAND TEST-0003 ######' echo '###### full backup with smooth checkpoint ######' init_catalog -pg_arman backup -B ${BACKUP_PATH} -b full -C -p ${TEST_PGPORT} -d postgres --quiet;echo $? -pg_arman validate -B ${BACKUP_PATH} --quiet +pg_arman backup -B ${BACKUP_PATH} -b full -C -p ${TEST_PGPORT} -d postgres --verbose > ${TEST_BASE}/TEST-0003-run.log 2>&1;echo $? +pg_arman validate -B ${BACKUP_PATH} >> ${TEST_BASE}/TEST-0003-run.log 2>&1 pg_arman show -B ${BACKUP_PATH} > ${TEST_BASE}/TEST-0003.log 2>&1 grep -c OK ${TEST_BASE}/TEST-0003.log grep OK ${TEST_BASE}/TEST-0003.log | sed -e 's@[^-]@@g' | wc -c | sed 's/^ *//' @@ -37,10 +37,10 @@ grep OK ${TEST_BASE}/TEST-0003.log | sed -e 's@[^-]@@g' | wc -c | sed 's/^ *//' echo '###### BACKUP COMMAND TEST-0004 ######' echo '###### full backup with keep-data-generations and keep-data-days ######' init_catalog -pg_arman backup -B ${BACKUP_PATH} -b full -p ${TEST_PGPORT} -d postgres --quiet;echo $? -pg_arman backup -B ${BACKUP_PATH} -b full -p ${TEST_PGPORT} -d postgres --quiet;echo $? -pg_arman backup -B ${BACKUP_PATH} -b full -p ${TEST_PGPORT} -d postgres --quiet;echo $? -pg_arman validate -B ${BACKUP_PATH} --quiet +pg_arman backup -B ${BACKUP_PATH} -b full -p ${TEST_PGPORT} -d postgres --verbose > ${TEST_BASE}/TEST-0004-run.log 2>&1;echo $? +pg_arman backup -B ${BACKUP_PATH} -b full -p ${TEST_PGPORT} -d postgres --verbose >> ${TEST_BASE}/TEST-0004-run.log 2>&1;echo $? +pg_arman backup -B ${BACKUP_PATH} -b full -p ${TEST_PGPORT} -d postgres --verbose >> ${TEST_BASE}/TEST-0004-run.log 2>&1;echo $? +pg_arman validate -B ${BACKUP_PATH} --verbose >> ${TEST_BASE}/TEST-0004-run.log 2>&1 pg_arman show -B ${BACKUP_PATH} > ${TEST_BASE}/TEST-0004-before.log 2>&1 NUM_OF_FULL_BACKUPS_BEFORE=`grep OK ${TEST_BASE}/TEST-0004-before.log | grep FULL | wc -l | sed 's/^ *//'` if [ ${NUM_OF_FULL_BACKUPS_BEFORE} -gt 2 ] ; then @@ -49,12 +49,14 @@ if [ ${NUM_OF_FULL_BACKUPS_BEFORE} -gt 2 ] ; then else echo "The number of existing full backups validated is not greater than 2." echo "NG. There was something wrong in preparation of this test." + pg_ctl stop -m immediate -D ${PGDATA_PATH} > /dev/null 2>&1 + exit 1 fi # The actual value of NUM_OF_FULL_BACKUPS_BEFORE can vary on env, so commented out as default. #echo "Number of existing full backups validated: ${NUM_OF_FULL_BACKUPS_BEFORE}" grep OK ${TEST_BASE}/TEST-0004-before.log | sed -e 's@[^-]@@g' | wc -c | sed 's/^ *//' -pg_arman backup -B ${BACKUP_PATH} -b full --keep-data-days=-1 --keep-data-generations=1 -p ${TEST_PGPORT} -d postgres --quiet;echo $? -pg_arman validate -B ${BACKUP_PATH} --quiet +pg_arman backup -B ${BACKUP_PATH} -b full --keep-data-days=-1 --keep-data-generations=1 -p ${TEST_PGPORT} -d postgres --verbose > ${TEST_BASE}/TEST-0005-run.log 2>&1;echo $? +pg_arman validate -B ${BACKUP_PATH} --verbose >> ${TEST_BASE}/TEST-0005-run.log 2>&1 pg_arman show --show-all -B ${BACKUP_PATH} > ${TEST_BASE}/TEST-0004-after.log 2>&1 NUM_OF_FULL_BACKUPS_AFTER=`grep OK ${TEST_BASE}/TEST-0004-after.log | grep FULL | wc -l | sed 's/^ *//'` echo "Number of remaining full backups validated: ${NUM_OF_FULL_BACKUPS_AFTER}" @@ -66,15 +68,15 @@ echo '###### BACKUP COMMAND TEST-0005 ######' echo '###### switch backup mode from page to full ######' init_catalog echo 'page-level backup without validated full backup' -pg_arman backup -B ${BACKUP_PATH} -b page -p ${TEST_PGPORT} -d postgres;echo $? -pg_arman validate -B ${BACKUP_PATH} --quiet +pg_arman backup -B ${BACKUP_PATH} -b page -p ${TEST_PGPORT} -d postgres --verbose > ${TEST_BASE}/TEST-0006-run.log 2>&1;echo $? +pg_arman validate -B ${BACKUP_PATH} --verbose >> ${TEST_BASE}/TEST-0006-run.log 2>&1 pg_arman show -B ${BACKUP_PATH} > ${TEST_BASE}/TEST-0005.log 2>&1 grep OK ${TEST_BASE}/TEST-0005.log | grep FULL | wc -l | sed 's/^ *//' grep ERROR ${TEST_BASE}/TEST-0005.log | grep INCR | wc -l | sed 's/^ *//' # cleanup ## clean up the temporal test data -pg_ctl stop -m immediate > /dev/null 2>&1 +pg_ctl stop -m immediate -D ${PGDATA_PATH} > /dev/null 2>&1 rm -fr ${PGDATA_PATH} rm -fr ${BACKUP_PATH} rm -fr ${ARCLOG_PATH} diff --git a/sql/restore.sh b/sql/restore.sh index 84c939fe..ef070c14 100644 --- a/sql/restore.sh +++ b/sql/restore.sh @@ -30,10 +30,10 @@ init_backup pgbench_objs 0001 pgbench -p ${TEST_PGPORT} -d pgbench > /dev/null 2>&1 psql --no-psqlrc -p ${TEST_PGPORT} -d pgbench -c "SELECT * FROM pgbench_branches;" > ${TEST_BASE}/TEST-0001-before.out -pg_arman backup -B ${BACKUP_PATH} -b full -p ${TEST_PGPORT} -d postgres --quiet;echo $? -pg_arman validate -B ${BACKUP_PATH} --quiet +pg_arman backup -B ${BACKUP_PATH} -b full -p ${TEST_PGPORT} -d postgres --verbose > ${TEST_BASE}/TEST-0001-run.out 2>&1;echo $? +pg_arman validate -B ${BACKUP_PATH} --verbose >> ${TEST_BASE}/TEST-0001-run.out 2>&1 pg_ctl stop -m immediate > /dev/null 2>&1 -pg_arman restore -B ${BACKUP_PATH} --quiet;echo $? +pg_arman restore -B ${BACKUP_PATH} --verbose >> ${TEST_BASE}/TEST-0001-run.out 2>&1;echo $? pg_ctl start -w -t 600 > /dev/null 2>&1 psql --no-psqlrc -p ${TEST_PGPORT} -d pgbench -c "SELECT * FROM pgbench_branches;" > ${TEST_BASE}/TEST-0001-after.out diff ${TEST_BASE}/TEST-0001-before.out ${TEST_BASE}/TEST-0001-after.out @@ -43,14 +43,14 @@ echo '###### RESTORE COMMAND TEST-0002 ######' echo '###### recovery to latest from full + page backups ######' init_backup pgbench_objs 0002 -pg_arman backup -B ${BACKUP_PATH} -b full -p ${TEST_PGPORT} -d postgres --quiet;echo $? -pg_arman validate -B ${BACKUP_PATH} --quiet +pg_arman backup -B ${BACKUP_PATH} -b full -p ${TEST_PGPORT} -d postgres --verbose > ${TEST_BASE}/TEST-0002-run.out 2>&1;echo $? +pg_arman validate -B ${BACKUP_PATH} --verbose >> ${TEST_BASE}/TEST-0002-run.out 2>&1 pgbench -p ${TEST_PGPORT} -d pgbench > /dev/null 2>&1 -pg_arman backup -B ${BACKUP_PATH} -b page -p ${TEST_PGPORT} -d postgres --quiet;echo $? -pg_arman validate -B ${BACKUP_PATH} --quiet +pg_arman backup -B ${BACKUP_PATH} -b page -p ${TEST_PGPORT} -d postgres --verbose >> ${TEST_BASE}/TEST-0002-run.out 2>&1;echo $? +pg_arman validate -B ${BACKUP_PATH} --verbose >> ${TEST_BASE}/TEST-0002-run.out 2>&1 psql --no-psqlrc -p ${TEST_PGPORT} -d pgbench -c "SELECT * FROM pgbench_branches;" > ${TEST_BASE}/TEST-0002-before.out pg_ctl stop -m immediate > /dev/null 2>&1 -pg_arman restore -B ${BACKUP_PATH} --quiet;echo $? +pg_arman restore -B ${BACKUP_PATH} --verbose >> ${TEST_BASE}/TEST-0002-run.out 2>&1;echo $? pg_ctl start -w -t 600 > /dev/null 2>&1 psql --no-psqlrc -p ${TEST_PGPORT} -d pgbench -c "SELECT * FROM pgbench_branches;" > ${TEST_BASE}/TEST-0002-after.out diff ${TEST_BASE}/TEST-0002-before.out ${TEST_BASE}/TEST-0002-after.out @@ -61,21 +61,23 @@ echo '###### recovery to target timeline ######' init_backup pgbench_objs 0003 psql --no-psqlrc -p ${TEST_PGPORT} -d pgbench -c "SELECT * FROM pgbench_branches;" > ${TEST_BASE}/TEST-0003-before.out -pg_arman backup -B ${BACKUP_PATH} -b full -p ${TEST_PGPORT} -d postgres --quiet;echo $? -pg_arman validate -B ${BACKUP_PATH} --quiet +pg_arman backup -B ${BACKUP_PATH} -b full -p ${TEST_PGPORT} -d postgres --verbose > ${TEST_BASE}/TEST-0003-run.out 2>&1;echo $? +pg_arman validate -B ${BACKUP_PATH} --verbose >> ${TEST_BASE}/TEST-0003-run.out 2>&1 TARGET_TLI=`pg_controldata | grep " TimeLineID:" | awk '{print $4}'` pg_ctl stop -m immediate > /dev/null 2>&1 -pg_arman restore -B ${BACKUP_PATH} --quiet;echo $? +pg_arman restore -B ${BACKUP_PATH} --verbose >> ${TEST_BASE}/TEST-0003-run.out 2>&1;echo $? pg_ctl start -w -t 600 > /dev/null 2>&1 pgbench -p ${TEST_PGPORT} -d pgbench > /dev/null 2>&1 pg_ctl stop -m immediate > /dev/null 2>&1 -pg_arman restore -B ${BACKUP_PATH} --recovery-target-timeline=${TARGET_TLI} --quiet;echo $? +pg_arman restore -B ${BACKUP_PATH} --recovery-target-timeline=${TARGET_TLI} --verbose >> ${TEST_BASE}/TEST-0003-run.out 2>&1;echo $? echo "checking recovery.conf..." TARGET_TLI_IN_RECOVERY_CONF=`grep "recovery_target_timeline = " ${PGDATA_PATH}/recovery.conf | awk '{print $3}' | sed -e "s/'//g"` if [ ${TARGET_TLI} = ${TARGET_TLI_IN_RECOVERY_CONF} ]; then echo 'OK: recovery.conf has the given target timeline.' else echo 'NG: recovery.conf does not have the given target timeline.' + pg_ctl stop -m immediate -D ${PGDATA_PATH} + exit 1 fi pg_ctl start -w -t 600 > /dev/null 2>&1 psql --no-psqlrc -p ${TEST_PGPORT} -d pgbench -c "SELECT * FROM pgbench_branches;" > ${TEST_BASE}/TEST-0003-after.out @@ -88,12 +90,12 @@ init_backup pgbench_objs 0004 pgbench -p ${TEST_PGPORT} -d pgbench > /dev/null 2>&1 psql --no-psqlrc -p ${TEST_PGPORT} -d pgbench -c "SELECT * FROM pgbench_branches;" > ${TEST_BASE}/TEST-0004-before.out -pg_arman backup -B ${BACKUP_PATH} -b full -p ${TEST_PGPORT} -d postgres --quiet;echo $? -pg_arman validate -B ${BACKUP_PATH} --quiet +pg_arman backup -B ${BACKUP_PATH} -b full -p ${TEST_PGPORT} -d postgres --verbose > ${TEST_BASE}/TEST-0004-run.out 2>&1;echo $? +pg_arman validate -B ${BACKUP_PATH} --verbose >> ${TEST_BASE}/TEST-0004-run.out 2>&1 TARGET_TIME=`date +"%Y-%m-%d %H:%M:%S"` pgbench -p ${TEST_PGPORT} -d pgbench > /dev/null 2>&1 pg_ctl stop -m immediate > /dev/null 2>&1 -pg_arman restore -B ${BACKUP_PATH} --recovery-target-time="${TARGET_TIME}" --quiet;echo $? +pg_arman restore -B ${BACKUP_PATH} --recovery-target-time="${TARGET_TIME}" --verbose >> ${TEST_BASE}/TEST-0004-run.out 2>&1;echo $? pg_ctl start -w -t 600 > /dev/null 2>&1 psql --no-psqlrc -p ${TEST_PGPORT} -d pgbench -c "SELECT * FROM pgbench_branches;" > ${TEST_BASE}/TEST-0004-after.out diff ${TEST_BASE}/TEST-0004-before.out ${TEST_BASE}/TEST-0004-after.out @@ -104,8 +106,8 @@ echo '###### recovery to target XID ######' init_backup pgbench_objs 0005 psql --no-psqlrc -p ${TEST_PGPORT} -d pgbench -c "CREATE TABLE tbl0005 (a text);" > /dev/null 2>&1 -pg_arman backup -B ${BACKUP_PATH} -b full -p ${TEST_PGPORT} -d postgres --quiet;echo $? -pg_arman validate -B ${BACKUP_PATH} --quiet +pg_arman backup -B ${BACKUP_PATH} -b full -p ${TEST_PGPORT} -d postgres --verbose > ${TEST_BASE}/TEST-0005-run.out 2>&1;echo $? +pg_arman validate -B ${BACKUP_PATH} --verbose >> ${TEST_BASE}/TEST-0005-run.out 2>&1 pgbench -p ${TEST_PGPORT} pgbench > /dev/null 2>&1 psql --no-psqlrc -p ${TEST_PGPORT} -d pgbench -c "SELECT * FROM pgbench_branches;" > ${TEST_BASE}/TEST-0005-before.out TARGET_XID=`psql --no-psqlrc -p ${TEST_PGPORT} -d pgbench -tAq -c "INSERT INTO tbl0005 VALUES ('inserted') RETURNING (xmin);"` @@ -116,7 +118,7 @@ pgbench -p ${TEST_PGPORT} -d pgbench > /dev/null 2>&1 psql --no-psqlrc -p ${TEST_PGPORT} -d pgbench -c 'SELECT pg_switch_xlog()' > /dev/null 2>&1 # Fast mode is used to ensure that the last segment is archived as well. pg_ctl stop -m fast > /dev/null 2>&1 -pg_arman restore -B ${BACKUP_PATH} --recovery-target-xid="${TARGET_XID}" --quiet;echo $? +pg_arman restore -B ${BACKUP_PATH} --recovery-target-xid="${TARGET_XID}" --verbose >> ${TEST_BASE}/TEST-0005-run.out 2>&1;echo $? pg_ctl start -w -t 600 > /dev/null 2>&1 psql --no-psqlrc -p ${TEST_PGPORT} -d pgbench -c "SELECT * FROM pgbench_branches;" > ${TEST_BASE}/TEST-0005-after.out psql --no-psqlrc -p ${TEST_PGPORT} -d pgbench -c "SELECT * FROM tbl0005;" > ${TEST_BASE}/TEST-0005-tbl.dump @@ -125,6 +127,8 @@ if grep "inserted" ${TEST_BASE}/TEST-0005-tbl.dump > /dev/null ; then echo 'OK: recovery-target-xid options works well.' else echo 'NG: recovery-target-xid options does not work well.' + pg_ctl stop -m immediate -D ${PGDATA_PATH} > /dev/null 2>&1 + exit 1 fi echo '' @@ -133,8 +137,8 @@ echo '###### recovery with target inclusive false ######' init_backup pgbench_objs 0006 psql --no-psqlrc -p ${TEST_PGPORT} -d pgbench -c "CREATE TABLE tbl0006 (a text);" > /dev/null 2>&1 -pg_arman backup -B ${BACKUP_PATH} -b full -p ${TEST_PGPORT} -d postgres --quiet;echo $? -pg_arman validate -B ${BACKUP_PATH} --quiet +pg_arman backup -B ${BACKUP_PATH} -b full -p ${TEST_PGPORT} -d postgres --verbose > ${TEST_BASE}/TEST-0006-run.out 2>&1;echo $? +pg_arman validate -B ${BACKUP_PATH} --verbose >> ${TEST_BASE}/TEST-0003-run.out 2>&1 pgbench -p ${TEST_PGPORT} pgbench > /dev/null 2>&1 psql --no-psqlrc -p ${TEST_PGPORT} -d pgbench -c "SELECT * FROM pgbench_branches;" > ${TEST_BASE}/TEST-0006-before.out TARGET_XID=`psql --no-psqlrc -p ${TEST_PGPORT} -d pgbench -tAq -c "INSERT INTO tbl0006 VALUES ('inserted') RETURNING (xmin);"` @@ -145,7 +149,7 @@ pgbench -p ${TEST_PGPORT} -d pgbench > /dev/null 2>&1 psql --no-psqlrc -p ${TEST_PGPORT} -d pgbench -c 'SELECT pg_switch_xlog()' > /dev/null 2>&1 # Fast mode is used to ensure that the last segment is archived as well. pg_ctl stop -m fast > /dev/null 2>&1 -pg_arman restore -B ${BACKUP_PATH} --recovery-target-xid="${TARGET_XID}" --recovery-target-inclusive=false --quiet;echo $? +pg_arman restore -B ${BACKUP_PATH} --recovery-target-xid="${TARGET_XID}" --recovery-target-inclusive=false --verbose >> ${TEST_BASE}/TEST-0006-run.out 2>&1;echo $? pg_ctl start -w -t 600 > /dev/null 2>&1 psql --no-psqlrc -p ${TEST_PGPORT} -d pgbench -c "SELECT * FROM pgbench_branches;" > ${TEST_BASE}/TEST-0006-after.out psql --no-psqlrc -p ${TEST_PGPORT} -d pgbench -c "SELECT * FROM tbl0006;" > ${TEST_BASE}/TEST-0006-tbl.dump @@ -154,6 +158,8 @@ if grep "inserted" ${TEST_BASE}/TEST-0006-tbl.dump > /dev/null ; then echo 'NG: recovery-target-inclusive=false does not work well.' else echo 'OK: recovery-target-inclusive=false works well.' + pg_ctl stop -m immediate -D ${PGDATA_PATH} > /dev/null 2>&1 + exit 1 fi echo ''