Импорт данных из PostgreSQL

Важно

Поддержка синтаксиса PostgreSQL в YDB находится в разработке. Использовать её в production окружениях не рекомендуется. Запросы в PostgreSQL могут исполняться до нескольких раз медленнее по сравнению с аналогичными запросами на YQL.

Основной сценарий, который можно тестировать — выполнение аналитических запросов к хранимым в YDB данным.

Данные из PostgreSQL в YDB можно импортировать различными способами:

Способ импорта Способ работы Сценарии использования
pg-dump Создание всей необходимой структуры таблиц и данных Импорт баз данных PostgreSQL целиком
Импорт данных из файлов Импорт файлов с данными в заранее созданные таблицы базы данных YDB Импорт данных из баз данных Greenplum или любых других баз данных со сменой структуры хранения данных

pg-dump

Данные из PostgreSQL в YDB можно перенести c помощью утилит pg_dump, psql и YDB CLI. Утилиты pg_dump и psql устанавливаются вместе с PostgreSQL, YDB CLI — консольный клиент YDB, который устанавливается отдельно.

Для этого нужно:

  1. Сделать дамп данных через pg_dump со следующими параметрами:

    • --inserts — для добавления данных через команду INSERT, вместо использования протокола COPY.
    • --column-inserts — для добавления данных через команду INSERT с именами колонок.
    • --rows-per-insert=1000 — для вставки данных пачками и ускорения процесса.
    • --encoding=utf_8 — YDB поддерживает строковые данные только в UTF-8.
  2. Привести дамп к виду, который поддерживается YDB командой ydb tools pg-convert YDB CLI.

  3. Результат загрузить в 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...]

Параметры подкоманды

Имя Описание
-i Имя файла, в котором находится изначальный дамп. Если опция не указана, дамп считывается из stdin'a.
--ignore-unsupported При указании этой опции, неподдерживаемые конструкции будут закомментированы в итоговом дампе и продублированы в stderr. По умолчанию, при обнаружении неподдерживаемых конструкций, команда возвращает ошибку. Не относится к выражениям ALTER TABLE, задающим первичный ключ таблицы, они комментируются в любом случае.

Важно

При загрузке больших дампов считывание из stdin'a не рекомендуется, поскольку в таком случае весь дамп будет сохранен в оперативной памяти. Рекомендуется использовать опцию с файлом, в таком случае CLI будет держать в памяти небольшую часть дампа.

Пример импорта дампа в YDB

В качестве примера будут загружены данные, сгенерированные pgbench.

  1. Поднять докер-контейнеры с 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

  2. Сгенерировать данные через pgbench:

    docker exec postgres_container pgbench postgres://pgroot:1234@localhost:5433/local -i
    
  3. Сделать дамп базы через 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
    
  4. Загрузить дамп базы в 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.

Предыдущая
Следующая