#!/bin/bash # آزمونِ بازیابی روی خودِ ۲۴۷: آخرین نسخه‌ی کامل + همه‌ی WALِ رسیده را در پوشه‌ی موقت بالا می‌آورد # (Postgresِ موقت روی سوکتِ داخلِ همان پوشه، بی‌پورتِ شبکه؛ به Postgresِ دیگرانِ این ماشین دست نمی‌زند)، # شمارشِ جدول‌های کاربر/ورود/پرداخت و آخرین زمان‌ها را چاپ می‌کند و همه‌چیز را پاک می‌کند. # همان پرسش را روی ۲۴۹ بزنید و مقایسه کنید. با آرگومان، تا یک لحظه برمی‌گردد: # restore-check.sh '2026-10-10 16:30:00+03:30' # با KEEP=1 پوشه و Postgresِ موقت می‌مانند (برای بازیابیِ واقعی: از آن pg_dump بگیرید، بعد pg_ctl stop و rm). set -euo pipefail # ROOT/BIN از یونیت می‌آیند؛ پیش‌فرض‌ها همان بکاپِ ۲۴۹ است (یونیت‌های zareian-pg216-* برای سرورِ جدید). ROOT="${PGB_ROOT:-/home/administrator/zareian-pgbackup}" BIN="${PGB_BIN:-/usr/lib/postgresql/14/bin}" TARGET="${1:-}" latest=$(ls -1d "$ROOT"/base/2* | tail -1) work=$(mktemp -d "$ROOT/restore-check.XXXXXX") if [ "${KEEP:-0}" != 1 ]; then trap '"$BIN/pg_ctl" -D "$work/data" -m immediate stop >/dev/null 2>&1 || true; rm -rf "$work"' EXIT fi cp -a "$latest" "$work/data" mkdir "$work/wal" cp "$ROOT"/wal/* "$work/wal/" # فایلِ در حالِ نوشتن (.partial) هم داده‌ی واقعی است؛ برای بازیابی نامِ کامل می‌گیرد. for f in "$work"/wal/*.partial; do [ -e "$f" ] && mv "$f" "${f%.partial}"; done # postgresql.conf و pg_hba.conf روی اوبونتو در /etc اند، نه در پوشه‌ی داده؛ برای نمونه‌ی موقت ساخته می‌شوند. cat > "$work/data/postgresql.conf" < "$work/data/pg_hba.conf" : > "$work/data/postgresql.auto.conf" touch "$work/data/recovery.signal" "$BIN/pg_ctl" -D "$work/data" -l "$work/log" -w -t 600 start >/dev/null for _ in $(seq 120); do [ "$("$BIN/psql" -h "$work" -U postgres -d zareian_mathapp -Atc 'select pg_is_in_recovery()')" = f ] && break sleep 1 done echo "base: $(basename "$latest") target: ${TARGET:-end of WAL}" "$BIN/psql" -h "$work" -U postgres -d zareian_mathapp -c " select 'users' what, count(*)::text n, max(created_at)::text latest from accounts_user union all select 'login_events', count(*)::text, max(created_at)::text from accounts_loginevent union all select 'orders', count(*)::text, max(created_at)::text from payment_order union all select 'transactions', count(*)::text, max(created_at)::text from payment_transaction union all select 'status_changes', count(*)::text, max(created_at)::text from statuslog_statuschangelog;" [ "${KEEP:-0}" = 1 ] && echo "kept: $work (psql -h $work -U postgres -d zareian_mathapp)" exit 0