Files
psql_tasks/move_psql03.md
T
2026-07-21 00:52:15 +08:00

102 lines
4.5 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.
Да, вы абсолютно правы! Обычный одиночный файл (`-F c`) дампится **в один поток**, и на больших объемах (десятки/сотни гигабайт) это может происходить очень долго.
Использование **`-F d` (Directory format)** с флагом **`-j` (jobs / параллельность)** ускорит и создание дампа, и его анализ, так как данные таблиц будут выгружаться параллельно в несколько потоков.
Более того, формат каталога (`-F d`) **намного удобнее** для выполнения нашей задачи:
1. Вы можете дампить в `-j4` или `-j8` (по количеству ядер CPU).
2. Вы по-прежнему можете использовать `pg_restore` с секциями `--section=pre-data`, `--section=data` и `--section=post-data` без ручного редактирования файлов `.list`!
Ниже обновленный, максимально быстрый пошаговый план.
---
## Этап 1. Быстрое создание дампа на `dc01-srv01` (в параллельном режиме)
Создаём дамп в виде директории с 4 параллельными потоками:
```bash
# Создаем папку под дамп
mkdir -p /opt/pg_dumps/edemo_ehd1.dir
# Запускаем параллельный дамп
pg_dump -h localhost -p 5436 -U postgres -d edemo_ehd1 \
-F d \
-j 4 \
--no-tablespaces \
--no-owner \
-f /opt/pg_dumps/edemo_ehd1.dir
```
> **Совет:** Количество потоков `-j` выбирайте исходя из доступных ядер процесора на сервере (например, `-j 4` или `-j 8`). Нагрузка на CPU и диски вырастет, но дамп выполнится в разы быстрее.
---
## Этап 2. Быстрое восстановление на `dc02-srv02` (без ручной нарезки файлов)
Перенесите всю папку `/opt/pg_dumps/edemo_ehd1.dir` на целевой сервер.
Формат `-F d` позволяет `pg_restore` самому разделить процесс на 3 этапа с помощью флага `--section`. Это избавляет от необходимости вручную правильные листы через `.list` файлы!
### Шаг 2.1. Восстанавливаем структуру (Pre-Data)
Создаем базовые объекты: таблицы, типы, последовательности. Внешних ключей и триггеров на этом этапе нет.
```bash
pg_restore -h localhost -p 5432 -U postgres -d edemo_ehd1 \
-F d \
--no-tablespaces \
--no-owner \
--section=pre-data \
/opt/pg_dumps/edemo_ehd1.dir
```
---
### Шаг 2.2. Загружаем данные в параллельном режиме (Data)
Отключаем триггеры (`--disable-triggers`), чтобы исключить ваши ошибки (дедлоки, вызовы функций для несуществующих связей) и включаем многопоточность (`-j 4`):
```bash
pg_restore -h localhost -p 5432 -U postgres -d edemo_ehd1 \
-F d \
-j 4 \
--no-tablespaces \
--no-owner \
--section=data \
--disable-triggers \
/opt/pg_dumps/edemo_ehd1.dir
```
> **Важно:** Флаг `--disable-triggers` сработает корректно только под суперпользователем (`postgres`).
---
### Шаг 2.3. Создаем индексы, ключи, триггеры и вьюхи (Post-Data)
Данные уже на месте. Теперь параллельно накатываем индексы, первичные и внешние ключи, триггеры и представления.
```bash
pg_restore -h localhost -p 5432 -U postgres -d edemo_ehd1 \
-F d \
-j 4 \
--no-tablespaces \
--no-owner \
--section=post-data \
/opt/pg_dumps/edemo_ehd1.dir
```
---
### Шаг 2.4. Финальная сборка статистики
После завершения накатывания пост-данных обновляем статистику, чтобы оптимизатор Postgres знал о размерах таблиц:
```bash
psql -h localhost -p 5432 -U postgres -d edemo_ehd1 -c "VACUUM ANALYZE;"
```