Импорт данных из PostgreSQL
Важно
Поддержка синтаксиса PostgreSQL в YDB находится в разработке. Использовать её в production окружениях не рекомендуется. Запросы в PostgreSQL могут исполняться до нескольких раз медленнее по сравнению с аналогичными запросами на YQL.
Основной сценарий, который можно тестировать — выполнение аналитических запросов к хранимым в YDB данным.
Данные из PostgreSQL в YDB можно импортировать различными способами:
-
С помощью pg-dump.
-
С помощью импорта данных из файлов.
-
С помощью утилиты ydb-importer.
Способ импорта | Способ работы | Сценарии использования |
---|---|---|
pg-dump | Создание всей необходимой структуры таблиц и данных | Импорт баз данных PostgreSQL целиком |
Импорт данных из файлов | Импорт файлов с данными в заранее созданные таблицы базы данных YDB | Импорт данных из баз данных Greenplum или любых других баз данных со сменой структуры хранения данных |
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-convert
YDB 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.