Импорт данных из PostgreSQL
Важно
Поддержка синтаксиса PostgreSQL в YDB находится в разработке. Использовать её в production окружениях не рекомендуется. Запросы в PostgreSQL могут исполняться до нескольких раз медленнее по сравнению с аналогичными запросами на YQL.
Основной сценарий, который можно тестировать — выполнение аналитических запросов к хранимым в YDB данным.
Данные из PostgreSQL в YDB можно импортировать различными способами:
-
С помощью pg-dump.
-
С помощью импорта данных из файлов.
-
С помощью утилиты ydb-importer.
| Способ импорта | Способ работы | Сценарии использования |
|---|---|---|
| pg-dump | Создание всей необходимой структуры таблиц и данных | Импорт баз данных PostgreSQL целиком |
| Импорт данных из файлов | Импорт файлов с данными в заранее созданные таблицы базы данных YDB | Импорт данных из баз данных Greenplum или любых других баз данных со сменой структуры хранения данных |
| ydb-importer | Импорт данных из другой базы данных в заранее созданные таблицы базы данных YDB | Импорт данных из любых баз данных, поддерживающих JDBC-протокол |
pg-dump
Данные из PostgreSQL в YDB можно перенести c помощью утилит pg_dump, psql и YDB CLI. Утилиты pg_dump и psql устанавливаются вместе с PostgreSQL, YDB CLI — консольный клиент YDB, который устанавливается отдельно.
Для этого нужно:
-
Сделать дамп данных через pg_dump со следующими параметрами:
--inserts— для добавления данных через команду INSERT, вместо использования протокола COPY.--column-inserts— для добавления данных через команду INSERT с именами колонок.--rows-per-insert=1000— для вставки данных пачками и ускорения процесса.--encoding=utf_8— YDB поддерживает строковые данные только в UTF-8.
-
Привести дамп к виду, который поддерживается YDB командой
ydb tools pg-convertYDB CLI. -
Результат загрузить в YDB в режиме postgres-совместимости.
Команда pg-convert
Команда ydb tools pg-convert считывает из файла или stdin'а дамп, полученный утилитой pg_dump, выполняет преобразования и выводит в stdout дамп, который можно отправить в PostgreSQL-совместимую прослойку YDB.
ydb tools pg-convert выполняет следующие преобразования:
-
Перенос создания первичного ключа в тело команды CREATE TABLE.
-
Вырезание схемы
publicиз имен таблиц. -
Удаление секции
WITH (...)вCREATE TABLE -
Комментирование неподдерживаемых конструкций (опционально):
SELECT pg_catalog.set_config.*ALTER TABLE
Если CLI не сможет найти первичный ключ таблицы, он автоматически создаст BIGSERIAL колонку __ydb_stub_id в качестве первичного ключа.
Общий вид команды:
ydb [global options...] tools pg-convert [options...]
global options— глобальные параметры.options— параметры подкоманды.
Параметры подкоманды
| Имя | Описание |
|---|---|
-i |
Имя файла, в котором находится изначальный дамп. Если опция не указана, дамп считывается из stdin'a. |
--ignore-unsupported |
При указании этой опции, неподдерживаемые конструкции будут закомментированы в итоговом дампе и продублированы в stderr. По умолчанию, при обнаружении неподдерживаемых конструкций, команда возвращает ошибку. Не относится к выражениям ALTER TABLE, задающим первичный ключ таблицы, они комментируются в любом случае. |
Важно
При загрузке больших дампов считывание из stdin'a не рекомендуется, поскольку в таком случае весь дамп будет сохранен в оперативной памяти. Рекомендуется использовать опцию с файлом, в таком случае CLI будет держать в памяти небольшую часть дампа.
Пример импорта дампа в YDB
В качестве примера будут загружены данные, сгенерированные pgbench.
-
Поднять докер-контейнеры с PostgreSQL и YDB:
docker run --name postgres_container \ -e POSTGRES_USER=pgroot -e POSTGRES_PASSWORD=1234 \ -e POSTGRES_DB=local \ -p 5433:5433 -d postgres:14 -c 'port=5433' docker run --name ydb-postgres -d --pull always -p 5432:5432 -p 8765:8765 \ -e POSTGRES_USER=ydbroot -e POSTGRES_PASSWORD=4321 \ -e YDB_FEATURE_FLAGS=enable_temp_tables,enable_table_pg_types \ -e YDB_USE_IN_MEMORY_PDISKS=true \ ghcr.io/ydb-platform/local-ydb:latestИнформация по поднимаемым docker-контейнерам:
База данных
PostgreSQL
YDB
Имя контейнера
postgres_container
ydb-postgres
Адрес
postgres://pgroot:1234@localhost:5433/local
postgresql://ydbroot:4321@localhost:5432/local
Порт
5433
5432
Имя пользователя
pgroot
ydbroot
Пароль
1234
4321
-
Сгенерировать данные через pgbench:
docker exec postgres_container pgbench postgres://pgroot:1234@localhost:5433/local -i -
Сделать дамп базы через pg_dump:
docker exec postgres_container pg_dump postgres://pgroot:1234@localhost:5433/local --inserts \ --column-inserts --encoding=utf_8 --rows-per-insert=1000 > dump.sql -
Загрузить дамп базы в YDB:
ydb tools pg-convert --ignore-unsupported -i dump.sql | psql postgresql://ydbroot:4321@localhost:5432/localЭта команда использует YDB CLI для преобразования файла
dump.sqlв формат, поддерживаемый YDB в режиме совместимости с PostgreSQL. Затем преобразованный файл перенаправляется в утилитуpsqlдля загрузки данных в YDB по протоколу PostgreSQL.