- **Смена tablespace** с кастомного на дефолтный - **Удаление OWNER** (замена на `current_user`) - **Удаление ROLE/TABLESPACE** из дампа - **Разделение по типам объектов** --- ## Этап 1. Создание дампов ### 1.1. Дамп СХЕМЫ (только таблицы, без функций/триггеров) ```bash pg_dump -p 5436 -U postgres -d edemo_ehd1 \ --schema-only \ --clean \ --if-exists \ --exclude-function \ --exclude-trigger \ --exclude-table="*" \ --exclude-schema=pg_catalog,information_schema \ 2>/dev/null | \ grep -vE '^(CREATE|ALTER|DROP) (ROLE|TABLESPACE)' | \ sed -E 's/OWNER TO [^;]+;/OWNER TO current_user;/g' | \ sed -E 's/ TABLESPACE = [^;]+//g' \ > /opt/pg_dumps/01_schema_tables.sql ``` **Что делает:** - `--schema-only` — только структура - `--clean --if-exists` — DROP IF EXISTS перед созданием - `--exclude-function --exclude-trigger` — исключаем функции и триггеры - `grep -vE` — удаляем строки с ROLE и TABLESPACE - `sed` — меняем OWNER на current_user и удаляем TABLESPACE --- ### 1.2. Дамп ДАННЫХ (без схемы, с отключенными триггерами) ```bash pg_dump -p 5436 -U postgres -d edemo_ehd1 \ --data-only \ --disable-triggers \ --no-owner \ --no-privileges \ -F c \ -f /opt/pg_dumps/02_data.dump ``` **Что делает:** - `--data-only` — только данные - `--disable-triggers` — отключаем триггеры при дампе - `--no-owner` — не сохраняем владельцев - `-F c` — кастомный формат (для скорости) --- ### 1.3. Дамп ФУНКЦИЙ И ПРОЦЕДУР ```bash pg_dump -p 5436 -U postgres -d edemo_ehd1 \ --schema-only \ --clean \ --if-exists \ --function \ --procedure \ 2>/dev/null | \ grep -vE '^(CREATE|ALTER|DROP) (ROLE|TABLESPACE)' | \ sed -E 's/OWNER TO [^;]+;/OWNER TO current_user;/g' | \ sed -E 's/ TABLESPACE = [^;]+//g' \ > /opt/pg_dumps/03_functions.sql ``` **Что делает:** - `--function --procedure` — выгружаем только функции и процедуры - Остальное аналогично пункту 1.1 --- ### 1.4. Дамп ТРИГГЕРОВ ```bash pg_dump -p 5436 -U postgres -d edemo_ehd1 \ --schema-only \ --clean \ --if-exists \ --trigger \ 2>/dev/null | \ grep -vE '^(CREATE|ALTER|DROP) (ROLE|TABLESPACE)' | \ sed -E 's/OWNER TO [^;]+;/OWNER TO current_user;/g' | \ sed -E 's/ TABLESPACE = [^;]+//g' \ > /opt/pg_dumps/04_triggers.sql ``` --- ### 1.5. Дамп ПРЕДСТАВЛЕНИЙ (VIEWS) ```bash # Полный дамп схемы pg_dump -p 5436 -U postgres -d edemo_ehd1 \ --schema-only \ --clean \ --if-exists \ 2>/dev/null | \ grep -vE '^(CREATE|ALTER|DROP) (ROLE|TABLESPACE)' | \ sed -E 's/OWNER TO [^;]+;/OWNER TO current_user;/g' | \ sed -E 's/ TABLESPACE = [^;]+//g' \ > /opt/pg_dumps/05_full_schema_clean.sql # Извлекаем только VIEWS grep -E 'CREATE (OR REPLACE )?VIEW' /opt/pg_dumps/05_full_schema_clean.sql \ > /opt/pg_dumps/05_views.sql # Удаляем временный файл rm -f /opt/pg_dumps/05_full_schema_clean.sql ``` --- ### 1.6. (Опционально) Дамп ВНЕШНИХ КЛЮЧЕЙ (если нужно создавать отдельно) ```bash pg_dump -p 5436 -U postgres -d edemo_ehd1 \ --schema-only \ --clean \ --if-exists \ --constraint \ 2>/dev/null | \ grep -vE '^(CREATE|ALTER|DROP) (ROLE|TABLESPACE)' | \ sed -E 's/OWNER TO [^;]+;/OWNER TO current_user;/g' | \ sed -E 's/ TABLESPACE = [^;]+//g' \ > /opt/pg_dumps/06_constraints.sql ``` --- ## Этап 2. Восстановление в целевой БД ### 2.0. Подготовка целевой БД ```bash # Параметры NEW_HOST="new_host" USER="postgres" NEW_DB="new_db" # Создаем БД (если не существует) createdb -h $NEW_HOST -U $USER $NEW_DB # Или пересоздаем dropdb -h $NEW_HOST -U $USER --if-exists $NEW_DB createdb -h $NEW_HOST -U $USER $NEW_DB # Убеждаемся, что используется дефолтный tablespace psql -h $NEW_HOST -U $USER -d $NEW_DB -c "SHOW default_tablespace;" ``` --- ### 2.1. Восстановление ТАБЛИЦ (схема) ```bash echo "=== ШАГ 2.1: Восстановление таблиц ===" psql -h $NEW_HOST -U $USER -d $NEW_DB -f /opt/pg_dumps/01_schema_tables.sql # Проверяем psql -h $NEW_HOST -U $USER -d $NEW_DB -c "\dt" | head -20 ``` **Ожидаемый результат:** Все таблицы созданы, без функций и триггеров. --- ### 2.2. Восстановление ДАННЫХ ```bash echo "=== ШАГ 2.2: Восстановление данных ===" pg_restore -h $NEW_HOST -U $USER -d $NEW_DB \ --data-only \ --disable-triggers \ --no-owner \ --no-privileges \ -j 1 \ /opt/pg_dumps/02_data.dump # Проверяем количество записей psql -h $NEW_HOST -U $USER -d $NEW_DB -c " SELECT schemaname, tablename, n_live_tup FROM pg_stat_user_tables WHERE schemaname = 'public' ORDER BY n_live_tup DESC LIMIT 10;" ``` **Ожидаемый результат:** Данные залиты, триггеры не срабатывали. --- ### 2.3. Восстановление ФУНКЦИЙ И ПРОЦЕДУР ```bash echo "=== ШАГ 2.3: Восстановление функций и процедур ===" # Проверяем, есть ли уже функции psql -h $NEW_HOST -U $USER -d $NEW_DB < 0 THEN RAISE NOTICE '⚠️ %: % сиротских записей (ссылаются на %)', r.constraint_name, v_count, r.fk_table; v_error_count := v_error_count + 1; END IF; END LOOP; IF v_error_count = 0 THEN RAISE NOTICE '✅ Все внешние ключи корректны!'; ELSE RAISE NOTICE '❌ Найдено проблем: %', v_error_count; END IF; END \$\$; EOF ``` --- ### 3.2. Проверка работы триггеров ```bash psql -h $NEW_HOST -U $USER -d $NEW_DB <