#!/bin/bash # ============================================================================= # dbrestore.sh # Przywracanie pojedynczej bazy PostgreSQL z pliku .sql lub .sql.gz # wykonanego przez postgres_backup.sh # ============================================================================= CREDENTIALS_FILE="/usr/local/directadmin/conf/postgresql.conf" # Kolory tylko na terminalu if [[ -t 1 ]]; then RED='\033[0;31m'; GREEN='\033[0;32m'; YELLOW='\033[1;33m'; NC='\033[0m' else RED=''; GREEN=''; YELLOW=''; NC='' fi ok() { echo -e "${GREEN}[OK]${NC} $*"; } info() { echo -e " $*"; } warn() { echo -e "${YELLOW}[WARN]${NC} $*"; } die() { echo -e "${RED}[BŁĄD]${NC} $*" >&2; exit 1; } # --------------------------------------------------------------------------- # Sposób użycia # --------------------------------------------------------------------------- usage() { cat < Opis: Przywraca bazę danych z pliku wykonanego przez postgres_backup.sh. Obsługuje pliki nieskompresowane (.sql) i skompresowane (.sql.gz). Jeśli docelowa baza istnieje, zostanie usunięta i odtworzona od nowa. Przykłady: $(basename "$0") /home/admin/postgres_backup/19-02-2026/sklep.sql $(basename "$0") /home/admin/postgres_backup/19-02-2026/sklep.sql.gz Uwaga: Plik poświadczeń: ${CREDENTIALS_FILE} Baza 'postgres' jest przywracana przez połączenie do 'template1', pozostałe bazy – przez połączenie do 'postgres'. EOF } # --------------------------------------------------------------------------- # Argumenty # --------------------------------------------------------------------------- if [[ $# -eq 0 ]]; then usage exit 0 fi FILE="$1" [[ -f "$FILE" ]] || die "Plik nie istnieje: ${FILE}" case "$FILE" in *.sql.gz|*.sql) ;; *) die "Nieobsługiwany format pliku. Oczekiwany: .sql lub .sql.gz" ;; esac # --------------------------------------------------------------------------- # Poświadczenia # --------------------------------------------------------------------------- [[ -f "$CREDENTIALS_FILE" ]] \ || die "Brak pliku poświadczeń: ${CREDENTIALS_FILE}" _perms=$(stat -c '%a' "$CREDENTIALS_FILE") [[ "$_perms" == "600" || "$_perms" == "400" ]] \ || die "Zbyt otwarte uprawnienia na ${CREDENTIALS_FILE} (${_perms}). Wymagane: 600 lub 400." _line=$(head -1 "$CREDENTIALS_FILE") PGHOST=$(echo "$_line" | cut -d: -f1) PGPORT=$(echo "$_line" | cut -d: -f2) PGUSER=$(echo "$_line" | cut -d: -f4) [[ -n "$PGHOST" && -n "$PGPORT" && -n "$PGUSER" ]] \ || die "Nieprawidłowy format pliku poświadczeń. Oczekiwany: host:port:database:user:password" export PGPASSFILE="$CREDENTIALS_FILE" # --------------------------------------------------------------------------- # Ustal bazę inicjalną (nie można przywracać 'postgres' będąc do niej podłączonym) # --------------------------------------------------------------------------- DB_NAME=$(basename "$FILE" | sed 's/\.sql\.gz$//; s/\.sql$//') if [[ "$DB_NAME" == "postgres" ]]; then INIT_DB="template1" else INIT_DB="postgres" fi # --------------------------------------------------------------------------- # Przywracanie # --------------------------------------------------------------------------- echo "" ok "Plik: ${FILE}" info "Baza: ${DB_NAME}" info "Serwer: ${PGHOST}:${PGPORT} Użytkownik: ${PGUSER}" echo "" case "$FILE" in *.sql.gz) gunzip -c "$FILE" \ | psql -h "$PGHOST" -p "$PGPORT" -U "$PGUSER" \ --no-password -d "$INIT_DB" RC=${PIPESTATUS[1]} ;; *.sql) psql -h "$PGHOST" -p "$PGPORT" -U "$PGUSER" \ --no-password -d "$INIT_DB" -f "$FILE" RC=$? ;; esac echo "" if [[ $RC -eq 0 ]]; then ok "Przywracanie bazy '${DB_NAME}' zakończone pomyślnie." else warn "Przywracanie bazy '${DB_NAME}' zakończone z ostrzeżeniami lub błędami (kod: ${RC})." warn "Sprawdź powyższy output w celu identyfikacji problemów." fi exit $RC