67 lines
2.6 KiB
Bash
67 lines
2.6 KiB
Bash
# -------------------------------------------------------------------------------------
|
|
# A backup and restore strategy for PostgreSQL with "pg_dump" and "pg_restore" commands.
|
|
# -------------------------------------------------------------------------------------
|
|
|
|
check_command "pg_dump"
|
|
check_command "psql"
|
|
check_command "pg_restore"
|
|
|
|
# Make use of PostgreSQL 9.3+ options if available
|
|
if [[ ${psql_majorminor} -ge 9003 ]]; then
|
|
PG_PARALLEL="-j 5"
|
|
PG_SNAPSHOT_OPT="--no-synchronized-snapshots"
|
|
fi
|
|
|
|
function prepare_backup_db {
|
|
check_config_var "CONFLUENCE_BACKUP_DB_TMP"
|
|
check_config_var "POSTGRES_USERNAME"
|
|
check_config_var "POSTGRES_HOST"
|
|
check_config_var "POSTGRES_PORT"
|
|
check_config_var "CONFLUENCE_DB"
|
|
}
|
|
|
|
function backup_db {
|
|
[ -d "${CONFLUENCE_BACKUP_DB_TMP}" ] && rm -r "${CONFLUENCE_BACKUP_DB_TMP}"
|
|
mkdir -p "${CONFLUENCE_BACKUP_DB_TMP}"
|
|
run pg_dump -U "${POSTGRES_USERNAME}" -h "${POSTGRES_HOST}" --port=${POSTGRES_PORT} ${PG_PARALLEL} -Fd -d "${CONFLUENCE_DB}" ${PG_SNAPSHOT_OPT} -f "${CONFLUENCE_BACKUP_DB_TMP}"
|
|
perform_rsync_compress_db
|
|
}
|
|
|
|
function prepare_restore_db {
|
|
check_config_var "POSTGRES_USERNAME"
|
|
check_config_var "POSTGRES_HOST"
|
|
check_config_var "POSTGRES_PORT"
|
|
check_var "CONFLUENCE_RESTORE_DB"
|
|
|
|
if run psql -U "${POSTGRES_USERNAME}" -h "${POSTGRES_HOST}" --port=${POSTGRES_PORT} -d "${CONFLUENCE_DB}" -c "" 2>/dev/null; then
|
|
local table_count=$(psql -U "${POSTGRES_USERNAME}" -h "${POSTGRES_HOST}" --port=${POSTGRES_PORT} -d "${CONFLUENCE_DB}" -tqc '\dt' | grep -v "^$" | wc -l)
|
|
if [ "${table_count}" -gt 0 ]; then
|
|
error "Database '${CONFLUENCE_DB}' already exists and contains ${table_count} tables"
|
|
else
|
|
error "Database '${CONFLUENCE_DB}' already exists"
|
|
fi
|
|
bail "Cannot restore over existing database '${CONFLUENCE_DB}', please ensure it does not exist before restoring"
|
|
fi
|
|
}
|
|
|
|
function restore_db {
|
|
run pg_restore -U "${POSTGRES_USERNAME}" -h "${POSTGRES_HOST}" --port=${POSTGRES_PORT} ${PG_PARALLEL} \
|
|
-d postgres -C -Fd "${CONFLUENCE_RESTORE_DB}"
|
|
}
|
|
|
|
function cleanup_incomplete_db_backup {
|
|
info "Cleaning up DB backup created as part of failed/incomplete backup"
|
|
rm -r "${CONFLUENCE_BACKUP_DB_TMP}"
|
|
}
|
|
|
|
function cleanup_old_db_backups {
|
|
# Not required as old backups with this strategy are typically cleaned up in the archiving strategy.
|
|
no_op
|
|
}
|
|
|
|
function perform_rsync_compress_db {
|
|
[ -d "${CONFLUENCE_BACKUP_DB}" ] && rm -r "${CONFLUENCE_BACKUP_DB}"
|
|
mkdir -p "${CONFLUENCE_BACKUP_DB}"
|
|
rsync --remove-source-files -h $CONFLUENCE_BACKUP_DB_TMP/* $CONFLUENCE_BACKUP_DB/
|
|
}
|