pg-stand-sync: перенос БД со стенда на локальную PG
This commit is contained in:
@@ -0,0 +1,63 @@
|
||||
# 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` — уже в локальной
|
||||
базе, чтобы стенд оставался нетронутым.
|
||||
Reference in New Issue
Block a user