pgloader
Миграция данных в БД PostgreSQL.
Связанные компоненты:
freetds
, sbcl
.Проект
pgloader
является программным обеспечением с открытым исходным кодом. C ходом разработки можно ознакомиться по ссылке https://github.com/dimitri/pgloader.Утилита представляет собой инструмент для переноса/миграции данных из MS SQL Server, MySQL, SQLite в базу данных PostgreSQL. Инструмент использует PostgreSQL-команду COPY для копирования данных из исходной базы данных или файла.
Если в процессе эксплуатации автоматизированной системы принято решение о смене SQL-сервера, необходимо учитывать, что разные реализации SQL-серверов отличаются:
- диалектом;
- поддерживаемыми типами данных;
- процедурными языками;
- особенностями ввода в эксплуатацию.
Укрупненно процесс смены SQL-сервера (миграция) состоит из нескольких стадий, которые представлены в таблице:
Номер | Стадия | Ожидаемый результат |
---|---|---|
1 | Архитектурное планирование | Получены требования к сервису, DataFlow, метрикам SLA |
2 | Планирование схемы данных | Получены DDL-данные, с учетом диалекта целевого SQL-сервера (чаще в виде скрипта liquibase/flyway ) |
3 | Определение схемы данных: - подготовка DDL-таблиц; - индексирование и связывание таблиц | На целевом SQL-сервере будет подготовлена схема данных, а также добавлены необходимые УЗ |
4 | Перенос данных | На целевой SQL-сервер будут перенесены данные с исходного SQL-сервера |
5 | Перенос кода (опционально) | На целевом SQL-сервере будут созданы: - хранимые процедуры; - триггеры; - регламентные процедуры, необходимые для функционирования АС |
6 | Опциональная валидация данных (контроль полноты перенесенных данных) | Получено подтверждение о полноте перенесенных данных |
Перенос данных в неиндексированную структуру и последующая индексация занимает меньше времени, чем перенос данных в индексированную структуру. Поэтому для уменьшения затрат на миграцию следует разделить шаг «Подготовка схемы данных» на два этапа:
- подготовка DDL-таблиц;
- индексирование и связывание таблиц.
Перед началом работы необходимо создать на приемнике структуру схем, соответствующую источнику. Миграцию схем можно произвести с помощью
liquibase
.Автоматизированного сценария переноса исходного кода БД функциональностью утилиты не предусмотрено. Для этого существуют сторонние инструменты, но в данной статье они не рассматриваются.
В процессе работы
pgloader
создает объекты в целевой базе данных Компонента и переносит в нее данные. Для работы инструмента необходимы права на создание и наполнение объектов. Рекомендуется выделить отдельную роль и наделить ее необходимыми правами, так как для базы данных источника необходим пользователь, который имеет доступ ко всем переносимым объектам.Загрузка данных в схему, в которой существуют индексы, ограничения (
constraints
), триггеры и другая функциональная логика будет занимать существенно больше времени. Кроме того, такое решение приведет к фрагментации индексов.На время загрузки в БД желательно использовать минимально необходимую функциональность для поддержания логической и структурной целостности (первичные ключи, партиционирование и др.). После загрузки данных нужно явно пересоздать использованные индексы и довести БД до продуктивного функционирования (например, с использованием поисковых индексов, внешних ключей).
Пример конфигурационного файла
migr1.load
:LOAD DATABASE FROM mssql://SA@10.40.0.0:1433/TestDB INTO postgresql://postgres@127.0.0.1:5433/first_db?sslmode=require including only table names like 'test2' in schema 'dbo' with create no schemas, create no indexes, no foreign keys, disable triggers, truncate, create no tables, quote identifiers, reset sequences, data only, workers = 4; -- cast type bigint to bigint, type float to float;
Запуск утилиты:
/usr/pangolin-5.5.0/migration_tools/pgloader/pgloader migr1.load
Пример вывода результата:
Раскрыть type=sql2022-11-10T08:55:17.039000+03:00 LOG pgloader version "3.6.9" 2022-11-10T08:55:17.042000+03:00 LOG Enter MSSQL password if necessary: 2022-11-10T08:55:26.888000+03:00 LOG Enter MSSQL password if necessary: 2022-11-10T08:55:34.006000+03:00 LOG Migrating from #<MSSQL-CONNECTION mssql://SA@10.40.0.0:1433/TestDB {1006874393}> 2022-11-10T08:55:34.007000+03:00 LOG Migrating into #<PGSQL-CONNECTION pgsql://postgres@127.0.0.1:5433/first_db {1006875803}> Max connections reached, increase value of TDS_MAX_CONN Max connections reached, increase value of TDS_MAX_CONN 2022-11-10T08:55:34.276000+03:00 LOG report summary reset table name errors rows bytes total time ----------------------- --------- --------- --------- -------------- fetch meta data 0 1 0.049s Truncate 0 1 0.006s ----------------------- --------- --------- --------- -------------- "dbo"."test2" 0 23 0.2 kB 0.036s ----------------------- --------- --------- --------- -------------- COPY Threads Completion 0 4 0.037s Reset Sequences 0 0 0.028s Install Comments 0 0 0.000s ----------------------- --------- --------- --------- -------------- Total import time ✓ 23 0.2 kB 0.065s
После окончания работы утилиты необходимо:
- проанализировать журнал на предмет ошибок в колонке
errors
; - проверить корректность данных в целевой базе данных.
- Ошибка загрузки библиотек
libsybdb.so
,libsybdb.so.5
:
KABOOM! LOAD-FOREIGN-LIBRARY-ERROR: Unable to load any of the alternatives: ("libsybdb.so" "libsybdb.so.5") An unhandled error condition has been signalled: Unable to load any of the alternatives: ("libsybdb.so" "libsybdb.so.5")
Решение:
- установить недостающие пакеты:
sudo yum install freetds sbcl
; - проверить, что переменная
LD_LIBRARY_PATH
корректна, а ее значения доступны; - в случае с HA-кластерной конфигурацией, где есть оркестратор Pangolin Manager, поместить запуск переменной в service-файл процесса:
/etc/systemd/system/pangolin-manager.service
.
- Ошибка
FATAL
при подключении по сертификату:
In context DSN-OPTION-SSL: While parsing DSN-OPTION-SSL-REQUIRE. Expected: the string "require"
Решение: убрать из директивы
set
лишние настройки sslmode
.- Ошибка
Failed to connect to mssql
:
ERROR mssql: Failed to connect to mssql at "test0001.test.ru" (port 1102) as user "user": Connection to the database failed for an unknown reason.
Решение: поскольку утилита по умолчанию обращается на порт
1433
СУБД MSSQL, необходимо объявить переменную TDSPORT = <используемый_порт>
, например:TDSPORT = 1102
Дополнительную информацию по поставляемому модулю pgloader можно получить по ссылке.