Перейти к основному содержимому

Миграция с оригинального PostgreSQL на Pangolin

В качестве инструмента для миграции с оригинального PostgreSQL на Pangolin используется доработанная утилита pg_upgrade. Подробнее об оригинальной утилите pg_upgrade и ее параметрах читайте здесь.

Миграция с оригинального PostgreSQL на Pangolin существующими утилитами невозможна из-за увеличенной до 128 бит длины идентификаторов в Pangolin, а также из-за отсутствия системных каталогов парольных политик и защиты данных от привилегированных пользователей, что считается критической ошибкой для инструментов миграции. Это послужило поводом для доработок в части проверки совместимости кластеров, исходного и целевого, а также в части создания образа системных каталогов.

Внимание!

Концепция LOB, реализованная в PostgreSQL начиная с ядра 9.0, подразумевает, что каждый LOB-объект рассматривается отдельно со своим набором привилегий.

Большое количество LOB-объектов может привести к серьезным проблемам при администрировании сервера СУБД. Так обработка большого количества LOB-объектов, каждого со своими привилегиями, сказывается на требованиях оперативной памяти при работе утилиты pg_dump, а также pg_upgrade. Если в системе недостаточно ресурсов для работы этих утилит, автоматическое обновление может быть невозможно. Заранее рассчитать требования памяти pg_dump затруднительно, так как они могут зависеть не только от количества объектов и привилегий, но и от длины полей (в названиях, комментариях и т.п). Оценку лучше проводить практическими тестами. При этом также следует оценивать время выполнения утилиты pg_dump и последующего восстановления данных (в случае необходимости).

При выборе архитектуры приложения следует оценить реальную необходимость использования LOB-объектов, так как в большинстве случаев можно выбрать TOAST. При использовании TOAST привилегии выдаются на таблицу целиком, а не на каждый LOB-объект в отдельности. Размер TOAST ограничивается 1 Гбайт. Более подробную информацию о LOB-объектах смотрите в документации PostgeSQL.

Описание

При расхождении длины идентификаторов исходного и целевого кластеров осуществляется дополнительная проверка использования этого параметра в исходном кластере. Тип данных name, использующий длину идентификаторов, не должен использоваться для пользовательских отношений, поэтому была добавлена дополнительная проверка отношений пользователей на наличие использования этого типа. Если такие отношения обнаружены, миграция невозможна по причине того, что в файлах пользовательских данных при записи была использована длина идентификаторов меньшего размера, и, следовательно, эти файлы не могут быть декодированы. В системных каталогах наличие этого типа не критично, так как каталоги создаются заново при инициализации целевого кластера и заполняются скриптом-образом заново, то есть при заполнении будет использоваться уже новое значение параметра длины идентификаторов.

Необходимым условием для запуска миграции с оригинального PostgreSQL на Pangolin является указание нового параметра запуска утилиты pg_upgrade --old-original. Этот параметр явно задает что исходный кластер должен относиться к оригинальному PostgreSQL. В случае, если в сочетании с ключом в качестве исходного кластера выступает продукт Pangolin, или исходный кластер (оригинальный PostgreSQL), но ключ --old-original не указан, миграция будет завершена с ошибкой.

При создании образа системных каталогов утилитой миграции pg_upgrade используется утилита pg_dumpall, которая копирует все глобальные объекты, кроме системных объектов, относящихся к защите данных от привилегированного пользователя. Критичность наличия системных каталогов парольных политик и защиты данных определяется типом продукта исходного кластера. Для определения типа продукта используется наличие GUC-параметра server_se_version. Параметр был добавлен в версии Pangolin 4.1.0, вместе с изменением наполнения системных каталогов.

примечание

Подробнее об утилите pg_dumpall можно прочитать здесь.

Утилита pg_dumpall проверяет лишь наличие этого конфигурационного параметра, который является внутренним и не может быть изменен через файл конфигурации postgresql.conf, и на основе его наличия в настройках работающего кластера делает вывод о принадлежности кластера к продукту Pangolin. Для оригинального PostgreSQL пропускается шаг дампа каталогов парольных политик.

Утилита pg_upgrade так же использует параметр конфигурации server_se_version, но дополнительно осуществляет синтаксический анализ полученного значения, для определения версии продукта. Несмотря на изменения формата содержания переменной server_se_version, в зависимости от версии Pangolin, во всех вариантах неизменным является вывод непосредственно версии <major>.<minor>.<patch>. По наличию номера версии делается вывод о принадлежности исходного кластера к продукту Pangolin и в этом случае утилитой pg_upgrade осуществляется копирование системных каталогов защиты данных от привилегированных пользователей.

Диаграммы процессов

Схема миграции с оригинального PostgreSQL на Pangolin:

Схема миграции с оригинального PostgreSQL на Pangolin

Наименование шагаВходной документОписаниеИсполнительХарактер измененийПродолжительностьВыходной документИТ-системаПереход к шагу
01 Проверка совместимости кластеровПроверка совместимости параметров исходного и целевого кластеров. В случае расхождения длины идентификаторов устанавливается флаг необходимости дополнительной проверки пользовательских отношений на наличие использования типа данных namepg_upgradePangolin02
02 Необходимость проверки исходного кластера на наличие пользовательских отношений с типом name и/или с пользовательским типом, использующим тип nameВ зависимости от флага, выставленного на предыдущем шаге, переход к проверке пользовательских отношений на возможность миграцииpg_upgradePangolin03 - нужна дополнительная проверка пользовательских отношений

04 - переход к началу миграции
03 Проверка исходного кластера на наличие пользовательских отношений с типом name и/или с пользовательским типом, использующим тип nameПроверка исходного кластера на наличие пользовательских отношений с типом name и/или с пользовательским типом, использующим тип namepg_upgradePangolin04 - в исходном кластере нет пользовательских отношений с типом name

отказ в миграции при наличии использования типа name в пользовательских отношениях
04 Создание образа глобальных объектов оригинального PostgreSQL исходной базыСоздание образа глобальных объектов присущих оригинальному PostgreSQLpg_dumpallPangolin05
05 Проверка является ли исходный кластер продуктом PangolinНа основе версии продукта определяется является ли исходный кластер продуктом Pangolin или оригинальным PostgreSQLpg_upgrade, pg_dumpallPangolin06 - исходный кластер является продуктом Pangolin

08 - исходный кластер является оригинальным PostgreSQL
06 Проверка наличия системных каталогов присущих продукту PangolinПроверка наличия системных каталогов парольных политик и защиты данных от привилегированных пользователей в исходном кластереpg_upgrade, pg_dumpallPangolin07 - системные каталоги Pangolin присутствуют в исходном кластере

отказ в миграции
07 Создание образа системных каталогов PangolinСоздание образа системных каталогов Pangolinpg_upgrade, pg_dumpallPangolin08
08 Применение созданных образов системных каталогов к целевому кластеру и перенос пользовательских данныхВ завершении миграции к целевому кластеру применяются созданные образы системных каталогов и осуществляется миграция пользовательских данных

Схема миграции с оригинального PostgreSQL на Pangolin при наличии пользовательских данных с типом name:

Схема миграции при наличии пользовательских данных с типом name

Наименование шагаВходной документОписаниеИсполнительХарактер измененийПродолжительностьВыходной документИТ-системаПереход к шагу
01 Устранение использования типа name в пользовательских отношенияхТип name не предназначен для использования пользователем, поэтому отношения могут быть модифицированы с использованием подходящего типа данныхАдминистратор СУБДPostgreSQL02
02 Запуск миграции с оригинального PostgreSQL на PangolinЗапуск процесса миграцииАдминистратор СУБДPangolin03
03 Миграция с оригинального PostgreSQL на PangolinОсуществление миграции утилитами входящими в состав Pangolinpg_upgradePangolin

Пример миграции с оригинального PostgreSQL на Pangolin

Внимание!

После переноса dbms в клиентскую часть в Pangolin {version}, некоторые утилиты, необходимые для корректной миграции с оригинального PostgreSQL, находятся в клиентской части. Для их корректного использования утилитой pg_upgrade требуется создать ссылки на файлы утилит:

ln -s /usr/pangolin-dbms-client/bin/pg_dump /usr/pangolin-06/bin/pg_dump
ln -s /usr/pangolin-dbms-client/bin/pg_dumpall /usr/pangolin-06/bin/pg_dumpall
ln -s /usr/pangolin-dbms-client/bin/pg_restore /usr/pangolin-06/bin/pg_restore
ln -s /usr/pangolin-dbms-client/bin/psql /usr/pangolin-06/bin/psql
ln -s /usr/pangolin-dbms-client/bin/vacuumdb /usr/pangolin-06/bin/vacuumdb

В качестве исходной СУБД в примере использован оригинальный PostgreSQL 11.21, целевой – Pangolin 5.5.0. Для миграции выполните шаги:

  1. Выполните преобразование пользовательских объектов использующих тип name.

  2. Создайте образ пользовательских данных для проверки миграции:

    ${исходная_СУБД}/bin/pg_dump -Fp -f original_dump.sql
  3. Остановите кластер:

    ${исходная_СУБД}/bin/pg_ctl -D ${PGDATA_OLD} stop
  4. Создайте целевой кластер Pangolin:

    1. Установите СУБД в ${целевая_СУБД}.

    2. Выполните инициализацию:

      ${целевая_СУБД}/bin/initdb -D ${PGDATA_NEW}
  5. Запустите миграцию:

    ${целевая_СУБД}/bin/pg_upgrade --old-bindir ${исходная_СУБД}/bin --old-datadir ${PGDATA_OLD} --new-bindir ${целевая_СУБД}/bin --new-datadir ${PGDATA_NEW} --old-original

    Параметры:

    • --old-bindir – каталог с исполняемыми файлами исходной версии PostgreSQL (${исходная_СУБД}/bin);
    • --old-datadir – каталог данных исходного кластера (${PGDATA_OLD});
    • --old-original – параметр явно задает, что исходный кластер должен относиться к оригинальному PostgreSQL;
    • --new-bindir – каталог с исполняемыми файлами целевой версии Pangolin (${целевая_СУБД}/bin);
    • --new-datadir – каталог данных целевого кластера (${PGDATA_NEW}).

Версии PostgreSQL, подходящие для миграции

Возможно обновление только на версию с ядром СУБД не ниже исходной:

Исходная версия ядра PostgreSQLИсходная версия PostgreSQLЦелевая версия Pangolin
1010.235.5.0, 6.1.0
1111.215.5.0, 6.1.0
1212.165.5.0, 6.1.0
1313.125.5.0, 6.1.0
1515.46.1.0