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

Данные из 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 -d --rm -e POSTGRES_USER=root -e POSTGRES_PASSWORD=1234 \
        -e POSTGRES_DB=local --name postgres postgres:14
    docker run --name ydb-postgres -d --pull always -p 5432:5432 -p 8765:8765 \
        -e POSTGRES_USER=root -e POSTGRES_PASSWORD=1234 \
        -e YDB_FEATURE_FLAGS=enable_temp_tables \
        -e YDB_TABLE_ENABLE_PREPARED_DDL=true \
        -e YDB_USE_IN_MEMORY_PDISKS=true \
        ghcr.io/ydb-platform/local-ydb:nightly
    
  2. Сгенерировать данные через pgbench:

    docker exec postgres pgbench postgres://root:1234@localhost/local -i
    
  3. Сделать дамп базы через pg_dump и загрузить его в YDB:

    docker exec postgres pg_dump postgres://root:1234@localhost/local --inserts \
        --column-inserts --encoding=utf_8 --rows-per-insert=1000 > dump.sql
    ydb tools pg-convert -i dump.sql | psql postgresql://root:1234@localhost/local
    
Предыдущая
Следующая