From 2b1d186515c60719ab198dddd37b9e6b58c7f382 Mon Sep 17 00:00:00 2001 From: mikecaat Date: Fri, 14 May 2021 13:17:59 +0900 Subject: [PATCH 1/3] Fix default "log_directory" value Although "log_directory" parameter's default value is changed in PostgreSQL version 10, pg_rman didn't change it. It leads following main issues if the "log_directory" is not specified. 1. Server logs are always backuped even if "--with-serverlog" is not specified because pg_rman fails to exclude the "PGDATA/log" directory from backup target lists. 2. pg_rman's "--keep-srvlog-files" and "--keep-srvlog-days" options are invalid because SRVLOG_PATH is wrong. --- init.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/init.c b/init.c index fb148ce3..f0b027be 100644 --- a/init.c +++ b/init.c @@ -176,9 +176,9 @@ do_init(void) } else if (pgdata) { - /* default: log_directory = 'pg_log' */ + /* default: log_directory = 'log' if PostgreSQL version is 10 or above */ srvlog_path = pgut_malloc(MAXPGPATH); - join_path_components(srvlog_path, pgdata, "pg_log"); + join_path_components(srvlog_path, pgdata, "log"); } } if (srvlog_path) From 293fb41670b210731364e2701c85f2df625bc700 Mon Sep 17 00:00:00 2001 From: mikecaat Date: Fri, 14 May 2021 13:21:41 +0900 Subject: [PATCH 2/3] Fix to support restoring server logs pg_rman supports to backup server logs with "--with-serverlog" option and backups them to the BACKUP_PATH directory. But, it didn't support to restore the backuped server logs. So, this patch supports to restore them from full backup and incremental backup. --- restore.c | 116 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 116 insertions(+) diff --git a/restore.c b/restore.c index efc838ea..09639c4b 100644 --- a/restore.c +++ b/restore.c @@ -21,6 +21,7 @@ static void backup_online_files(bool re_recovery); static void restore_online_files(void); static void restore_database(pgBackup *backup); +static void restore_server_logs(pgBackup *backup); static void restore_archive_logs(pgBackup *backup, bool is_hard_copy); static void add_recovery_related_options(const char *target_time, @@ -276,6 +277,9 @@ do_restore(const char *target_time, /* restore base backup */ restore_database(base_backup); + + /* restore server logs */ + restore_server_logs(base_backup); last_restored_index = base_index; @@ -308,6 +312,7 @@ do_restore(const char *target_time, timestamp); restore_database(backup); + restore_server_logs(backup); last_restored_index = i; } @@ -612,6 +617,117 @@ restore_database(pgBackup *backup) printf(_("restore backup completed\n")); } +/* + * restore server logs + */ +void +restore_server_logs(pgBackup *backup) +{ + char timestamp[100]; + char path[MAXPGPATH]; + char list_path[MAXPGPATH]; + parray *files; + int i; + int num_skipped = 0; + + /* we need completed serverlog backup */ + if (!(backup->status == BACKUP_STATUS_OK && backup->with_serverlog)) + return; + + time2iso(timestamp, lengthof(timestamp), backup->start_time); + if (verbose && !check) + { + printf(_("----------------------------------------\n")); + } + + /* + * Validate backup files with its size, because load of CRC calculation is + * not light. + */ + pgBackupValidate(backup, true, false, true); + + if (backup->backup_mode == BACKUP_MODE_FULL) + elog(INFO, "restoring server log files from the full mode backup \"%s\"", + timestamp); + else if (backup->backup_mode == BACKUP_MODE_INCREMENTAL) + elog(INFO, "restoring server log files from the incremental mode backup \"%s\"", + timestamp); + + /* + * get list of files which need to be restored. + */ + pgBackupGetPath(backup, path, lengthof(path), SRVLOG_DIR); + pgBackupGetPath(backup, list_path, lengthof(list_path), SRVLOG_FILE_LIST); + files = dir_read_file_list(path, list_path); + for (i = parray_num(files) - 1; i >= 0; i--) + { + pgFile *file = (pgFile *) parray_get(files, i); + + /* remove files which are not backed up */ + if (file->write_size == BYTES_INVALID) + pgFileFree(parray_remove(files, i)); + } + + /* restore server log files into $PGDATA */ + for (i = 0; i < parray_num(files); i++) + { + char from_root[MAXPGPATH]; + pgFile *file = (pgFile *) parray_get(files, i); + + pgBackupGetPath(backup, from_root, lengthof(from_root), SRVLOG_DIR); + + /* check for interrupt */ + if (interrupted) + ereport(FATAL, + (errcode(ERROR_INTERRUPTED), + errmsg("interrupted during restore server log files"))); + + /* print progress in verbose mode */ + if (verbose && !check) + printf(_("(%d/%lu) %s "), i + 1, (unsigned long) parray_num(files), + file->path + strlen(from_root) + 1); + + /* not backed up */ + if (file->write_size == BYTES_INVALID) + { + num_skipped++; + if (verbose && !check) + printf(_("not backed up, skip\n")); + goto show_progress; + } + + /* restore a server log file */ + if (!check) + copy_file(from_root, srvlog_path, file, backup->compress_data); + + /* print size of restored file */ + if (verbose && !check) + { + printf(_("restored %lu\n"), (unsigned long) file->write_size); + continue; + } + +show_progress: + /* print progress in non-verbose format */ + if (progress) + { + fprintf(stderr, _("Processed %d of %lu files, skipped %d"), + i + 1, (unsigned long) parray_num(files), num_skipped); + if(i + 1 < (unsigned long) parray_num(files)) + fprintf(stderr, "\r"); + else + fprintf(stderr, "\n"); + } + } + + /* cleanup */ + parray_walk(files, pgFileFree); + parray_free(files); + + if (verbose && !check) + printf(_("restore server log files completed\n")); +} + /* * Restore archived WAL by creating symbolic link which linked to backup WAL in * archive directory. From aff93890ce4fde28aadef8301d19ea19b5bdfaac Mon Sep 17 00:00:00 2001 From: mikecaat Date: Fri, 14 May 2021 13:38:36 +0900 Subject: [PATCH 3/3] Add regression tests for 293fb4167 and 2b1d18651 --- expected/arc_srv_log_management.out | 21 ++++ expected/restore.out | 24 +++++ expected/restore_checksum.out | 24 +++++ sql/arc_srv_log_management.sh | 150 +++++++++++++++++++--------- sql/common.sh | 11 ++ sql/restore.sh | 126 +++++++++++++++++------ 6 files changed, 279 insertions(+), 77 deletions(-) diff --git a/expected/arc_srv_log_management.out b/expected/arc_srv_log_management.out index 52b41621..65cec0d3 100644 --- a/expected/arc_srv_log_management.out +++ b/expected/arc_srv_log_management.out @@ -44,3 +44,24 @@ Number of existing server log files: 7 do --keep-srvlog-files=4 AND --keep-srvlog-days=1 0 Number of remaining server log files: 4 +###### LOG FILE MANAGEMENT TEST-0007 ###### +###### keep-srvlog-files only with default "log_directory" option ###### +0 +Number of existing server log files: 4 +do --keep-srvlog-files=3 +0 +Number of remaining server log files: 3 +###### LOG FILE MANAGEMENT TEST-0008 ###### +###### keep-srvlog-days only with default "log_directory" option ###### +0 +Number of existing server log files: 7 +do --keep-srvlog-days=1 +0 +Number of remaining server log files: 3 +###### LOG FILE MANAGEMENT TEST-0009 ###### +###### keep-srvlog-files and keep-srvlog-days together with default "log_directory" option ###### +0 +Number of existing server log files: 7 +do --keep-srvlog-files=4 AND --keep-srvlog-days=1 +0 +Number of remaining server log files: 4 diff --git a/expected/restore.out b/expected/restore.out index 258a0d6b..dfc0fcea 100644 --- a/expected/restore.out +++ b/expected/restore.out @@ -70,3 +70,27 @@ OK: hard-copy option works well. 0 0 +###### RESTORE COMMAND TEST-0013 ###### +###### server logs (in the default log_directory) do not be backuped without "--with-serverlog" ###### +0 +0 +1 + +###### RESTORE COMMAND TEST-0014 ###### +###### server logs (in the default log_directory) should be backuped with "--with-serverlog" ###### +0 +0 +0 + +###### RESTORE COMMAND TEST-0015 ###### +###### server logs do not be backuped without "--with-serverlog" ###### +0 +0 +1 + +###### RESTORE COMMAND TEST-0016 ###### +###### server logs should be backuped with "--with-serverlog" ###### +0 +0 +0 + diff --git a/expected/restore_checksum.out b/expected/restore_checksum.out index 3213d463..0ec70203 100644 --- a/expected/restore_checksum.out +++ b/expected/restore_checksum.out @@ -70,3 +70,27 @@ OK: hard-copy option works well. 0 0 +###### RESTORE COMMAND TEST-0013 ###### +###### server logs (in the default log_directory) do not be backuped without "--with-serverlog" ###### +0 +0 +1 + +###### RESTORE COMMAND TEST-0014 ###### +###### server logs (in the default log_directory) should be backuped with "--with-serverlog" ###### +0 +0 +0 + +###### RESTORE COMMAND TEST-0015 ###### +###### server logs do not be backuped without "--with-serverlog" ###### +0 +0 +1 + +###### RESTORE COMMAND TEST-0016 ###### +###### server logs should be backuped with "--with-serverlog" ###### +0 +0 +0 + diff --git a/sql/arc_srv_log_management.sh b/sql/arc_srv_log_management.sh index 9f080dff..71351985 100644 --- a/sql/arc_srv_log_management.sh +++ b/sql/arc_srv_log_management.sh @@ -34,21 +34,36 @@ function cleanup() function init_backup() { + DEFAULT_LOG_DIRECTORY="FALSE"; + while [ $# -gt 0 ]; do + case "$1" in + --default-log_directory) + DEFAULT_LOG_DIRECTORY="TRUE" + ;; + esac + shift + done + # cleanup environment cleanup # create new database cluster - initdb --no-locale -D ${PGDATA_PATH} > ${TEST_BASE}/initdb.log 2>&1 - cp $PGDATA_PATH/postgresql.conf $PGDATA_PATH/postgresql.conf_org - cat << EOF >> $PGDATA_PATH/postgresql.conf + initdb --no-locale -D ${PGDATA_PATH} > ${TEST_BASE}/initdb.log 2>&1 + cp $PGDATA_PATH/postgresql.conf $PGDATA_PATH/postgresql.conf_org + cat << EOF >> $PGDATA_PATH/postgresql.conf port = ${TEST_PGPORT} logging_collector = on wal_level = hot_standby -log_directory = '${SRVLOG_PATH}' archive_mode = on archive_command = 'cp %p ${ARCLOG_PATH}/%f' EOF + if [ "$DEFAULT_LOG_DIRECTORY" = "FALSE" ]; then + cat << EOF >> $PGDATA_PATH/postgresql.conf +log_directory = '${SRVLOG_PATH}' +EOF + fi + # start PostgreSQL pg_ctl start -D ${PGDATA_PATH} -w -t 300 > /dev/null 2>&1 pgbench -i -p ${TEST_PGPORT} -d postgres > ${TEST_BASE}/pgbench.log 2>&1 @@ -79,6 +94,67 @@ function change_files_timestamp() done } +function test_keep_srvlog_files() +{ + SRVLOG_PATH_ARG=$1 + + create_dummy_files ${SRVLOG_PATH_ARG} logfile 3 + pg_rman backup -B ${BACKUP_PATH} -b full -Z -s -p ${TEST_PGPORT} -d postgres --quiet;echo $? + pg_rman validate -B ${BACKUP_PATH} --quiet + NUM_OF_SRVLOG_FILES_BEFORE=`ls ${SRVLOG_PATH_ARG} | grep -v backup | wc -l` + echo "Number of existing server log files: ${NUM_OF_SRVLOG_FILES_BEFORE}" + echo "do --keep-srvlog-files=3" + #ls -l ${SRVLOG_PATH_ARG} + pg_rman backup -B ${BACKUP_PATH} -b arc -Z -s --keep-srvlog-files=3 -p ${TEST_PGPORT} -d postgres > /dev/null 2>&1;echo $? + # FOR DEBUG + #pg_rman backup -B ${BACKUP_PATH} -b arc -Z -s --keep-srvlog-files=3 -p ${TEST_PGPORT} -d postgres --debug;echo $? + NUM_OF_SRVLOG_FILES_AFTER=`ls ${SRVLOG_PATH_ARG} | grep -v backup | wc -l` + echo "Number of remaining server log files: ${NUM_OF_SRVLOG_FILES_AFTER}" + #ls -l ${SRVLOG_PATH_ARG} +} + +function test_keep_srvlog_days() +{ + SRVLOG_PATH_ARG=$1 + + create_dummy_files ${SRVLOG_PATH_ARG} old_logfile 3 + change_files_timestamp 2 ${SRVLOG_PATH_ARG} + create_dummy_files ${SRVLOG_PATH_ARG} new_logfile 3 + pg_rman backup -B ${BACKUP_PATH} -b full -Z -s -p ${TEST_PGPORT} -d postgres --quiet;echo $? + pg_rman validate -B ${BACKUP_PATH} --quiet + NUM_OF_SRVLOG_FILES_BEFORE=`ls ${SRVLOG_PATH_ARG} | grep -v backup | wc -l` + echo "Number of existing server log files: ${NUM_OF_SRVLOG_FILES_BEFORE}" + echo "do --keep-srvlog-days=1" + #ls -l ${SRVLOG_PATH_ARG} + pg_rman backup -B ${BACKUP_PATH} -b arc -Z -s --keep-srvlog-days=1 -p ${TEST_PGPORT} -d postgres > /dev/null 2>&1;echo $? + # FOR DEBUG + #pg_rman backup -B ${BACKUP_PATH} -b arc -Z -s --keep-srvlog-days=1 -p ${TEST_PGPORT} -d postgres --debug;echo $? + NUM_OF_SRVLOG_FILES_AFTER=`ls ${SRVLOG_PATH_ARG} | grep -v backup | wc -l` + echo "Number of remaining server log files: ${NUM_OF_SRVLOG_FILES_AFTER}" + #ls -l ${SRVLOG_PATH_ARG} +} + +function test_keep_srvlog_files_and_keep_srvlog_days_together() +{ + SRVLOG_PATH_ARG=$1 + + create_dummy_files ${SRVLOG_PATH_ARG} old_logfile 3 + change_files_timestamp 2 ${SRVLOG_PATH_ARG} + create_dummy_files ${SRVLOG_PATH_ARG} new_logfile 3 + pg_rman backup -B ${BACKUP_PATH} -b full -Z -s -p ${TEST_PGPORT} -d postgres --quiet;echo $? + pg_rman validate -B ${BACKUP_PATH} --quiet + NUM_OF_SRVLOG_FILES_BEFORE=`ls ${SRVLOG_PATH_ARG} | grep -v backup | wc -l` + echo "Number of existing server log files: ${NUM_OF_SRVLOG_FILES_BEFORE}" + echo "do --keep-srvlog-files=4 AND --keep-srvlog-days=1" + #ls -l ${SRVLOG_PATH_ARG} + pg_rman backup -B ${BACKUP_PATH} -b arc -Z -s --keep-srvlog-files=4 --keep-srvlog-days=1 -p ${TEST_PGPORT} -d postgres > /dev/null 2>&1;echo $? + # FOR DEBUG + #pg_rman backup -B ${BACKUP_PATH} -b arc -Z -s --keep-srvlog-files=4 --keep-srvlog-days=1 -p ${TEST_PGPORT} -d postgres --debug;echo $? + NUM_OF_SRVLOG_FILES_AFTER=`ls ${SRVLOG_PATH_ARG} | grep -v backup | wc -l` + echo "Number of remaining server log files: ${NUM_OF_SRVLOG_FILES_AFTER}" + #ls -l ${SRVLOG_PATH_ARG} +} + init_backup echo '###### LOG FILE MANAGEMENT TEST-0001 ######' @@ -139,59 +215,39 @@ init_catalog echo '###### LOG FILE MANAGEMENT TEST-0004 ######' echo '###### keep-srvlog-files only ######' -create_dummy_files ${SRVLOG_PATH} logfile 3 -pg_rman backup -B ${BACKUP_PATH} -b full -Z -s -p ${TEST_PGPORT} -d postgres --quiet;echo $? -pg_rman validate -B ${BACKUP_PATH} --quiet -NUM_OF_SRVLOG_FILES_BEFORE=`ls ${SRVLOG_PATH} | grep -v backup | wc -l` -echo "Number of existing server log files: ${NUM_OF_SRVLOG_FILES_BEFORE}" -echo "do --keep-srvlog-files=3" -#ls -l ${SRVLOG_PATH} -pg_rman backup -B ${BACKUP_PATH} -b arc -Z -s --keep-srvlog-files=3 -p ${TEST_PGPORT} -d postgres > /dev/null 2>&1;echo $? -# FOR DEBUG -#pg_rman backup -B ${BACKUP_PATH} -b arc -Z -s --keep-srvlog-files=3 -p ${TEST_PGPORT} -d postgres --debug;echo $? -NUM_OF_SRVLOG_FILES_AFTER=`ls ${SRVLOG_PATH} | grep -v backup | wc -l` -echo "Number of remaining server log files: ${NUM_OF_SRVLOG_FILES_AFTER}" -#ls -l ${SRVLOG_PATH} +test_keep_srvlog_files ${SRVLOG_PATH} init_backup echo '###### LOG FILE MANAGEMENT TEST-0005 ######' echo '###### keep-srvlog-days only ######' -create_dummy_files ${SRVLOG_PATH} old_logfile 3 -change_files_timestamp 2 ${SRVLOG_PATH} -create_dummy_files ${SRVLOG_PATH} new_logfile 3 -pg_rman backup -B ${BACKUP_PATH} -b full -Z -s -p ${TEST_PGPORT} -d postgres --quiet;echo $? -pg_rman validate -B ${BACKUP_PATH} --quiet -NUM_OF_SRVLOG_FILES_BEFORE=`ls ${SRVLOG_PATH} | grep -v backup | wc -l` -echo "Number of existing server log files: ${NUM_OF_SRVLOG_FILES_BEFORE}" -echo "do --keep-srvlog-days=1" -#ls -l ${SRVLOG_PATH} -pg_rman backup -B ${BACKUP_PATH} -b arc -Z -s --keep-srvlog-days=1 -p ${TEST_PGPORT} -d postgres > /dev/null 2>&1;echo $? -# FOR DEBUG -#pg_rman backup -B ${BACKUP_PATH} -b arc -Z -s --keep-srvlog-days=1 -p ${TEST_PGPORT} -d postgres --debug;echo $? -NUM_OF_SRVLOG_FILES_AFTER=`ls ${SRVLOG_PATH} | grep -v backup | wc -l` -echo "Number of remaining server log files: ${NUM_OF_SRVLOG_FILES_AFTER}" -#ls -l ${SRVLOG_PATH} +test_keep_srvlog_days ${SRVLOG_PATH} init_backup echo '###### LOG FILE MANAGEMENT TEST-0006 ######' echo '###### keep-srvlog-files and keep-srvlog-days together ######' -create_dummy_files ${SRVLOG_PATH} old_logfile 3 -change_files_timestamp 2 ${SRVLOG_PATH} -create_dummy_files ${SRVLOG_PATH} new_logfile 3 -pg_rman backup -B ${BACKUP_PATH} -b full -Z -s -p ${TEST_PGPORT} -d postgres --quiet;echo $? -pg_rman validate -B ${BACKUP_PATH} --quiet -NUM_OF_SRVLOG_FILES_BEFORE=`ls ${SRVLOG_PATH} | grep -v backup | wc -l` -echo "Number of existing server log files: ${NUM_OF_SRVLOG_FILES_BEFORE}" -echo "do --keep-srvlog-files=4 AND --keep-srvlog-days=1" -#ls -l ${SRVLOG_PATH} -pg_rman backup -B ${BACKUP_PATH} -b arc -Z -s --keep-srvlog-files=4 --keep-srvlog-days=1 -p ${TEST_PGPORT} -d postgres > /dev/null 2>&1;echo $? -# FOR DEBUG -#pg_rman backup -B ${BACKUP_PATH} -b arc -Z -s --keep-srvlog-files=4 --keep-srvlog-days=1 -p ${TEST_PGPORT} -d postgres --debug;echo $? -NUM_OF_SRVLOG_FILES_AFTER=`ls ${SRVLOG_PATH} | grep -v backup | wc -l` -echo "Number of remaining server log files: ${NUM_OF_SRVLOG_FILES_AFTER}" -#ls -l ${SRVLOG_PATH} +test_keep_srvlog_files_and_keep_srvlog_days_together ${SRVLOG_PATH} + +# Test with default log directory from TEST-0007 to TEST-0009 +init_backup --default-log_directory +DEFAULT_SRVLOG_PATH=${PGDATA_PATH}/`get_guc_value log_directory` + +echo '###### LOG FILE MANAGEMENT TEST-0007 ######' +echo '###### keep-srvlog-files only with default "log_directory" option ######' +test_keep_srvlog_files $DEFAULT_SRVLOG_PATH + +init_backup --default-log_directory + +echo '###### LOG FILE MANAGEMENT TEST-0008 ######' +echo '###### keep-srvlog-days only with default "log_directory" option ######' +test_keep_srvlog_days $DEFAULT_SRVLOG_PATH + +init_backup --default-log_directory + +echo '###### LOG FILE MANAGEMENT TEST-0009 ######' +echo '###### keep-srvlog-files and keep-srvlog-days together with default "log_directory" option ######' +test_keep_srvlog_files_and_keep_srvlog_days_together $DEFAULT_SRVLOG_PATH # clean up the temporal test data diff --git a/sql/common.sh b/sql/common.sh index c7444f4b..439ca11d 100644 --- a/sql/common.sh +++ b/sql/common.sh @@ -39,3 +39,14 @@ SRVLOG_PATH=${TEST_BASE}/srvlog TBLSPC_PATH=${TEST_BASE}/tblspc TEST_PGPORT=54321 export PGDATA=${PGDATA_PATH} + + +#============================================================================ +# Common functions +#============================================================================ + +get_guc_value() +{ + parameter=$1 + psql -qtAX -p ${TEST_PGPORT} -d postgres -c "SHOW $parameter" +} diff --git a/sql/restore.sh b/sql/restore.sh index 14bace0b..5c08dd95 100644 --- a/sql/restore.sh +++ b/sql/restore.sh @@ -46,67 +46,106 @@ which pgbench > /dev/null 2>&1 ERR_NUM=$? if [ $ERR_NUM != 0 ] then - echo "pgbench is not installed in this environment." - echo "It is needed in PATH for those regression tests." - exit 1 + echo "pgbench is not installed in this environment." + echo "It is needed in PATH for those regression tests." + exit 1 fi function cleanup() { - # cleanup environment - pg_ctl stop -m immediate > /dev/null 2>&1 - rm -fr ${PGDATA_PATH} - rm -fr ${BACKUP_PATH} - rm -fr ${ARCLOG_PATH} - rm -fr ${SRVLOG_PATH} - rm -fr ${TBLSPC_PATH} - mkdir -p ${ARCLOG_PATH} - mkdir -p ${SRVLOG_PATH} - mkdir -p ${TBLSPC_PATH} + # cleanup environment + pg_ctl stop -m immediate > /dev/null 2>&1 + rm -fr ${PGDATA_PATH} + rm -fr ${BACKUP_PATH} + rm -fr ${ARCLOG_PATH} + rm -fr ${SRVLOG_PATH} + rm -fr ${TBLSPC_PATH} + mkdir -p ${ARCLOG_PATH} + mkdir -p ${SRVLOG_PATH} + mkdir -p ${TBLSPC_PATH} } function init_backup() { - # cleanup environment - cleanup + DEFAULT_LOG_DIRECTORY="FALSE"; + while [ $# -gt 0 ]; do + case "$1" in + --default-log_directory) + DEFAULT_LOG_DIRECTORY="TRUE" + ;; + esac + shift + done + + # cleanup environment + cleanup - # create new database cluster - initdb ${USE_DATA_CHECKSUM} --no-locale -D ${PGDATA_PATH} > ${TEST_BASE}/initdb.log 2>&1 + # create new database cluster + initdb ${USE_DATA_CHECKSUM} --no-locale -D ${PGDATA_PATH} > ${TEST_BASE}/initdb.log 2>&1 if [ $? = "1" ]; then - echo "initdb did not succeed (--data-checksum not supported on this PostgreSQL version)." - echo "Aborting regression tests..." - exit + echo "initdb did not succeed (--data-checksum not supported on this PostgreSQL version)." + echo "Aborting regression tests..." + exit fi - cp ${PGDATA_PATH}/postgresql.conf ${PGDATA_PATH}/postgresql.conf_org - cat << EOF >> ${PGDATA_PATH}/postgresql.conf + cp ${PGDATA_PATH}/postgresql.conf ${PGDATA_PATH}/postgresql.conf_org + cat << EOF >> ${PGDATA_PATH}/postgresql.conf port = ${TEST_PGPORT} logging_collector = on wal_level = replica -log_directory = '${SRVLOG_PATH}' log_filename = 'postgresql-%F_%H%M%S.log' archive_mode = on archive_command = 'cp %p ${ARCLOG_PATH}/%f' max_wal_size = 512MB EOF - # start PostgreSQL - pg_ctl start -D ${PGDATA_PATH} -w -t 300 > /dev/null 2>&1 + if [ "$DEFAULT_LOG_DIRECTORY" = "FALSE" ]; then + cat << EOF >> $PGDATA_PATH/postgresql.conf +log_directory = '${SRVLOG_PATH}' +EOF + fi + + # start PostgreSQL + pg_ctl start -D ${PGDATA_PATH} -w -t 300 > /dev/null 2>&1 mkdir -p ${TBLSPC_PATH}/pgbench psql --no-psqlrc -p ${TEST_PGPORT} -d postgres > /dev/null 2>&1 << EOF CREATE TABLESPACE pgbench LOCATION '${TBLSPC_PATH}/pgbench'; CREATE DATABASE pgbench TABLESPACE = pgbench; EOF - pgbench -i -s $SCALE -p ${TEST_PGPORT} -d pgbench > ${TEST_BASE}/pgbench.log 2>&1 + pgbench -i -s $SCALE -p ${TEST_PGPORT} -d pgbench > ${TEST_BASE}/pgbench.log 2>&1 - # init backup catalog - init_catalog + # init backup catalog + init_catalog } function init_catalog() { - rm -fr ${BACKUP_PATH} - pg_rman init -B ${BACKUP_PATH} --quiet + rm -fr ${BACKUP_PATH} + pg_rman init -B ${BACKUP_PATH} --quiet +} + +function check_log() +{ + LOG_DIRECTORY=$1 + ls -t ${LOG_DIRECTORY} | head -n 1 | xargs -I {} head -n 1 ${LOG_DIRECTORY}/{} +} + +function restore_serverlog_tests() +{ + TEST_NAME=$1 + LOG_DIRECTORY=$2 + OPTION=${3:-""} + + check_log ${LOG_DIRECTORY} > ${TEST_BASE}/${TEST_NAME}-before.out + pg_rman backup -B ${BACKUP_PATH} -b full -p ${TEST_PGPORT} -d postgres --quiet ${OPTION};echo $? + pg_rman validate -B ${BACKUP_PATH} --quiet + #pg_rman show detail -B ${BACKUP_PATH} + pg_ctl stop -m fast > /dev/null 2>&1 + rm -fr ${LOG_DIRECTORY} # because pg_rman restores online serverlogs + mkdir -p ${LOG_DIRECTORY} + pg_rman restore -B ${BACKUP_PATH} --quiet;echo $? + check_log ${LOG_DIRECTORY} > ${TEST_BASE}/${TEST_NAME}-after.out + diff ${TEST_BASE}/${TEST_NAME}-before.out ${TEST_BASE}/${TEST_NAME}-after.out > /dev/null 2>&1; echo $? # 1 if diff exists. This means that server logs don't be backuped } init_backup @@ -351,6 +390,33 @@ psql --no-psqlrc -p ${TEST_PGPORT} -d db0012 -c "SELECT * FROM t0012;" > ${TEST_ diff ${TEST_BASE}/TEST-0012-before.out ${TEST_BASE}/TEST-0012-after.out echo '' +# Test for restoring serverlogs +echo '###### RESTORE COMMAND TEST-0013 ######' +echo '###### server logs (in the default log_directory) do not be backuped without "--with-serverlog" ######' +init_backup --default-log_directory +DEFAULT_SRVLOG_PATH=${PGDATA_PATH}/`get_guc_value log_directory` +restore_serverlog_tests "TEST-0013" ${DEFAULT_SRVLOG_PATH} +echo '' + +echo '###### RESTORE COMMAND TEST-0014 ######' +echo '###### server logs (in the default log_directory) should be backuped with "--with-serverlog" ######' +init_backup --default-log_directory +DEFAULT_SRVLOG_PATH=${PGDATA_PATH}/`get_guc_value log_directory` +restore_serverlog_tests "TEST-0014" ${DEFAULT_SRVLOG_PATH} "--with-serverlog" +echo '' + +echo '###### RESTORE COMMAND TEST-0015 ######' +echo '###### server logs do not be backuped without "--with-serverlog" ######' +init_backup +restore_serverlog_tests "TEST-0015" ${SRVLOG_PATH} +echo '' + +echo '###### RESTORE COMMAND TEST-0016 ######' +echo '###### server logs should be backuped with "--with-serverlog" ######' +init_backup +restore_serverlog_tests "TEST-0016" ${SRVLOG_PATH} "--with-serverlog" +echo '' + # clean up the temporal test data pg_ctl stop -m immediate > /dev/null 2>&1 rm -fr ${PGDATA_PATH}