Опыт использования утилиты pgcopydb: кейс миграции базы данных 1С с других СУБД с PostgreSQL на Pangolin
Приведен кейс миграции базы данных 1С с СУБД на базе PostgreSQL версии 17.5 на Pangolin 7.1.0 при помощи утилиты pgcopydb.
Эта утилита используется для переноса данных между различными системами на базе ядра PostgreSQL и поддерживает многопоточную работу – копирование данных, создание индексов и сбор статистики выполняются параллельно.
Ниже описан порядок действий, примененный при миграции, с техническими деталями, подтвердившими корректную работу процесса на практике.
Подготовка целевой СУБД
Перед началом миграции была подготовлена СУБД Pangolin 7.1.0, настроенная для работы с 1С. В дальнейшем эта система называется целевой, а СУБД, с которой выполняется перенос, – исходной. Исходная база размещалась на одной из сборок PostgreSQL, используемой ранее в продуктивной среде.
-
Для целевой СУБД были установлены расширения, применяемые 1С на источнике:
fasttrun,fulleq,mchar,plpgsql.Проверка выполнялась запросом:
SELECT * FROM pg_available_extensions WHERE name IN ('mchar', 'fulleq', 'fasttrun', 'plpgsql'); -
Для выполнения миграции был создан пользователь, которому предоставлены права суперпользователя, чтобы обеспечить корректное владение всеми объектами базы данных:
CREATE USER usr1cv8 WITH PASSWORD 'password' SUPERUSER CREATEDB;
Здесь показано создание технологической учетной записи под 1С с правами superuser для наглядности описания процесса.
На практике Pangolin позволяет использовать учетные записи для работы с 1С без привилегии superuser.
Подробнее об этом можно прочитать в официальной документации
-
На целевой стороне должны быть созданы пользователи, которые являются владельцами объектов в исходной базе или имеют права на эти объекты. Это важно, потому что в процессе миграции утилита изменяет ACL на объектах, и при отсутствии таких пользователей выполнение завершится ошибкой.
Для автоматического переноса ролей могла использоваться опция
--roles, однако зачастую удобнее создать их вручную.При необходимости можно использовать опции
--no-ownersи--no-acl, чтобы не копировать владельцев и права доступа. -
Под созданным пользователем была создана база данных для переноса данных 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
При приведенном запуске утилита выполняет полный процесс клонирования базы. Описание шагов ниже показывает весь порядок операций, чтобы было понятно, что выполняется параллельно, а что последовательно, и как утилита организует миграцию данных:
-
Фиксировался снимок данных (snapshot) для обеспечения целостности.
-
На исходной базе создавались дампы схемы:
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" -
В целевую базу Pangolin загружался дамп
pre.dump(структура базы). -
Данные копировались из таблиц в многопоточном режиме.
-
По мере завершения копирования создавались индексы и выполнялся
VACUUM. -
После окончания копирования загружался дамп
post.dump(завершающие объекты).
Особенности параллельного копирования
Копирование выполнялось по таблицам, каждая таблица переносилась в отдельном потоке.
При наличии крупных таблиц часть потоков завершалась раньше.
Для равномерной загрузки использовался параметр --split-tables-larger-than, который позволял делить большие таблицы на части и обрабатывать их параллельно.
Повторный запуск миграции
При повторном запуске pgcopydb проверяет наличие данных предыдущего сеанса и выводит предупреждение.
Для перезапуска с удалением временных данных использовались параметры --drop-if-exists и --restart.
Миграция между несовместимыми версиями PostgreSQL
При переносе между сборками PostgreSQL с различными мажорными версиями ядра возможны несовместимости утилит pg_dump и pg_restore.
В таких случаях процесс разделялся на три этапа.
-
Создание дампа структуры:
pg_dump --section pre-data --file /home/postgres/schema/pre.dump "postgres://usr1cv8@source_server:5432/source_db" -
Создание дампа завершающих данных:
pg_dump --section post-data --file /home/postgres/schema/post.dump "postgres://usr1cv8@source_server:5432/source_db" -
Загрузка структуры и копирование данных:
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
Права владельца объектов
Объекты, созданные в процессе миграции, принадлежат пользователю, под которым выполнялась операция. На время переноса этому пользователю предоставлялись права суперпользователя для корректного завершения всех операций.