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

Опыт использования утилиты pgcopydb: кейс миграции базы данных 1С с других СУБД с PostgreSQL на Pangolin

Приведен кейс миграции базы данных 1С с СУБД на базе PostgreSQL версии 17.5 на Pangolin 7.1.0 при помощи утилиты pgcopydb. Эта утилита используется для переноса данных между различными системами на базе ядра PostgreSQL и поддерживает многопоточную работу – копирование данных, создание индексов и сбор статистики выполняются параллельно. Ниже описан порядок действий, примененный при миграции, с техническими деталями, подтвердившими корректную работу процесса на практике.

Подготовка целевой СУБД

Перед началом миграции была подготовлена СУБД Pangolin 7.1.0, настроенная для работы с 1С. В дальнейшем эта система называется целевой, а СУБД, с которой выполняется перенос, – исходной. Исходная база размещалась на одной из сборок PostgreSQL, используемой ранее в продуктивной среде.

  1. Для целевой СУБД были установлены расширения, применяемые 1С на источнике: fasttrun, fulleq, mchar, plpgsql.

    Проверка выполнялась запросом:

    SELECT * FROM pg_available_extensions WHERE name IN ('mchar', 'fulleq', 'fasttrun', 'plpgsql');
  2. Для выполнения миграции был создан пользователь, которому предоставлены права суперпользователя, чтобы обеспечить корректное владение всеми объектами базы данных:

    CREATE USER usr1cv8 WITH PASSWORD 'password' SUPERUSER CREATEDB;
к сведению

Здесь показано создание технологической учетной записи под 1С с правами superuser для наглядности описания процесса.

На практике Pangolin позволяет использовать учетные записи для работы с 1С без привилегии superuser. Подробнее об этом можно прочитать в официальной документации

  1. На целевой стороне должны быть созданы пользователи, которые являются владельцами объектов в исходной базе или имеют права на эти объекты. Это важно, потому что в процессе миграции утилита изменяет ACL на объектах, и при отсутствии таких пользователей выполнение завершится ошибкой.

    Для автоматического переноса ролей могла использоваться опция --roles, однако зачастую удобнее создать их вручную.

    При необходимости можно использовать опции --no-owners и --no-acl, чтобы не копировать владельцев и права доступа.

  2. Под созданным пользователем была создана база данных для переноса данных 1С с параметрами локали и кодировкой UTF-8:

    CREATE DATABASE big_1c
    ENCODING='UTF8'
    LOCALE='ru-RU'
    LC_COLLATE='ru_RU.UTF-8'
    LC_CTYPE='ru_RU.UTF-8'
    ICU_LOCALE='ru_RU'
    LOCALE_PROVIDER='icu'
    TEMPLATE='template0'
    OWNER=usr1cv8;
Важно

Для работы 1С обязательна русская локаль

Установка утилиты pgcopydb

Утилита pgcopydb поставляется вместе с дистрибутивом СУБД Pangolin, но по умолчанию не устанавливается. Установка выполнялась из локального пакета. Пример вывода консоли при успешной установке:

[user@host ~]$ sudo yum localinstall /opt/pangolin-dbms-server-7/3rdparty/pgcopydb/pangolin-pgcopydb-0.14-linux9.x86_64.rpm
Last metadata expiration check: 0:17:47 ago on Fri 24 Oct 2025 12:00:26 PM MSK.
Dependencies resolved.
=============================================================================================================================================================================================
Package Architecture Version Repository Size
=============================================================================================================================================================================================
Installing:
pangolin-pgcopydb x86_64 0.14-linux9 @commandline 751 k

Transaction Summary
=============================================================================================================================================================================================
Install 1 Package

Total size: 751 k
Installed size: 2.2 M
Is this ok [y/N]: y
Downloading Packages:
Running transaction check
Transaction check succeeded.
Running transaction test
Transaction test succeeded.
Running transaction
Preparing : 1/1
Running scriptlet: pangolin-pgcopydb-0.14-linux9.x86_64 1/1
Installing : pangolin-pgcopydb-0.14-linux9.x86_64 1/1
Verifying : pangolin-pgcopydb-0.14-linux9.x86_64 1/1

Installed:
pangolin-pgcopydb-0.14-linux9.x86_64

Complete!
[user@host ~]$

После установки проверялось наличие исполняемого файла:

/opt/pangolin-dbms-server/bin/pgcopydb

Выполнение миграции

После установки утилиты выполнялась миграция базы данных 1С с СУБД на базе PostgreSQL версии 17.5 на Pangolin 7.1.0.

Утилита pgcopydb принимает параметры при запуске и не предполагает использование конфигурационных файлов — все настройки задаются через аргументы командной строки.

По умолчанию pgcopydb использует четыре параллельных потока для копирования данных, создания индексов и обновления статистики. Количество потоков настраивается параметрами --table-jobs и --index-jobs. Оптимальные значения подбирались с учетом числа ядер и производительности дисковой подсистемы.

Пример запуска миграции в 12 потоков при аутентификации без пароля:

/opt/pangolin-dbms-server/bin/pgcopydb clone \
--source "host=source_server port=5432 dbname=source_db user=usr1cv8" \
--target "host=target_server port=5432 dbname=big_1c user=usr1cv8" \
--restart --table-jobs=12 --index-jobs=12

При приведенном запуске утилита выполняет полный процесс клонирования базы. Описание шагов ниже показывает весь порядок операций, чтобы было понятно, что выполняется параллельно, а что последовательно, и как утилита организует миграцию данных:

  1. Фиксировался снимок данных (snapshot) для обеспечения целостности.

  2. На исходной базе создавались дампы схемы:

    pg_dump -Fc --snapshot <snapshot_id> --section pre-data --file /tmp/pgcopydb/schema/pre.dump "postgres://usr1cv8@source_server:5432/source_db"
    pg_dump -Fc --snapshot <snapshot_id> --section post-data --file /tmp/pgcopydb/schema/post.dump "postgres://usr1cv8@source_server:5432/source_db"
  3. В целевую базу Pangolin загружался дамп pre.dump (структура базы).

  4. Данные копировались из таблиц в многопоточном режиме.

  5. По мере завершения копирования создавались индексы и выполнялся VACUUM.

  6. После окончания копирования загружался дамп post.dump (завершающие объекты).

Особенности параллельного копирования

Копирование выполнялось по таблицам, каждая таблица переносилась в отдельном потоке. При наличии крупных таблиц часть потоков завершалась раньше. Для равномерной загрузки использовался параметр --split-tables-larger-than, который позволял делить большие таблицы на части и обрабатывать их параллельно.

Повторный запуск миграции

При повторном запуске pgcopydb проверяет наличие данных предыдущего сеанса и выводит предупреждение. Для перезапуска с удалением временных данных использовались параметры --drop-if-exists и --restart.

Миграция между несовместимыми версиями PostgreSQL

При переносе между сборками PostgreSQL с различными мажорными версиями ядра возможны несовместимости утилит pg_dump и pg_restore. В таких случаях процесс разделялся на три этапа.

  1. Создание дампа структуры:

    pg_dump --section pre-data --file /home/postgres/schema/pre.dump "postgres://usr1cv8@source_server:5432/source_db"
  2. Создание дампа завершающих данных:

    pg_dump --section post-data --file /home/postgres/schema/post.dump "postgres://usr1cv8@source_server:5432/source_db"
  3. Загрузка структуры и копирование данных:

    psql -h localhost -d big_1c < /home/postgres/schema/pre.dump

    /opt/pangolin-dbms-server/bin/pgcopydb copy data \
    --source "host=source_server port=5432 dbname=source_db user=usr1cv8" \
    --target "host=target_server port=5432 dbname=big_1c user=usr1cv8" \
    --drop-if-exists --restart --table-jobs=12 --index-jobs=12

    psql -h localhost -d big_1c < /home/postgres/schema/post.dump

Права владельца объектов

Объекты, созданные в процессе миграции, принадлежат пользователю, под которым выполнялась операция. На время переноса этому пользователю предоставлялись права суперпользователя для корректного завершения всех операций.