notebookvb
This commit is contained in:
@@ -1,27 +1,56 @@
|
||||
#!/bin/bash
|
||||
# ==============================================================================
|
||||
# PostgreSQLRestore — obnovení PostgreSQL 18 ze zálohy
|
||||
# ==============================================================================
|
||||
#
|
||||
# CO DĚLÁ:
|
||||
# Obnoví celý PostgreSQL 18 server z pg_dumpall zálohy.
|
||||
# Pokud není zadán konkrétní adresář, automaticky najde nejnovější zálohu.
|
||||
#
|
||||
# POUŽITÍ:
|
||||
# bash postgresqlrestore_from_backup.sh [cesta_k_záloze]
|
||||
#
|
||||
# Bez argumentu — použije nejnovější zálohu:
|
||||
# bash postgresqlrestore_from_backup.sh
|
||||
#
|
||||
# S konkrétním adresářem:
|
||||
# bash postgresqlrestore_from_backup.sh /mnt/user/Backup/Critical/PostgreSQLBackup/tower/2026-05-23_0440
|
||||
#
|
||||
# TECHNICKÉ DETAILY:
|
||||
# - gunzip -c: dekomprimuje na stdout (nezahazuje archiv)
|
||||
# - pipe → docker exec -i psql: stream SQL příkazů do PostgreSQL
|
||||
# - --dbname=postgres: psql se musí připojit k existující DB (postgres je vždy)
|
||||
# - --clean + --if-exists v dumpu: DROP objekty před jejich vytvoření
|
||||
# - ${PIPESTATUS[1]}: exit kód psql (ne gunzip)
|
||||
#
|
||||
# POZOR:
|
||||
# Restore přepíše všechna stávající data! Spouštět vědomě, ne automaticky.
|
||||
# Chybové hlášky jako "role already exists" jsou normální — dump je idempotentní.
|
||||
# ==============================================================================
|
||||
set -x
|
||||
|
||||
# ==========================================================
|
||||
# CONFIGURATION
|
||||
# ==========================================================
|
||||
# ==============================================================================
|
||||
# KONFIGURACE
|
||||
# ==============================================================================
|
||||
CONTAINER_NAME="postgresql18"
|
||||
PG_HOST="localhost"
|
||||
PG_PORT="5432"
|
||||
PG_USER="vladimir.buzalka"
|
||||
export PGPASSWORD="Vlado7309208104++"
|
||||
|
||||
# Cesta k záloze kterou chceš obnovit
|
||||
# Lze předat jako argument, nebo nechá najít nejnovější
|
||||
# Např: $0 /mnt/user/Backup/Critical/PostgreSQLBackup/tower/2026-05-23_0200
|
||||
# Volitelný argument — konkrétní adresář zálohy.
|
||||
# Pokud není zadán, skript sám najde nejnovější.
|
||||
BACKUP_DIR="$1"
|
||||
|
||||
BASE_PATH="/mnt/user/Backup/Critical/PostgreSQLBackup/tower"
|
||||
|
||||
# ==========================================================
|
||||
# FIND BACKUP
|
||||
# ==========================================================
|
||||
# ==============================================================================
|
||||
# NALEZENÍ ZÁLOHY
|
||||
# ==============================================================================
|
||||
if [ -z "$BACKUP_DIR" ]; then
|
||||
echo "No backup path specified - using latest available backup"
|
||||
# ls -td: seřadit adresáře dle mtime, nejnovější první
|
||||
# head -1: vzít jen nejnovější
|
||||
BACKUP_DIR=$(ls -td "$BASE_PATH"/*/ 2>/dev/null | head -1)
|
||||
|
||||
if [ -z "$BACKUP_DIR" ]; then
|
||||
@@ -49,11 +78,15 @@ START_TS=$(date '+%Y-%m-%d %H:%M:%S')
|
||||
|
||||
ERR_FILE="$BACKUP_DIR/all_databases.restore.err"
|
||||
|
||||
# ==========================================================
|
||||
# ==============================================================================
|
||||
# RESTORE
|
||||
# pg_dumpall dump se obnovuje přes psql
|
||||
# --clean + --if-exists v dumpu zajišťuje drop před recreate
|
||||
# ==========================================================
|
||||
# gunzip -c: dekomprimuje all_databases.sql.gz na stdout (soubor zůstane)
|
||||
# pipe → docker exec -i psql: SQL streamed přímo do PostgreSQL
|
||||
# -i: nutné pro stdin stream (bez -i by psql nedostával vstup)
|
||||
# --dbname=postgres: psql se musí připojit k nějaké DB — postgres vždy existuje
|
||||
# Záloha obsahuje příkazy pro všechny DB, role a grants — psql je postupně vykoná.
|
||||
# 2> "$ERR_FILE": stderr psql (chyby, warnings) — "role already exists" je normální
|
||||
# ==============================================================================
|
||||
echo "Restoring all databases to PostgreSQL..."
|
||||
gunzip -c "$BACKUP_FILE" \
|
||||
| docker exec -i \
|
||||
@@ -66,11 +99,12 @@ gunzip -c "$BACKUP_FILE" \
|
||||
--dbname="postgres" \
|
||||
2> "$ERR_FILE"
|
||||
|
||||
# PIPESTATUS[1] = exit kód docker exec / psql (index 1 = druhý prvek pipe)
|
||||
RESTORE_EXIT=${PIPESTATUS[1]}
|
||||
|
||||
# ==========================================================
|
||||
# VALIDATION
|
||||
# ==========================================================
|
||||
# ==============================================================================
|
||||
# VALIDACE
|
||||
# ==============================================================================
|
||||
if [ $RESTORE_EXIT -eq 0 ]; then
|
||||
echo "SUCCESS: All databases restored successfully"
|
||||
rm -f "$ERR_FILE"
|
||||
|
||||
Reference in New Issue
Block a user