tune timescale import db
Some checks failed
deploy / deploy (push) Failing after 14s
test / smoke-test (push) Has been cancelled

This commit is contained in:
Dusan Vojacek
2026-04-05 10:29:30 +02:00
parent 38e5af5373
commit dd47a22d61

View File

@@ -9,17 +9,28 @@
# 2) docker compose -f /opt/ems-deploy/docker-compose.yml --env-file /opt/ems-deploy/.env up -d db
# 3) Počkej na healthy: docker compose ... ps
# 4) bash app/scripts/import_ems_db.sh /tmp/ems.dump
# 5) Celý stack: /opt/ems-deploy/deploy.sh (nebo docker compose up -d)
# 5) flyway migrate (doplní PK / FK po problematickém restore V032V034)
# 6) Celý stack: /opt/ems-deploy/deploy.sh (nebo docker compose up -d)
#
# Volby prostředí:
# EMS_DEPLOY_ROOT=/opt/ems-deploy (výchozí)
# COMPOSE_FILE, ENV_FILE přepíšou cesty k souborům
# EMS_SKIP_TIMESCALE_RESTORE_HOOKS=1 přeskočí timescaledb_pre_restore / post_restore (jen výjimečně)
#
# Poznámky:
# - Záloha musí být z podobného stacku (Postgres 16 + Timescale). Jiná major verze může selhat.
# - Dump by měl obsahovat i Flyway metadata (tabulku historie), jinak při dalším startu Flyway znovu spustí migrace a může spadnout.
# - TimescaleDB: u pg_restore nepoužívejte paralelizaci (-j); může zůstat nekonzistentní katalog chunků
# (chyba „chunk not found“ / selhání ADD PK na hypertable). Viz dokumentace Timescale backup/restore.
# TimescaleDB doporučení z dokumentace (full restore):
# - Cílová DB má mít rozšíření timescaledb před restore.
# - Před pg_restore: SELECT timescaledb_pre_restore();
# - Po pg_restore: SELECT timescaledb_post_restore();
# - Stejná major verze Postgres + Timescale jako u zálohy.
# - Bez paralelního pg_restore (-j) může rozbít pořadí objektů a chunky.
#
# pg_restore z běžného pg_dump i tak může u hypertable vygenerovat nevhodné DDL (např. ALTER TABLE ONLY
# u FK). Po importu proto spusťte flyway migrate (V034 doplní chybějící FK).
#
# Robustnější varianta (schema + data zvlášť) viz oficiální návod Timescale / Tiger Data:
# pg_dump -Fc --section=pre-data --exclude-schema='_timescaledb*' …
# na cíli znovu create_hypertable(...) (např. přes Flyway), data COPY / parallel-copy.
# Tento skript řeší klasický jednosouborový -Fc restore, ne oddělené sekce.
set -euo pipefail
@@ -64,16 +75,49 @@ if ! docker compose -f "$COMPOSE_FILE" --env-file "$ENV_FILE" ps --status runnin
exit 1
fi
compose_db() {
docker compose -f "$COMPOSE_FILE" --env-file "$ENV_FILE" exec -T \
-e "PGPASSWORD=${DB_PASSWORD}" \
db \
"$@"
}
CID="$(docker compose -f "$COMPOSE_FILE" --env-file "$ENV_FILE" ps -q db)"
echo "Kopíruji dump do kontejneru..."
docker cp "$DUMP" "${CID}:/tmp/ems_import.dump"
echo "Obnovuji databázi ems (--clean smaže existující objekty ve schématech ze zálohy)..."
docker compose -f "$COMPOSE_FILE" --env-file "$ENV_FILE" exec -T \
-e "PGPASSWORD=${DB_PASSWORD}" \
db \
pg_restore -U "$DB_USER" -d ems --clean --if-exists --no-owner --no-acl --verbose /tmp/ems_import.dump
if [[ "${EMS_SKIP_TIMESCALE_RESTORE_HOOKS:-0}" != "1" ]]; then
echo "Timescale: CREATE EXTENSION + timescaledb_pre_restore()…"
compose_db psql -U "$DB_USER" -d ems -v ON_ERROR_STOP=1 \
-c "CREATE EXTENSION IF NOT EXISTS timescaledb;"
compose_db psql -U "$DB_USER" -d ems -v ON_ERROR_STOP=1 \
-c "SELECT timescaledb_pre_restore();"
else
echo "WARN: EMS_SKIP_TIMESCALE_RESTORE_HOOKS=1 přeskakuji pre_restore"
fi
echo "Obnovuji databázi ems (--clean smaže existující objekty ve schématech ze zálohy)…"
set +e
compose_db pg_restore -U "$DB_USER" -d ems --clean --if-exists --no-owner --no-acl --verbose /tmp/ems_import.dump
RESTORE_EXIT=$?
set -e
if [[ "${EMS_SKIP_TIMESCALE_RESTORE_HOOKS:-0}" != "1" ]]; then
echo "Timescale: timescaledb_post_restore()…"
if ! compose_db psql -U "$DB_USER" -d ems -v ON_ERROR_STOP=1 \
-c "SELECT timescaledb_post_restore();"; then
echo "ERROR: timescaledb_post_restore() selhal" >&2
RESTORE_EXIT=1
fi
else
echo "WARN: EMS_SKIP_TIMESCALE_RESTORE_HOOKS=1 přeskakuji post_restore"
fi
docker compose -f "$COMPOSE_FILE" --env-file "$ENV_FILE" exec -T db rm -f /tmp/ems_import.dump
echo "Import dokončen. Spusť zbytek stacku (deploy.sh nebo docker compose up -d)."
if [[ "$RESTORE_EXIT" -ne 0 ]]; then
echo "WARN: pg_restore skončil s kódem $RESTORE_EXIT (časté u FK na hypertable). Spusť flyway migrate." >&2
fi
echo "Import dokončen (exit pg_restore=$RESTORE_EXIT). Doporučeno: flyway migrate, pak deploy.sh / docker compose up -d."
exit "$RESTORE_EXIT"