diff --git a/move_psql.md b/move_psql.md deleted file mode 100644 index 99164d9..0000000 --- a/move_psql.md +++ /dev/null @@ -1,17 +0,0 @@ -## Этап 1. Создание дампов -### 1.1. Дамп СХЕМЫ (только таблицы, без функций/триггеров) -```shell -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 -``` diff --git a/move_psql01.md b/move_psql01.md new file mode 100644 index 0000000..78dec44 --- /dev/null +++ b/move_psql01.md @@ -0,0 +1,460 @@ +- **Смена 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 <