Files
pg-stand-sync/README.md
T

64 lines
3.4 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# pg-stand-sync
Перенос базы PostgreSQL со стенда на локальный сервер: `pg_dump -Fc` → пересоздание локальной БД → `pg_restore -j`.
Только stdlib Python 3.10+, внешних зависимостей нет. Утилиты берутся из поставки pgAdmin 4.
## Быстрый старт
```bash
copy config.example.json config.json
```
Заполнить `source` (стенд) и `target` (локальная PG), затем:
```bash
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` — уже в локальной
базе, чтобы стенд оставался нетронутым.