Инструкция по миграции MySQL → PostgreSQL
Введение
ВАЖНО! ЕСЛИ у вас версия AI Server равна или меньше 2.0.0 то в вашей версии используется MySQL и PostgreSQL 16 версии одновременно. В новой версии 2.1.0+ используется только PostgreSQL 17 версии.
Вам необходимо сделать миграцию с mysql на PostgreSQL, а так же выполнить миграцию данных с 16 версии PostgreSQL на 17 версию.
Эта инструкция описывает процесс миграции базы данных Sherpa AI Server с MySQL на PostgreSQL. Миграция включает перенос данных, обновление конфигураций и переход на новую систему управления базами данных.
ВНИМАНИЕ! Если у вас есть возможность ОТКАЗАТЬСЯ ОТ ДАННЫХ (ЕСЛИ ОНИ ВАМ НЕ НУЖНЫ) рекомендуем вместо выполнения данной инструкции перейти к инструкции по установке c нуля:
Системные требования
Минимальные требования для миграции:
Свободное место на диске: минимум 2x размер базы данных (для исходных данных + миграция)
Оперативная память: минимум 4 ГБ RAM для pgloader
Docker: версия 20.10+ с поддержкой Docker Compose
Сетевое подключение: стабильное соединение с базами данных
Предварительные проверки
Перед запуском миграции выполните следующие проверки:
💡 Комментарии к проверкам
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 для доступа к данным
Подготовка к миграции
Скачивание необходимых файлов
Если контур закрыт, необходимо скачать заранее АРХИВЫ ДЛЯ УСТАНОВКИ и в дополнение следующие файлы:
💡 Комментарии к скачиванию файлов
curl -fSL -OJ - скачивает файлы с сервера
-f- тихо завершается при ошибках сервера-S- показывает ошибки даже при использовании -f-L- следует редиректам-O- сохраняет файл с именем с сервера-J- использует имя файла, предоставленное сервером
pgloader_image.tar - Docker-образ с инструментом pgloader для переноса данных alpine_image.tar - легковесный Linux-образ для операций с файлами
Создайте директорию /opt/SherpaAIServerNew и поместите в нее все скачанные архивы И ФАЙЛЫ ИЗ ИНСТРУКЦИИ ПО УСТАНОВКЕ:
💡 Комментарии к подготовке директории
sudo mkdir -p - создает директорию с родительскими папками
-pпредотвращает ошибку если директория уже существует
sudo mv - перемещает файлы в новую директорию
Перемещение в
/opt/SherpaAIServerNewизолирует файлы миграции от текущей установки
Что скачивается:
pgloader_image.tar- Docker-образ с pgloader и необходимыми инструментамиalpine_image.tar- легковесный образ Alpine Linux для работы с volume (не влияет на вашу текущую операционую систему)
Остановка сервисов
Остановка контейнеров кроме баз данных:
💡 Комментарии к остановке сервисов
docker compose stop - останавливает указанные сервисы без удаления
orchestrator- основной сервис оркестрацииembed- сервис для работы с эмбеддингамиnginx- веб-сервер и проксиvllm- сервис языковой модели
Две команды - выполнены обе версии синтаксиса для совместимости Оставшиеся сервисы - pgembeding (PostgreSQL с эмбеддингами) и orchestrator-db (MySQL) должны продолжать работать для доступа к данным
Почему останавливаем сервисы: Во время миграции необходимо исключить любые изменения в базе данных, чтобы обеспечить консистентность данных.
Примечание: Не нужно удалять контейнеры, только остановить. Должны остаться pgembeding и orchestrator-db.
Создание резервных копий
Определение имен volumes:
Сначала найдите правильные имена volumes в вашей системе:
💡 Комментарии к определению volumes
docker volume list - показывает все Docker volumes в системе
DRIVER- тип драйвера (обычно local)VOLUME NAME- уникальное имя volume
Префикс имен - зависит от названия папки проекта:
Для папки
SherpaAIServer→ префиксsherpaaiserver_Для папки
myproject→ префиксmyproject_
Основные volumes:
*orchestrator-mysql-data- данные MySQL базы*pgdata- данные PostgreSQL базы*storage- файловое хранилище
Пример вывода:
Создание бэкапов volume:
Замените имена volumes на актуальные из вашего списка:
💡 Комментарии к созданию бэкапов
docker run --rm - запускает контейнер и автоматически удаляет его после выполнения
--rmпредотвращает накопление остановленных контейнеров
Монтирование volumes:
-v VOLUME_NAME:/data- монтирует Docker volume в контейнер-v $(pwd)/backup_mysql:/backup- монтирует локальную папку для сохранения архива
tar czf - создает сжатый архив
c- создать архивz- сжать с помощью gzipf- указать имя файла-C /data .- изменяет директорию на /data перед архивацией
pgembeding - использует существующий образ PostgreSQL с инструментами
Примеры с конкретными именами:
Для проекта в папке SherpaAIServer:
💡 Пример для Sherpa AI Server
Первый volume: sherpaaiserver_orchestrator-mysql-data
Содержит данные MySQL базы orchestrator
Архив сохраняется в
backup_mysql/mysql_backup.tar.gz
Второй volume: sherpaaiserver_pgdata
Содержит данные PostgreSQL базы (если есть)
Архив сохраняется в
backup_pg/pg_backup.tar.gz
Для проекта в папке myproject:
💡 Пример для myproject
Первый volume: myproject_orchestrator-mysql-data
Аналогично, но с префиксом
myproject_Используйте реальное имя папки вашего проекта
Второй volume: myproject_pgdata
PostgreSQL данные с соответствующим префиксом
💡 Что делают эти команды
Создают сжатые архивы всех данных из Docker volume
Архивы сохраняются в локальные директории
backup_mysqlиbackup_pg
Проверка созданных бэкапов:
💡 Комментарии к проверке бэкапов
ls -lh - показывает подробную информацию о файлах
-l- длинный формат-h- размеры в человеко-читаемом видеПроверьте, что архивы имеют разумный размер
tar -tzf - показывает содержимое архива без распаковки
-t- список содержимого-z- распаковать с помощью gzip-f- указать имя файла| head -20- показывает первые 20 файлов
Рекомендация: Убедитесь, что архивы не пустые и содержат ожидаемые файлы базы данных
Основная логика миграции
Разархивирование и подготовка инструментов
Разархивировать client files:
💡 Комментарии к разархивированию
tar -xvzf - распаковывает архив
-x- извлечь-v- подробный вывод-z- распаковать с помощью gzip-f- указать имя файла
Подкоманда выбора файла:
ls client_files_*.tgz- находит все архивы client-filessort -V- сортирует по версии (1.0, 1.1, 2.0 и т.д.)tail -n 1- берет последний (самый свежий) файл
Результат: Создается папка pgloader с инструментами миграции
Перейти в директорию pgloader:
💡 Комментарии к переходу в директорию
cd pgloader - переходит в папку с инструментами миграции
Все последующие команды выполняются из этой директории
Содержит скрипты и конфигурации для pgloader
Загрузка Docker-образа pgloader:
💡 Комментарии к загрузке образа
./load_pgloader.sh - скрипт загрузки Docker-образа
Импортирует
pgloader_image.tarв локальный Docker daemonПосле выполнения образ становится доступен как
pgloader:latestМожет занять несколько минут в зависимости от размера образа
Сборка контейнера для миграции:
💡 Комментарии к сборке контейнера
./run.sh build - собирает Docker-контейнер для миграции
Создает контейнер на основе загруженного образа pgloader
Настраивает все необходимые зависимости и инструменты
После сборки контейнер готов к выполнению миграции
Настройка конфигурации миграции
Создание файла .env с параметрами подключения:
Все пароли можно найти в файле oais/backend/config/config.ini.
💡 Комментарии к переменным окружения
MIGRATE_MYSQL - URI подключения к исходной MySQL базе
Формат:
mysql://username:password@host:port/databaseИспользуется pgloader для чтения данных
MIGRATE_PG - URI подключения к целевой PostgreSQL базе
Формат:
postgres://username:password@host:port/databaseДолжна быть доступна для записи данных
DUMP_ / RESTORE_ ** - опциональные параметры для создания/восстановления дампов
Полезны для отладки или поэтапной миграции
Пример рабочей конфигурации:
💡 Пример конфигурации
MySQL параметры:
Хост:
91.206.149.183(внешний сервер)Порт:
3306(стандартный для MySQL)База:
orchestratorПользователь:
root(с полными правами)
PostgreSQL параметры:
Хост: тот же сервер
Порт:
5432(стандартный для PostgreSQL)База:
postgres(системная база)Пользователь:
postgres(администратор)
Важно: Пароли должны быть взяты из существующего config.ini
Важно: Убедитесь, что порты и хосты доступны из контейнера Docker.
Выполнение миграции
Тестовый запуск (рекомендуется)
💡 Комментарии к тестовому запуску
./run.sh dry-run - симуляция миграции без изменений
Подключается к обеим базам данных
Анализирует структуру и данные
Показывает план миграции и потенциальные проблемы
Не вносит никаких изменений в PostgreSQL
Проверяет:
Доступность и корректность подключений
Совместимость типов данных MySQL → PostgreSQL
Наличие всех таблиц и связей
Ожидаемый объем данных для переноса
Рекомендация: Всегда выполняйте dry-run перед реальной миграцией
Основная миграция
💡 Комментарии к основной миграции
./run.sh migrate - выполняет фактическую миграцию данных
Создает схему
orchestratorв PostgreSQLПереносит структуру таблиц с преобразованием типов
Копирует все данные из MySQL в PostgreSQL
Создает индексы и ограничения целостности
Этапы выполнения:
Проверка подключений и прав доступа
Создание схемы базы данных
Миграция структуры (таблицы, типы данных)
Перенос данных с оптимизацией производительности
Создание индексов и ограничений
Важно: Процесс может быть долгим для больших баз данных
Опции миграции:
--force- выполнить миграцию даже если схема уже существует--build- пересобрать контейнер перед запуском--rmi- удалить образ после завершения
Время выполнения: Зависит от размера базы данных. Для баз до 10 ГБ - от 30 минут до нескольких часов. Для больших баз - может занять несколько часов или дней.
Очистка после миграции
💡 Комментарии к очистке
./run.sh rmi - удаляет Docker-образ pgloader
Освобождает дисковое пространство
Удаляет временные образы и контейнеры
Опционально - можно оставить для повторного использования
cd .. - возвращает в родительскую директорию
Выходит из папки pgloader
Возвращает в корень проекта SherpaAIServer
Рекомендация: Выполняйте очистку только после успешного завершения и тестирования миграции
Копирование данных в новые volumes
После успешной миграции базы данных может потребоваться перенос файлового хранилища между Docker volumes.
Загрузка Alpine образа
💡 Комментарии к загрузке Alpine
docker load -i - импортирует Docker-образ из tar-архива
-i- читать из локально сохраненного tar-архиваЗагружает образ в локальный Docker daemon
Alpine Linux - минималистичный дистрибутив Linux
Размер образа ~5-10 МБ (в сравнении с Ubuntu ~100+ МБ)
Содержит только необходимые инструменты (cp, ls, tar и т.д.)
Идеален для операций с файлами в контейнерах
Использование: Для копирования данных между Docker volumes
Создание нового volume
💡 Комментарии к созданию volume
docker volume create - создает новый именованный Docker volume
aiserver-storage- имя для нового volumeVolume создается пустым и готовым для использования
Характеристики volume:
Управляется Docker автоматически
Доступен всем контейнерам на хосте
Сохраняется при перезапуске Docker daemon
Поддерживает snapshot и backup операции
Назначение: Хранилище файлов Sherpa AIServer (загрузки, кэш, логи и т.д.)
Определение текущих volumes
Найти имена используемых volumes:
💡 Повторное определение volumes
docker volume list - повторная проверка списка volumes
Убеждаемся, что все volumes доступны
Проверяем корректность имен перед копированием данных
Важно: Сравните с результатами первой проверки
Убедитесь, что volumes не были случайно удалены
Проверьте доступность всех необходимых данных
Пример вывода (имена зависят от названия папки проекта):
Или, если папка проекта называется иначе (например, myproject):
Перенос данных между volumes
Определить источник данных:
В команде ниже замените STORAGE_DATA на имя вашего текущего volume для хранения данных (например, sherpaaiserver_storage):
💡 Комментарии к переносу данных
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_DATA → sherpaaiserver_storage
Проверка успешности копирования:
💡 Комментарии к проверке копирования
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
Предварительные действия:
Оставить старую базу данных запущенной - контейнер
pgembedingдолжен продолжать работатьРаспаковать новые client-files - в архиве должны быть обновленные
docker-compose.ymlи.envПеренести конфигурацию - скопировать параметры подключения из старой версии
/opt/SherpaAIServer/oais/backend/config/config.iniв новый.envИзменить порт - временно установить порт 5433 для новой PostgreSQL, чтобы избежать конфликта
Распаковка архива с клиентскими файлами
💡 Что делает эта команда
ls client_files_*.tgz- находит все файлы архивовsort -V- сортирует версии естественно (1.0 < 1.1 < 1.10)tail -n 1- выбирает самый свежий файлtar -xvzf- распаковывает архив с выводом содержимого
Ожидаемый результат: Будет создана директория sh_scripts/ с исполняемыми скриптами и другие необходимые файлы.
Подготовка скриптов к выполнению
💡 Что делают эти команды
chmod +x *.sh- устанавливает права исполнения для всех shell-скриптовЭто необходимо для запуска скриптов в следующих этапах установки
Структура распакованного архива:
После распаковки вы должны увидеть следующие файлы и директории:
sh_scripts/- директория с установочными скриптамиdownload_all_latest_docker_images.sh- скрипт для скачивания Docker-образовload_all_docker_images.sh- скрипт для загрузки образов в Dockerextract_models.sh- скрипт для распаковки моделей ИИextract_llama.sh- скрипт для распаковки LLM-моделей
docker-compose.yml- конфигурация Docker Compose для клиентской установки.env- файл с переменными окружения для настройки системы
Загрузка Docker-образов
💡 Что делает скрипт
Загружает все Docker-образы из скачанных .tar.gz файлов
Импортирует образы в локальный Docker registry
Проверяет успешность загрузки
Распаковка моделей ИИ
💡 Что делает скрипт
Распаковывает модель Whisper для распознавания речи
Распаковывает модель BGE Reranker для улучшения поиска
Распаковывает модели для генерации эмбеддингов
Создает необходимые директории
Проверяет успешность распаковки
💡 Что делает скрипт
Распаковывает модель Llama 3 для языкового моделирования
Удаляет префикс
model-store/из путей файловПомещает файлы непосредственно в директорию моделей
Проверяет содержимое после распаковки
Структура директорий после распаковки(примерная):
Запуск новой версии PostgreSQL
💡 Комментарии к запуску новой версии
docker compose up -d - запускает сервисы в фоне
-d- отсоединенный режим (работа в фоне)Запускает все сервисы из docker-compose.yml
Включает PostgreSQL 17 в контейнере aiserver-pg
Важно:
Старая база данных должна продолжать работать
Новая версия запускается на другом порту (5433)
Процесс инициализации может занять несколько минут
Мониторинг запуска:
💡 Комментарии к мониторингу
docker logs aiserver - показывает логи контейнера
Следит за процессом инициализации PostgreSQL
Ищет сообщения об успешном запуске и применении миграций
Прерывать можно Ctrl+C
docker ps | grep aiserver - проверяет статус
docker ps- показывает запущенные контейнерыgrep aiserver- фильтрует по имениДолжен показать контейнер aiserver-pg в состоянии Up
Остановка сервисов для переноса данных
Остановить все сервисы кроме новой базы данных:
💡 Комментарии к остановке сервисов
docker compose stop - останавливает указанные сервисы
Выполняются обе версии синтаксиса для совместимости
Останавливаются все сервисы Sherpa AIServer кроме базы данных
Останавливаемые сервисы:
aiserver-db- старая база данныхaiserver- основной веб-серверaiserver-code_interpreter- интерпретатор кодаaiserver-llm-server- языковая модельaiserver-embed- сервис эмбеддинговaiserver-whisper- сервис распознавания речиaiserver-bge_reranker- сервис ранжирования
Результат: Только aiserver-pg (новая PostgreSQL) продолжает работать
Перенос данных между версиями
Выполнить последовательность команд для переноса данных:
💡 Комментарии к переносу между версиями PostgreSQL
Шаг 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 для прогрессаАвтоматически создает таблицы, индексы и данные
Валидация результатов миграции
Проверка корректности переноса данных
Базовые проверки:
💡 Комментарии к базовым проверкам
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
Тестирование функциональности
Запустить основные сервисы Sherpa AI Server
Выполнить тестовые запросы к API
Проверить работу веб-интерфейса
Выполнить базовые операции с данными
Диагностика и устранение проблем
Распространенные ошибки и решения
Если возникли ошибки миграции обратитесь за помощью в техподдержку, а пока вы можете вернутся в старую директорию /opt/SherpaAIServer и запустить на прошлых настройках Sherpa AI Server
"Heap exhausted" или нехватка памяти
Ошибка подключения к базе данных
Нарушение целостности данных
Прерывание миграции
💡 Комментарии к мониторингу миграции
tail -f migrate.log - следит за логами в реальном времени
-f- следить (обновляется при добавлении новых строк)Показывает прогресс миграции pgloader
Ищет ошибки или предупреждения
docker stats - мониторит использование ресурсов контейнерами
Показывает CPU, память, сеть, диск для всех контейнеров
Полезно для отслеживания нагрузки на систему
Прерывать Ctrl+C
watch -n 30 - повторяет команду каждые 30 секунд
Подсчитывает общее количество записей во всех таблицах orchestrator
watch- утилита для периодического выполнения команд-n 30- интервал 30 секунд
Использование: Держать эти команды в отдельных терминалах во время миграции
Завершение миграции
После успешного выполнения всех шагов:
Запустить все сервисы Sherpa AI Server
Выполнить финальное тестирование системы
Удалить временные файлы и старые контейнеры (при необходимости)
Рекомендация: Сохраните логи миграции и конфигурационные файлы для будущих ссылок.
Last updated