Миграция с оригинального 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:

| Наименование шага | Входной документ | Описание | Исполнитель | Характер изменений | Продолжительность | Выходной документ | ИТ-система | Переход к шагу |
|---|---|---|---|---|---|---|---|---|
| 01 Проверка совместимости кластеров | Проверка совместимости параметров исходного и целевого кластеров. В случае расхождения длины идентификаторов устанавливается флаг необходимости дополнительной проверки пользовательских отношений на наличие использования типа данных name | pg_upgrade | Pangolin | 02 | ||||
| 02 Необходимость проверки исходного кластера на наличие пользовательских отношений с типом name и/или с пользовательским типом, использующим тип name | В зависимости от флага, выставленного на предыдущем шаге, переход к проверке пользовательских отношений на возможность миграции | pg_upgrade | Pangolin | 03 - нужна дополнительная проверка пользовательских отношений 04 - переход к началу миграции | ||||
| 03 Проверка исходного кластера на наличие пользовательских отношений с типом name и/или с пользовательским типом, использующим тип name | Проверка исходного кластера на наличие пользовательских отношений с типом name и/или с пользовательским типом, использующим тип name | pg_upgrade | Pangolin | 04 - в исходном кластере нет пользовательских отношений с типом name отказ в миграции при наличии использования типа name в пользовательских отношениях | ||||
| 04 Создание образа глобальных объектов оригинального PostgreSQL исходной базы | Создание образа глобальных объектов присущих оригинальному PostgreSQL | pg_dumpall | Pangolin | 05 | ||||
| 05 Проверка является ли исходный кластер продуктом Pangolin | На основе версии продукта определяется является ли исходный кластер продуктом Pangolin или оригинальным PostgreSQL | pg_upgrade, pg_dumpall | Pangolin | 06 - исходный кластер является продуктом Pangolin 08 - исходный кластер является оригинальным PostgreSQL | ||||
| 06 Проверка наличия системных каталогов присущих продукту Pangolin | Проверка наличия системных каталогов парольных политик и защиты данных от привилегированных пользователей в исходном кластере | pg_upgrade, pg_dumpall | Pangolin | 07 - системные каталоги Pangolin присутствуют в исходном кластере отказ в миграции | ||||
| 07 Создание образа системных каталогов Pangolin | Создание образа системных каталогов Pangolin | pg_upgrade, pg_dumpall | Pangolin | 08 | ||||
| 08 Применение созданных образов системных каталогов к целевому кластеру и перенос пользовательских данных | В завершении миграции к целевому кластеру применяются созданные образы системных каталогов и осуществляется миграция пользовательских данных |
Схема миграции с оригинального PostgreSQL на Pangolin при наличии пользовательских данных с типом name:

| Наименование шага | Входной документ | Описание | Исполнитель | Характер изменений | Продолжительность | Выходной документ | ИТ-система | Переход к шагу |
|---|---|---|---|---|---|---|---|---|
| 01 Устранение использования типа name в пользовательских отношениях | Тип name не предназначен для использования пользователем, поэтому отношения могут быть модифицированы с использованием подходящего типа данных | Администратор СУБД | PostgreSQL | 02 | ||||
| 02 Запуск миграции с оригинального PostgreSQL на Pangolin | Запуск процесса миграции | Администратор СУБД | Pangolin | 03 | ||||
| 03 Миграция с оригинального PostgreSQL на Pangolin | Осуществление миграции утилитами входящими в состав Pangolin | pg_upgrade | Pangolin |
Пример миграции с оригинального 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. Для миграции выполните шаги:
-
Выполните преобразование пользовательских объектов использующих тип name.
-
Создайте образ пользовательских данных для проверки миграции:
${исходная_СУБД}/bin/pg_dump -Fp -f original_dump.sql -
Остановите кластер:
${исходная_СУБД}/bin/pg_ctl -D ${PGDATA_OLD} stop -
Создайте целевой кластер Pangolin:
-
Установите СУБД в
${целевая_СУБД}. -
Выполните инициализацию:
${целевая_СУБД}/bin/initdb -D ${PGDATA_NEW}
-
-
Запустите миграцию:
${целевая_СУБД}/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 |
|---|---|---|
| 10 | 10.23 | 5.5.0, 6.1.0 |
| 11 | 11.21 | 5.5.0, 6.1.0 |
| 12 | 12.16 | 5.5.0, 6.1.0 |
| 13 | 13.12 | 5.5.0, 6.1.0 |
| 15 | 15.4 | 6.1.0 |