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