Инструкция по миграции MySQL → PostgreSQL

Введение

circle-exclamation

Вам необходимо сделать миграцию с mysql на PostgreSQL, а так же выполнить миграцию данных с 16 версии PostgreSQL на 17 версию.

Эта инструкция описывает процесс миграции базы данных Sherpa AI Server с MySQL на PostgreSQL. Миграция включает перенос данных, обновление конфигураций и переход на новую систему управления базами данных.

circle-info

ВНИМАНИЕ! Если у вас есть возможность ОТКАЗАТЬСЯ ОТ ДАННЫХ (ЕСЛИ ОНИ ВАМ НЕ НУЖНЫ) рекомендуем вместо выполнения данной инструкции перейти к инструкции по установке c нуля:

Системные требования

Минимальные требования для миграции:

  • Свободное место на диске: минимум 2x размер базы данных (для исходных данных + миграция)

  • Оперативная память: минимум 4 ГБ RAM для pgloader

  • Docker: версия 20.10+ с поддержкой Docker Compose

  • Сетевое подключение: стабильное соединение с базами данных

Предварительные проверки

Перед запуском миграции выполните следующие проверки:

chevron-right💡 Комментарии к проверкамhashtag

df -h - показывает использование дискового пространства в человеко-читаемом формате

  • Проверьте, что свободного места минимум в 2 раза больше размера вашей базы данных

free -h - показывает информацию об оперативной памяти

  • Для pgloader требуется минимум 4 ГБ RAM

  • При недостатке памяти миграция может завершиться с ошибкой "Heap exhausted"

docker --version - проверяет версию Docker

  • Требуется Docker 20.10+ для корректной работы всех функций

docker compose version - проверяет версию Docker Compose

  • Убедитесь, что compose поддерживает современный синтаксис

docker ps - показывает запущенные контейнеры

  • Должны быть видны контейнеры mysql/postgres для доступа к данным

Подготовка к миграции

Скачивание необходимых файлов

Если контур закрыт, необходимо скачать заранее АРХИВЫ ДЛЯ УСТАНОВКИ и в дополнение следующие файлы:

chevron-right💡 Комментарии к скачиванию файловhashtag

curl -fSL -OJ - скачивает файлы с сервера

  • -f - тихо завершается при ошибках сервера

  • -S - показывает ошибки даже при использовании -f

  • -L - следует редиректам

  • -O - сохраняет файл с именем с сервера

  • -J - использует имя файла, предоставленное сервером

pgloader_image.tar - Docker-образ с инструментом pgloader для переноса данных alpine_image.tar - легковесный Linux-образ для операций с файлами

Создайте директорию /opt/SherpaAIServerNew и поместите в нее все скачанные архивы И ФАЙЛЫ ИЗ ИНСТРУКЦИИ ПО УСТАНОВКЕ:

chevron-right💡 Комментарии к подготовке директорииhashtag

sudo mkdir -p - создает директорию с родительскими папками

  • -p предотвращает ошибку если директория уже существует

sudo mv - перемещает файлы в новую директорию

  • Перемещение в /opt/SherpaAIServerNew изолирует файлы миграции от текущей установки

Что скачивается:

  • pgloader_image.tar - Docker-образ с pgloader и необходимыми инструментами

  • alpine_image.tar - легковесный образ Alpine Linux для работы с volume (не влияет на вашу текущую операционую систему)

Остановка сервисов

  1. Остановка контейнеров кроме баз данных:

chevron-right💡 Комментарии к остановке сервисовhashtag

docker compose stop - останавливает указанные сервисы без удаления

  • orchestrator - основной сервис оркестрации

  • embed - сервис для работы с эмбеддингами

  • nginx - веб-сервер и прокси

  • vllm - сервис языковой модели

Две команды - выполнены обе версии синтаксиса для совместимости Оставшиеся сервисы - pgembeding (PostgreSQL с эмбеддингами) и orchestrator-db (MySQL) должны продолжать работать для доступа к данным

circle-info

Почему останавливаем сервисы: Во время миграции необходимо исключить любые изменения в базе данных, чтобы обеспечить консистентность данных.

circle-info

Примечание: Не нужно удалять контейнеры, только остановить. Должны остаться pgembeding и orchestrator-db.

Создание резервных копий

Определение имен volumes:

Сначала найдите правильные имена volumes в вашей системе:

chevron-right💡 Комментарии к определению volumeshashtag

docker volume list - показывает все Docker volumes в системе

  • DRIVER - тип драйвера (обычно local)

  • VOLUME NAME - уникальное имя volume

Префикс имен - зависит от названия папки проекта:

  • Для папки SherpaAIServer → префикс sherpaaiserver_

  • Для папки myproject → префикс myproject_

Основные volumes:

  • *orchestrator-mysql-data - данные MySQL базы

  • *pgdata - данные PostgreSQL базы

  • *storage - файловое хранилище

Пример вывода:

Создание бэкапов volume:

Замените имена volumes на актуальные из вашего списка:

chevron-right💡 Комментарии к созданию бэкаповhashtag

docker run --rm - запускает контейнер и автоматически удаляет его после выполнения

  • --rm предотвращает накопление остановленных контейнеров

Монтирование volumes:

  • -v VOLUME_NAME:/data - монтирует Docker volume в контейнер

  • -v $(pwd)/backup_mysql:/backup - монтирует локальную папку для сохранения архива

tar czf - создает сжатый архив

  • c - создать архив

  • z - сжать с помощью gzip

  • f - указать имя файла

  • -C /data . - изменяет директорию на /data перед архивацией

pgembeding - использует существующий образ PostgreSQL с инструментами

Примеры с конкретными именами:

Для проекта в папке SherpaAIServer:

chevron-right💡 Пример для Sherpa AI Serverhashtag

Первый volume: sherpaaiserver_orchestrator-mysql-data

  • Содержит данные MySQL базы orchestrator

  • Архив сохраняется в backup_mysql/mysql_backup.tar.gz

Второй volume: sherpaaiserver_pgdata

  • Содержит данные PostgreSQL базы (если есть)

  • Архив сохраняется в backup_pg/pg_backup.tar.gz

Для проекта в папке myproject:

chevron-right💡 Пример для myprojecthashtag

Первый volume: myproject_orchestrator-mysql-data

  • Аналогично, но с префиксом myproject_

  • Используйте реальное имя папки вашего проекта

Второй volume: myproject_pgdata

  • PostgreSQL данные с соответствующим префиксом

chevron-right💡 Что делают эти командыhashtag
  • Создают сжатые архивы всех данных из Docker volume

  • Архивы сохраняются в локальные директории backup_mysql и backup_pg

Проверка созданных бэкапов:

chevron-right💡 Комментарии к проверке бэкаповhashtag

ls -lh - показывает подробную информацию о файлах

  • -l - длинный формат

  • -h - размеры в человеко-читаемом виде

  • Проверьте, что архивы имеют разумный размер

tar -tzf - показывает содержимое архива без распаковки

  • -t - список содержимого

  • -z - распаковать с помощью gzip

  • -f - указать имя файла

  • | head -20 - показывает первые 20 файлов

Рекомендация: Убедитесь, что архивы не пустые и содержат ожидаемые файлы базы данных

Основная логика миграции

Разархивирование и подготовка инструментов

  1. Разархивировать client files:

chevron-right💡 Комментарии к разархивированиюhashtag

tar -xvzf - распаковывает архив

  • -x - извлечь

  • -v - подробный вывод

  • -z - распаковать с помощью gzip

  • -f - указать имя файла

Подкоманда выбора файла:

  • ls client_files_*.tgz - находит все архивы client-files

  • sort -V - сортирует по версии (1.0, 1.1, 2.0 и т.д.)

  • tail -n 1 - берет последний (самый свежий) файл

Результат: Создается папка pgloader с инструментами миграции

  1. Перейти в директорию pgloader:

chevron-right💡 Комментарии к переходу в директориюhashtag

cd pgloader - переходит в папку с инструментами миграции

  • Все последующие команды выполняются из этой директории

  • Содержит скрипты и конфигурации для pgloader

  1. Загрузка Docker-образа pgloader:

chevron-right💡 Комментарии к загрузке образаhashtag

./load_pgloader.sh - скрипт загрузки Docker-образа

  • Импортирует pgloader_image.tar в локальный Docker daemon

  • После выполнения образ становится доступен как pgloader:latest

  • Может занять несколько минут в зависимости от размера образа

  1. Сборка контейнера для миграции:

chevron-right💡 Комментарии к сборке контейнераhashtag

./run.sh build - собирает Docker-контейнер для миграции

  • Создает контейнер на основе загруженного образа pgloader

  • Настраивает все необходимые зависимости и инструменты

  • После сборки контейнер готов к выполнению миграции

Настройка конфигурации миграции

Создание файла .env с параметрами подключения:

Все пароли можно найти в файле oais/backend/config/config.ini.

chevron-right💡 Комментарии к переменным окруженияhashtag

MIGRATE_MYSQL - URI подключения к исходной MySQL базе

  • Формат: mysql://username:password@host:port/database

  • Используется pgloader для чтения данных

MIGRATE_PG - URI подключения к целевой PostgreSQL базе

  • Формат: postgres://username:password@host:port/database

  • Должна быть доступна для записи данных

DUMP_ / RESTORE_ ** - опциональные параметры для создания/восстановления дампов

  • Полезны для отладки или поэтапной миграции

Пример рабочей конфигурации:

chevron-right💡 Пример конфигурацииhashtag

MySQL параметры:

  • Хост: 91.206.149.183 (внешний сервер)

  • Порт: 3306 (стандартный для MySQL)

  • База: orchestrator

  • Пользователь: root (с полными правами)

PostgreSQL параметры:

  • Хост: тот же сервер

  • Порт: 5432 (стандартный для PostgreSQL)

  • База: postgres (системная база)

  • Пользователь: postgres (администратор)

Важно: Пароли должны быть взяты из существующего config.ini

Важно: Убедитесь, что порты и хосты доступны из контейнера Docker.

Выполнение миграции

Тестовый запуск (рекомендуется)

chevron-right💡 Комментарии к тестовому запускуhashtag

./run.sh dry-run - симуляция миграции без изменений

  • Подключается к обеим базам данных

  • Анализирует структуру и данные

  • Показывает план миграции и потенциальные проблемы

  • Не вносит никаких изменений в PostgreSQL

Проверяет:

  • Доступность и корректность подключений

  • Совместимость типов данных MySQL → PostgreSQL

  • Наличие всех таблиц и связей

  • Ожидаемый объем данных для переноса

Рекомендация: Всегда выполняйте dry-run перед реальной миграцией

Основная миграция

chevron-right💡 Комментарии к основной миграцииhashtag

./run.sh migrate - выполняет фактическую миграцию данных

  • Создает схему orchestrator в PostgreSQL

  • Переносит структуру таблиц с преобразованием типов

  • Копирует все данные из MySQL в PostgreSQL

  • Создает индексы и ограничения целостности

Этапы выполнения:

  1. Проверка подключений и прав доступа

  2. Создание схемы базы данных

  3. Миграция структуры (таблицы, типы данных)

  4. Перенос данных с оптимизацией производительности

  5. Создание индексов и ограничений

Важно: Процесс может быть долгим для больших баз данных

Опции миграции:

  • --force - выполнить миграцию даже если схема уже существует

  • --build - пересобрать контейнер перед запуском

  • --rmi - удалить образ после завершения

circle-info

Время выполнения: Зависит от размера базы данных. Для баз до 10 ГБ - от 30 минут до нескольких часов. Для больших баз - может занять несколько часов или дней.

Очистка после миграции

chevron-right💡 Комментарии к очисткеhashtag

./run.sh rmi - удаляет Docker-образ pgloader

  • Освобождает дисковое пространство

  • Удаляет временные образы и контейнеры

  • Опционально - можно оставить для повторного использования

cd .. - возвращает в родительскую директорию

  • Выходит из папки pgloader

  • Возвращает в корень проекта SherpaAIServer

Рекомендация: Выполняйте очистку только после успешного завершения и тестирования миграции

Копирование данных в новые volumes

После успешной миграции базы данных может потребоваться перенос файлового хранилища между Docker volumes.

Загрузка Alpine образа

chevron-right💡 Комментарии к загрузке Alpinehashtag

docker load -i - импортирует Docker-образ из tar-архива

  • -i - читать из локально сохраненного tar-архива

  • Загружает образ в локальный Docker daemon

Alpine Linux - минималистичный дистрибутив Linux

  • Размер образа ~5-10 МБ (в сравнении с Ubuntu ~100+ МБ)

  • Содержит только необходимые инструменты (cp, ls, tar и т.д.)

  • Идеален для операций с файлами в контейнерах

Использование: Для копирования данных между Docker volumes

Создание нового volume

chevron-right💡 Комментарии к созданию volumehashtag

docker volume create - создает новый именованный Docker volume

  • aiserver-storage - имя для нового volume

  • Volume создается пустым и готовым для использования

Характеристики volume:

  • Управляется Docker автоматически

  • Доступен всем контейнерам на хосте

  • Сохраняется при перезапуске Docker daemon

  • Поддерживает snapshot и backup операции

Назначение: Хранилище файлов Sherpa AIServer (загрузки, кэш, логи и т.д.)

Определение текущих volumes

Найти имена используемых volumes:

chevron-right💡 Повторное определение volumeshashtag

docker volume list - повторная проверка списка volumes

  • Убеждаемся, что все volumes доступны

  • Проверяем корректность имен перед копированием данных

Важно: Сравните с результатами первой проверки

  • Убедитесь, что volumes не были случайно удалены

  • Проверьте доступность всех необходимых данных

Пример вывода (имена зависят от названия папки проекта):

Или, если папка проекта называется иначе (например, myproject):

Перенос данных между volumes

Определить источник данных:

В команде ниже замените STORAGE_DATA на имя вашего текущего volume для хранения данных (например, sherpaaiserver_storage):

chevron-right💡 Комментарии к переносу данныхhashtag

docker run --rm - запускает временный контейнер Alpine

  • --rm - контейнер удалится после выполнения

Монтирование volumes:

  • -v STORAGE_DATA:/from - исходный volume монтируется в /from

  • -v aiserver-storage:/to - целевой volume монтируется в /to

ash -c - выполняет команду в shell Alpine

  • ash - Almquist shell (легковесный)

  • -c - выполнить команду

cp -av /from/. /to/ - копирует все файлы

  • -a - режим архивации (сохраняет права, владельцев, временные метки)

  • -v - подробный вывод

  • /from/. - копирует содержимое, а не саму папку /from

  • /to/ - в целевую директорию

Пример замены: STORAGE_DATAsherpaaiserver_storage

Проверка успешности копирования:

chevron-right💡 Комментарии к проверке копированияhashtag

docker run --rm -v aiserver-storage:/data alpine ls -la /data

  • Проверяет содержимое нового volume

  • ls -la показывает все файлы с правами доступа и размерами

  • Убеждаемся, что файлы скопировались корректно

docker run --rm -v STORAGE_DATA:/data alpine du -sh /data

  • Проверяет размер исходного volume

  • du -sh - использование диска, сводка, человеко-читаемый формат

  • Сравниваем размеры для проверки полноты копирования

Ожидания:

  • Количество файлов должно совпадать

  • Размеры должны быть примерно равны

  • Структура директорий должна быть идентичной

Если размеры отличаются: Проверьте логи копирования на ошибки

Миграция с PostgreSQL 16 на 17 версию

Подготовка к обновлению версии PostgreSQL

Предварительные действия:

  1. Оставить старую базу данных запущенной - контейнер pgembeding должен продолжать работать

  2. Распаковать новые client-files - в архиве должны быть обновленные docker-compose.yml и .env

  3. Перенести конфигурацию - скопировать параметры подключения из старой версии /opt/SherpaAIServer/oais/backend/config/config.ini в новый .env

  4. Изменить порт - временно установить порт 5433 для новой PostgreSQL, чтобы избежать конфликта

Распаковка архива с клиентскими файлами

chevron-right💡 Что делает эта командаhashtag
  • ls client_files_*.tgz - находит все файлы архивов

  • sort -V - сортирует версии естественно (1.0 < 1.1 < 1.10)

  • tail -n 1 - выбирает самый свежий файл

  • tar -xvzf - распаковывает архив с выводом содержимого

Ожидаемый результат: Будет создана директория sh_scripts/ с исполняемыми скриптами и другие необходимые файлы.

Подготовка скриптов к выполнению

chevron-right💡 Что делают эти командыhashtag
  • chmod +x *.sh - устанавливает права исполнения для всех shell-скриптов

  • Это необходимо для запуска скриптов в следующих этапах установки

Структура распакованного архива:

После распаковки вы должны увидеть следующие файлы и директории:

  • sh_scripts/ - директория с установочными скриптами

    • download_all_latest_docker_images.sh - скрипт для скачивания Docker-образов

    • load_all_docker_images.sh - скрипт для загрузки образов в Docker

    • extract_models.sh - скрипт для распаковки моделей ИИ

    • extract_llama.sh - скрипт для распаковки LLM-моделей

  • docker-compose.yml - конфигурация Docker Compose для клиентской установки

  • .env - файл с переменными окружения для настройки системы

Загрузка Docker-образов

chevron-right💡 Что делает скриптhashtag
  1. Загружает все Docker-образы из скачанных .tar.gz файлов

  2. Импортирует образы в локальный Docker registry

  3. Проверяет успешность загрузки

Распаковка моделей ИИ

chevron-right💡 Что делает скриптhashtag
  1. Распаковывает модель Whisper для распознавания речи

  2. Распаковывает модель BGE Reranker для улучшения поиска

  3. Распаковывает модели для генерации эмбеддингов

  4. Создает необходимые директории

  5. Проверяет успешность распаковки

chevron-right💡 Что делает скриптhashtag
  1. Распаковывает модель Llama 3 для языкового моделирования

  2. Удаляет префикс model-store/ из путей файлов

  3. Помещает файлы непосредственно в директорию моделей

  4. Проверяет содержимое после распаковки

Структура директорий после распаковки(примерная):

Запуск новой версии PostgreSQL

chevron-right💡 Комментарии к запуску новой версииhashtag

docker compose up -d - запускает сервисы в фоне

  • -d - отсоединенный режим (работа в фоне)

  • Запускает все сервисы из docker-compose.yml

  • Включает PostgreSQL 17 в контейнере aiserver-pg

Важно:

  • Старая база данных должна продолжать работать

  • Новая версия запускается на другом порту (5433)

  • Процесс инициализации может занять несколько минут

Мониторинг запуска:

chevron-right💡 Комментарии к мониторингуhashtag

docker logs aiserver - показывает логи контейнера

  • Следит за процессом инициализации PostgreSQL

  • Ищет сообщения об успешном запуске и применении миграций

  • Прерывать можно Ctrl+C

docker ps | grep aiserver - проверяет статус

  • docker ps - показывает запущенные контейнеры

  • grep aiserver - фильтрует по имени

  • Должен показать контейнер aiserver-pg в состоянии Up

Остановка сервисов для переноса данных

Остановить все сервисы кроме новой базы данных:

chevron-right💡 Комментарии к остановке сервисовhashtag

docker compose stop - останавливает указанные сервисы

  • Выполняются обе версии синтаксиса для совместимости

  • Останавливаются все сервисы Sherpa AIServer кроме базы данных

Останавливаемые сервисы:

  • aiserver-db - старая база данных

  • aiserver - основной веб-сервер

  • aiserver-code_interpreter - интерпретатор кода

  • aiserver-llm-server - языковая модель

  • aiserver-embed - сервис эмбеддингов

  • aiserver-whisper - сервис распознавания речи

  • aiserver-bge_reranker - сервис ранжирования

Результат: Только aiserver-pg (новая PostgreSQL) продолжает работать

Перенос данных между версиями

Выполнить последовательность команд для переноса данных:

chevron-right💡 Комментарии к переносу между версиями PostgreSQLhashtag

Шаг 1: Создание дампа из старой базы

  • docker exec -t postgres - выполняет команду в контейнере postgres (версия 16)

  • pg_dump -U postgres -d postgres -Fc - создает специальный формат дампа

  • -Fc - сжатый специальный формат (лучше для больших БД)

  • Сохраняется в /tmp/postgres.dump внутри контейнера

Шаг 2: Копирование дампа на хост

  • docker cp postgres:/tmp/postgres.dump ./postgres.dump

  • Переносит дамп из контейнера на локальный диск

  • Необходим для передачи между контейнерами

Шаг 3: Удаление старой базы в новом контейнере

  • Подключается к системной базе template1

  • Удаляет существующую базу postgres (если есть)

Шаг 4: Создание новой базы

  • Создает чистую базу данных postgres в контейнере aiserver-pg

Шаг 5: Создание расширений

  • embedding - расширение для векторных эмбеддингов

  • uuid-ossp - генерация UUID (нужно для некоторых таблиц)

Шаг 6: Копирование дампа в новый контейнер

  • Обратная операция копирования

  • Помещает дамп в контейнер aiserver-pg

Шаг 7: Восстановление данных

  • pg_restore - восстанавливает из специального формата дампа

  • -t - выделяет TTY для прогресса

  • Автоматически создает таблицы, индексы и данные

Валидация результатов миграции

Проверка корректности переноса данных

Базовые проверки:

chevron-right💡 Комментарии к базовым проверкамhashtag

docker exec -it aiserver-pg psql -U postgres -d postgres

  • Подключается к PostgreSQL в интерактивном режиме

  • -it - интерактивный терминал

  • -U postgres - пользователь postgres

  • -d postgres - база данных postgres

\dt orchestrator.* - показывает все таблицы в схеме orchestrator

  • \dt - список таблиц

  • orchestrator.* - фильтр по схеме

SELECT ... FROM pg_stat_user_tables - статистика по таблицам

  • n_tup_ins - количество вставленных строк (примерное количество записей)

  • Сортировка по убыванию показывает самые большие таблицы

\dx - показывает установленные расширения

  • Должны быть видны embedding и uuid-ossp

\q - выход из psql

Тестирование функциональности

  1. Запустить основные сервисы Sherpa AI Server

  2. Выполнить тестовые запросы к API

  3. Проверить работу веб-интерфейса

  4. Выполнить базовые операции с данными

Диагностика и устранение проблем

Распространенные ошибки и решения

Если возникли ошибки миграции обратитесь за помощью в техподдержку, а пока вы можете вернутся в старую директорию /opt/SherpaAIServer и запустить на прошлых настройках Sherpa AI Server

"Heap exhausted" или нехватка памяти

Ошибка подключения к базе данных

Нарушение целостности данных

Прерывание миграции

chevron-right💡 Комментарии к мониторингу миграцииhashtag

tail -f migrate.log - следит за логами в реальном времени

  • -f - следить (обновляется при добавлении новых строк)

  • Показывает прогресс миграции pgloader

  • Ищет ошибки или предупреждения

docker stats - мониторит использование ресурсов контейнерами

  • Показывает CPU, память, сеть, диск для всех контейнеров

  • Полезно для отслеживания нагрузки на систему

  • Прерывать Ctrl+C

watch -n 30 - повторяет команду каждые 30 секунд

  • Подсчитывает общее количество записей во всех таблицах orchestrator

  • watch - утилита для периодического выполнения команд

  • -n 30 - интервал 30 секунд

Использование: Держать эти команды в отдельных терминалах во время миграции

Завершение миграции

После успешного выполнения всех шагов:

  1. Запустить все сервисы Sherpa AI Server

  2. Выполнить финальное тестирование системы

  3. Удалить временные файлы и старые контейнеры (при необходимости)

Рекомендация: Сохраните логи миграции и конфигурационные файлы для будущих ссылок.

Last updated