Миграция данных при обновлении мажорной версии сервиса OLTP PostgreSQL (lxc)¶
Версионирование¶
| Версия APP | Версия PostgreSQL |
|---|---|
< 9.200.164.274 |
13 |
=> 9.200.164.274 |
15 |
< 9.300.dev.622 |
13 |
=> 9.300.dev.622 |
15 |
Возникающая ошибка¶
Check upgrade postgresql
The database must be manually upgraded (13 -> 15): https://distr-docs.optimacros.com/ru/solution/migrate_postgres_data
Если удаление данных в БД PostgreSQL OLTP не приведет к критической ситуации (если oltp postgres не используется и не указана в manifest.json),
то можно удалить или переименовать директорию
/om/workspace1/data/oltp/postgresql на хосте и перезапустить воркспейс.
В остальных случаях действуем по инструкции:
Создание резервной копии в виде SQL дампа¶
# Принудительно завершаем текущую работу воркспейса
sudo /om/workspace-installer/current/install workspace --path /om/workspace1/manifest.json shutdown --force
# Запускаем воркспейс со "старой" версией PostgreSQL
sudo /om/workspace-installer/prev/install workspace --path /om/workspace1/manifest.json up
# Входим в контейнер LXC
sudo lxc-attach -n $(sudo lxc-ls)
Создаем bash скрипт в LXC контейнере /root/create_postgres_sql_dump.sh
#!/bin/bash
# Описание переменных
# POSTGRES_USER: логин пользователя для подключения к БД PostgreSQL
# POSTGRES_PASSWORD: пароль пользователя для подключения к БД PostgreSQL
# POSTGRES_DATABASES: список БД для создания резервной копии. Элементы списка разделены между собой через знак пробела. Пример - "db1 db2"
# POSTGRES_SERVICE_NAME: название сервиса в systemd
# POSTGRES_DATA_DIR: расположение файлов БД PostgreSQL
# POSTGRES_SQL_DUMP_DIR: размещение созданных резервных копий в виде дамп файлов
set -e
POSTGRES_USER=${POSTGRES_USER:-admin}
POSTGRES_PASSWORD=${POSTGRES_PASSWORD:-"xxx"}
POSTGRES_DATABASES=${POSTGRES_DATABASES:-"db1"}
POSTGRES_SERVICE_NAME=${POSTGRES_SERVICE_NAME:-postgresql}
POSTGRES_DATA_DIR=${POSTGRES_DATA_DIR:-"/opt/oltp/postgresql"}
POSTGRES_SQL_DUMP_DIR=${POSTGRES_SQL_DUMP_DIR:-"/opt/oltp/postgresql/backup"}
printf '%s\n' "Shutdown ing workspace..."
/home/optimacros_middlework/optimacros_middlework/bin/container/shutdown.sh optimacros_middlework
printf '%s\n' "Creating SQL dump..."
mkdir -p "${POSTGRES_SQL_DUMP_DIR}"
for ITEM in $POSTGRES_DATABASES; do
PGPASSWORD=${POSTGRES_PASSWORD} pg_dump -h localhost -U "${POSTGRES_USER}" "${ITEM}" > "${POSTGRES_SQL_DUMP_DIR}/${ITEM}.sql"
done
printf '%s\n' "Stopping service ${POSTGRES_SERVICE_NAME}..."
systemctl stop "${POSTGRES_SERVICE_NAME}"
printf '%s\n' "Rename dir ${POSTGRES_DATA_DIR}..."
mv "${POSTGRES_DATA_DIR}" "${POSTGRES_DATA_DIR}.old"
Запускаем от имени пользователя root.
# Даем права доступа на запуск
chmod +x /root/create_postgres_sql_dump.sh
# Запуск
/root/create_postgres_sql_dump.sh
# Проверяем наличие и содержимое дамп файлов
ls -l $POSTGRES_SQL_DUMP_DIR
# Выходим из LXC
exit
# Принудительно завершаем работу воркспейса
sudo /om/workspace-installer/prev/install workspace --path /om/workspace1/manifest.json shutdown --force
Восстановление из резервной копии с SQL дампа¶
# Запускаем воркспейс с "новой" версией PostgreSQL
sudo /om/workspace-installer/current/install workspace --path /om/workspace1/manifest.json up
# Входим в контейнер LXC
sudo lxc-attach -n $(sudo lxc-ls)
Создаем bash скрипт в LXC контейнере
/root/restore_postgres_data_from_sql_dump.sh.
#!/bin/bash
# Описание переменных
# POSTGRES_USER: логин пользователя для подключения к БД PostgreSQL
# POSTGRES_PASSWORD: пароль пользователя для подключения к БД PostgreSQL
# POSTGRES_DATABASES: список БД для создания резервной копии. Элементы списка разделены между собой через знак пробела. Пример - "db1 db2"
# POSTGRES_SQL_DUMP_DIR: размещение созданных резервных копий в виде дамп файлов
set -e
POSTGRES_USER=${POSTGRES_USER:-admin}
POSTGRES_PASSWORD=${POSTGRES_PASSWORD:-"ToyHTC4AQft2V0HKG"}
POSTGRES_DATABASES=${POSTGRES_DATABASES:-"\"db1\""}
POSTGRES_SQL_DUMP_DIR=${POSTGRES_SQL_DUMP_DIR:-"/opt/oltp/postgresql/backup"}
export PGPASSWORD=${POSTGRES_PASSWORD}
for ITEM in $POSTGRES_DATABASES; do
printf '%s\n' "Restoring database ${ITEM}..."
if psql -lqt -U admin | cut -d \| -f 1 | grep -qw "${ITEM//\"}"; then
printf '%s\n' "Database ${ITEM} already exist"; else
printf '%s\n' "Database ${ITEM} not exist"
printf '%s\n' "Creating database ${ITEM}"
psql -h localhost -U "${POSTGRES_USER}" postgres -c "CREATE DATABASE ${ITEM};"
fi
psql -h localhost -U "${POSTGRES_USER}" "${ITEM//\"}" < "${POSTGRES_SQL_DUMP_DIR}/${ITEM//\"}.sql"
printf '%s\n' "Done";
done
Запускаем от имени пользователя root.
# Даем права доступа на запуск
chmod +x /root/restore_postgres_data_from_sql_dump.sh
# Запуск
/root/restore_postgres_data_from_sql_dump.sh
# Проверяем созданные базы данных
PGPASSWORD=${POSTGRES_PASSWORD} psql -h localhost -U ${POSTGRES_USER} postgres
\l - список баз данных
Тестирование¶
Миграция успешно прошла между версиями:
- PostgreSQL 13 -> 15