pg-stand-sync

Перенос базы PostgreSQL со стенда на локальный сервер: pg_dump -Fc → пересоздание локальной БД → pg_restore -j. Только stdlib Python 3.10+, внешних зависимостей нет. Утилиты берутся из поставки pgAdmin 4.

Быстрый старт

copy config.example.json config.json

Заполнить source (стенд) и target (локальная PG), затем:

python pg_stand_sync.py

config.json в .gitignore — пароли в репозиторий не попадают.

Ключи

Ключ Что делает
-c, --config PATH другой конфиг (несколько стендов — несколько json)
--dump-only снять дамп со стенда и остановиться
--restore-only FILE залить готовый .dump локально, без обращения к стенду
--no-recreate не делать DROP/CREATE DATABASE, накатить поверх (pg_restore --clean --if-exists)
--dry-run напечатать команды, ничего не выполнять

Конфиг

Поле Значение по умолчанию Смысл
pg_bin_dir из PATH каталог с pg_dump.exe, pg_restore.exe, psql.exe
dump_dir dumps куда складывать дампы (относительный путь — от каталога скрипта)
keep_dumps 5 сколько последних дампов хранить, 0 — не чистить
source.password_env имя переменной окружения с паролем вместо password в файле
target.recreate true DROP + CREATE локальной базы перед восстановлением
dump.schemas / exclude_* [] ограничение состава: схемы, таблицы, данные таблиц
restore.jobs 4 параллельные воркеры pg_restore
restore.exit_on_error false падать на первой ошибке восстановления
post_restore_sql [] список SQL, выполняемых в целевой базе после восстановления

Пароли можно не хранить в файле: задать password_env и передать значение через окружение ($env:STAND_PGPASSWORD = '...'). Пароль всегда уходит в дочерний процесс через PGPASSWORD, в командной строке не появляется.

Как это работает

config.json
   │
   ├─ pg_dump -Fc  ──►  dumps/<db>-<timestamp>.dump      (стенд, только чтение)
   │
   ├─ psql: pg_terminate_backend → DROP DATABASE → CREATE DATABASE   (локально)
   │
   ├─ pg_restore --jobs N --no-owner --no-privileges
   │
   └─ post_restore_sql: анонимизация, правка настроек, GRANT'ы

Обезличивание данных стенда, если оно нужно, делается через post_restore_sql — уже в локальной базе, чтобы стенд оставался нетронутым.

S
Description
Перенос базы PostgreSQL со стенда на локальную PG: pg_dump -Fc + pg_restore, конфиг в JSON
Readme 303 KiB
Languages
Python 100%