Импорт данных из PostgreSQL
Данные из 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 -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_USE_IN_MEMORY_PDISKS=true \ ghcr.io/ydb-platform/local-ydb:nightly
-
Сгенерировать данные через pgbench:
docker exec postgres pgbench postgres://root:1234@localhost/local -i
-
Сделать дамп базы через 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