at-confluence-backup/database-postgresql.sh
2022-10-31 09:37:42 -07:00

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/
}