Перейти к содержанию

Миграция данных при обновлении мажорной версии сервиса 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