Перенести данные из PostgreSQL в облачную базу данных PostgreSQL с помощью Trino
Вы можете перенести таблицы из своей базы данных PostgreSQL — на собственном сервере или в другом облаке — в облачную базу данных PostgreSQL с помощью облака для Trino. Trino читает данные из исходной базы и записывает их в целевую одним SQL-запросом, без промежуточных дампов и файлов.
Способ подходит, если нужно перенести отдельные схемы или таблицы, отфильтровать или преобразовать данные при переносе. Чтобы перенести базу данных целиком вместе с индексами, ключами, функциями и триггерами, используйте логическую репликацию или логический дамп.
Облако для Trino находится на стадии публичного тестирования (public preview) и доступно только в пуле ru-7 — подробнее в инструкции Доступность облака для Trino в локациях. Все ресурсы из этой инструкции создавайте в пуле ru-7.
Как устроена миграция
Кластер Trino и кластер облачных баз данных PostgreSQL находятся в одной приватной подсети:
- к целевой базе Trino подключается по приватной подсети;
- к исходной базе Trino подключается через интернет — для этого приватная подсеть подключена к облачному роутеру с доступом в интернет. Роутер выпускает трафик подсети в интернет через свой внешний IP-адрес;
- SQL-запросы вы отправляете в Trino со своего компьютера через внешний доступ к кластеру Trino.
Схема миграции: исходная база → облачный роутер → кластер Trino → кластер PostgreSQL.
Исходная и целевая базы подключаются к Trino как два каталога с коннектором PostgreSQL. В одном SQL-запросе можно читать данные из одного каталога и записывать их в другой.
Что нужно для миграции
- исходная база данных PostgreSQL, доступная из интернета по публичному IP-адресу или DNS-адресу;
- права на создание пользователей в исходной базе, доступ к файлам
pg_hba.confиpostgresql.confи к файрволу сервера; - компьютер с клиентом для подключения к Trino — Trino CLI или DBeaver;
- опционально: Python 3.9 или выше — если вы будете переносить данные с помощью скрипта.
В инструкции используются имена из примера — замените их на свои:
Шаги миграции
-
Настройте сеть.
-
Подготовьте исходную базу данных.
-
Создайте кластер облачной базы данных PostgreSQL.
-
Создайте кластер Trino с каталогами.
-
Подключитесь к кластеру Trino и проверьте каталоги.
-
Перенесите данные.
-
Проверьте результат.
1. Настроить сеть
Кластер Trino и кластер облачных баз данных создаются в одной приватной подсети. Чтобы Trino мог подключиться к исходной базе через интернет, подключите подсеть к облачному роутеру с доступом в интернет. Подробнее в подразделе Настроить доступ в интернет через облачный роутер.
-
Создайте приватную сеть:
1.1. В панели управления в верхнем меню нажмите Продукты и выберите Облачные серверы.
1.2. Перейдите в раздел Сеть → вкладка Приватные сети.
1.3. Нажмите Создать сеть.
1.4. Выберите локацию — пул ru-7.
1.5. Введите имя сети — trino-migration-net.
1.6. Введите CIDR подсети, например
192.168.0.0/24.1.7. Нажмите Создать.
-
Создайте облачный роутер с подключением к интернету:
2.1. В панели управления в верхнем меню нажмите Продукты и выберите Облачные серверы.
2.2 Перейдите в раздел Сеть → вкладка Облачные роутеры.
2.3. Нажмите Создать роутер.
2.4. Выберите локацию — пул ru-7.
2.5. Выберите тип роутера.
2.6. Введите имя роутера — trino-migration-router.
2.7. Отметьте чекбокс Подключить роутер к интернету — для роутера будет выделен внешний IP-адрес.
2.8. Нажмите Создать.
-
Подключите подсеть к облачному роутеру:
3.1. Откройте страницу роутера trino-migration-router.
3.2. Нажмите Подключить подсеть.
3.3. Выберите подсеть сети trino-migration-net.
3.4. Введите IP-адрес роутера — шлюз подсети, например
192.168.0.1. Если IP-адрес роутера совпадает со шлюзом подсети, устройства в подсети выходят в интернет без дополнительных маршрутов.3.5. Нажмите Подключить.
-
Скопируйте внешний IP-адрес роутера — он понадобится, чтобы разрешить подключение к исходной базе данных. Можно посмотреть на странице роутера.
2. Подготовить исходную базу данных
Trino подключается к исходной базе от имени отдельного пользователя с правами только на чтение — так миграция не изменит данные в исходной базе.
-
Подключитесь к исходной базе данных пользователем с правами на создание ролей.
-
Создайте пользователя и выдайте ему права на чтение:
CREATE USER trino_reader WITH PASSWORD '<password>';GRANT CONNECT ON DATABASE <source_database> TO trino_reader;GRANT USAGE ON SCHEMA public TO trino_reader;GRANT SELECT ON ALL TABLES IN SCHEMA public TO trino_reader;Укажите:
<password>— пароль пользователя;<source_database>— имя исходной базы данных.
Если вы переносите несколько схем, выдайте привилегии
USAGEиSELECTна каждую схему. -
Разрешите подключение с внешнего IP-адреса облачного роутера — добавьте в файл
pg_hba.confстроку:host <source_database> trino_reader <router_ip>/32 scram-sha-256Укажите:
<source_database>— имя исходной базы данных;<router_ip>— внешний IP-адрес облачного роутера, который вы скопировали на шаге 1.
Если на сервере используется метод аутентификации md5, укажите его вместо
scram-sha-256. -
Убедитесь, что PostgreSQL принимает подключения на внешнем интерфейсе: в файле
postgresql.confзначение параметраlisten_addressesдолжно содержать публичный IP-адрес сервера или '*'. Изменение параметраlisten_addressesприменяется только после перезапуска PostgreSQL. -
Примените изменения в файле
pg_hba.conf:SELECT pg_reload_conf(); -
В файрволе сервера или в группах безопасности облачного провайдера разрешите входящие подключения на порт PostgreSQL (по умолчанию — 5432) с внешнего IP-адреса облачного роутера.
3. Создать кластер облачной базы данных PostgreSQL
Целевая база — это кластер облачных баз данных PostgreSQL в той же приватной подсети, что и кластер Trino.
-
Создайте кластер PostgreSQL с именем pg-target. При создании кластера:
- выберите локацию — пул ru-7;
- выберите версию PostgreSQL не ниже версии исходной базы данных;
- в блоке Сеть выберите подсеть сети trino-migration-net;
- выберите конфигурацию нод с размером диска с запасом относительно объема переносимых данных.
-
Дождитесь, пока кластер будет создан.
-
Создайте пользователя trino_writer. Сохраните пароль — в панели управления он храниться не будет.
-
Создайте базу данных и выберите пользователя-владельца — trino_writer. Владелец базы данных может создавать в ней схемы и таблицы — это нужно Trino для записи данных. В PostgreSQL 15 и выше пользователь, который не является владельцем базы данных, по умолчанию получает только привилегию CONNECT.
-
Скопируйте DNS-адрес мастер-ноды. Можно посмотреть в панели управления: в верхнем меню нажмите Продукты → Облачные базы данных → вкладка Активные → страница кластера → вкладка Подключение → блок Адреса для подключения. Для DNS-адресов используется механизм master discovery — адрес привязан к роли ноды и не изменится, если мастером станет реплика.
Важно: Если у вас уже есть кластер облачных баз данных в другом регионе вы можете добавить публичный доступ и использовать временно его для миграции.
Для подключения Trino к кластеру используйте порт 5432 — прямое подключение к PostgreSQL. Порт 5433 ведет через пулер соединений: JDBC-драйвер, через который работает Trino, использует подготовленные выражения (prepared statements), а в режиме пулинга transaction они могут приводить к ошибкам.
4. Создать кластер Trino с каталогами
Для миграции нужны два каталога с коннектором PostgreSQL: pg_source — для исходной базы данных и pg_target — для целевой. Каталоги можно добавить при создании кластера или после создания.
-
В панели управления в верхнем меню нажмите Продукты и выберите Trino.
-
Нажмите Создать кластер.
-
Введите имя кластера — trino-migration.
-
Выберите локацию — пул ru-7. После создания кластера локацию изменить нельзя.
-
Выберите версию Trino. После создания кластера версию изменить нельзя.
-
В блоке Конфигурация выберите конфигурации координатора и воркеров и количество воркеров. Воркеры читают и записывают данные, поэтому для переноса больших таблиц выбирайте более производительные конфигурации. Подробнее в подразделе Конфигурация инструкции Создать кластер Trino.
-
В блоке Сеть:
7.1. В поле Подсеть выберите подсеть сети trino-migration-net — ту же, в которой находится кластер pg-target. После создания кластера подсеть изменить нельзя.
7.2. Отметьте чекбокс Внешний доступ к графическому интерфейсу, чтобы подключаться к Trino со своего компьютера через интернет.
-
В блоке Пароль администратора введите пароль или нажмите Сгенерировать. Скопируйте и сохраните пароль — его нельзя будет посмотреть в панели управления, но можно изменить.
-
В блоке Каталоги добавьте каталоги
pg_sourceиpg_target. Для каждого каталога:9.1. Нажмите Добавить.
9.2. Введите имя каталога. Имя может содержать только строчные латинские буквы, цифры и нижнее подчеркивание, не более 63 символов.
9.3. Выберите тип коннектора — PostgreSql.
9.4. Введите параметры подключения из таблицы ниже.
9.5. Нажмите Добавить.
-
Проверьте цену кластера.
-
Нажмите Создать кластер.
В SQL-запросах имя каталога — первая часть полного имени таблицы: <catalog>.<schema>.<table>.
5. Подключиться к кластеру Trino и проверить каталоги
К кластеру Trino подключается пользователь admin с паролем администратора, который вы задали при создании кластера. Подробнее о способах подключения в инструкции Подключиться к кластеру Trino.
Через Trino CLI
-
Откройте CLI.
-
Подключитесь к кластеру:
./trino --server https://<trino_address> --user admin --passwordУкажите
<trino_address>— адрес кластера Trino для подключения из интернета. Можно посмотреть в панели управления: в верхнем меню нажмите Продукты → Trino → страница кластера → вкладка Подключение. -
Введите пароль администратора.
Через DBeaver
-
Откройте DBeaver.
-
В верхнем меню нажмите База данных → Новое соединение.
-
Выберите Trino и нажмите Далее.
-
В поле Хост введите
<trino_address>без https:// — адрес кластера Trino для подключения из интернета. -
В поле Порт введите
443. -
Введите имя пользователя — admin и пароль администратора.
-
Откройте вкладку Свойства драйвера и для свойства SSL укажите значение true.
-
Нажмите Тест соединения, затем Готово.
Проверьте каталоги
Выполните запросы в Trino CLI или в редакторе SQL DBeaver:
SHOW CATALOGS;
SHOW SCHEMAS FROM pg_source;
SHOW TABLES FROM pg_source.public;
SHOW SCHEMAS FROM pg_target;
В списке каталогов должны быть pg_source и pg_target, а в схеме pg_source.public — таблицы исходной базы данных.
Если запрос к каталогу pg_source завершается ошибкой подключения, проверьте, что подсеть кластера подключена к облачному роутеру, а внешний IP-адрес роутера разрешен в файле pg_hba.conf и в файрволе сервера исходной базы данных.
6. Перенести данные
Опционально: настройте сопоставление типов данных.
По умолчанию коннектор PostgreSQL пропускает столбцы-массивы и столбцы с неподдерживаемыми типами данных — они не попадут в целевую таблицу. Если в исходных таблицах есть такие столбцы, перед переносом выполните в той же сессии:
SET SESSION pg_source.array_mapping = 'AS_ARRAY';
SET SESSION pg_source.unsupported_type_handling = 'CONVERT_TO_VARCHAR';
Значение AS_ARRAY переносит массивы фиксированной размерности, для массивов произвольной размерности используйте значение AS_JSON. Значение CONVERT_TO_VARCHAR переносит столбцы с неподдерживаемыми типами как текст. Подробнее в разделе Type mapping документации Trino.
Вариант 1. SQL-запросы
-
Если вы переносите схему, отличную от public, создайте ее в целевой базе данных:
CREATE SCHEMA IF NOT EXISTS pg_target.<schema>;Укажите
<schema>— имя схемы. -
Перенесите таблицу:
CREATE TABLE pg_target.public.users ASSELECT * FROM pg_source.public.users;Trino создаст таблицу в целевой базе данных и вернет количество записанных строк. Повторите запрос для каждой таблицы.
-
Опционально: чтобы перенести часть данных или изменить их при переносе, добавьте в запрос фильтры и выражения. Например:
CREATE TABLE pg_target.public.users_2025 ASSELECT id, lower(email) AS email, created_atFROM pg_source.public.usersWHERE created_at >= TIMESTAMP '2025-01-01 00:00:00'; -
Опционально: чтобы догрузить строки, которые появились в исходной базе после переноса, используйте INSERT:
INSERT INTO pg_target.public.usersSELECT * FROM pg_source.public.usersWHERE id > (SELECT coalesce(max(id), 0) FROM pg_target.public.users);Запрос подходит для таблиц, в которые строки только добавляются с возрастающим id. Изменения и удаления строк в исходной базе данных так не переносятся.
7. Проверить результат
-
Проверьте, что таблицы появились в целевой базе данных:
SHOW TABLES FROM pg_target.public; -
Сравните количество строк в исходной и целевой таблицах:
SELECT(SELECT count(*) FROM pg_source.public.users) AS source_rows,(SELECT count(*) FROM pg_target.public.users) AS target_rows; -
Сравните столбцы: выполните запрос SHOW COLUMNS FROM pg_target.public.users; и сверьте результат со структурой таблицы в исходной базе данных — например, с выводом команды \d public.users в psql. Сравнивайте со структурой в исходной базе данных напрямую: столбцы, которые Trino пропустил, не видны и в каталоге pg_source.
-
Опционально: найдите строки исходной таблицы, которых нет в целевой:
SELECT * FROM pg_source.public.usersEXCEPTSELECT * FROM pg_target.public.users;Пустой результат означает, что все строки перенесены. На больших таблицах запрос создает заметную нагрузку на обе базы данных. Столбцы типа json в EXCEPT сравнить нельзя — перечислите столбцы явно или ограничьтесь сравнением количества строк.
Ограничения
Trino переносит данные, но не объекты базы данных. Запрос CREATE TABLE ... AS SELECT создает таблицу только со столбцами и строками — без первичных и внешних ключей, индексов, ограничений, значений по умолчанию, последовательностей, триггеров и функций.
-
ключи и индексы. Создайте их после переноса нативными запросами PostgreSQL через процедуру system.execute:
CALL pg_target.system.execute(query => 'ALTER TABLE public.users ADD PRIMARY KEY (id)');Также можно заранее создать структуру таблиц в целевой базе данных из вывода pg_dump --schema-only и переносить данные запросом INSERT INTO ... SELECT вместо CREATE TABLE ... AS SELECT;
-
последовательности. Столбец типа serial переносится как integer без значения по умолчанию. Если приложение добавляет строки без id, создайте последовательность и установите ее значение больше максимального id;
-
типы данных. Типы столбцов в целевой базе данных могут отличаться от исходных: например, json записывается как jsonb. Массивы и неподдерживаемые типы по умолчанию пропускаются — как их перенести, см. шаг 6;
-
представления. Запрос SHOW TABLES показывает и таблицы, и представления. Из представления запрос CREATE TABLE ... AS SELECT создаст обычную таблицу с данными на момент переноса;
-
согласованность данных. Каждая таблица читается в свой момент времени. Чтобы данные в целевой базе были согласованы, остановите запись в исходную базу на время переноса или догрузите новые строки перед переключением приложения;
-
место на диске. При выполнении INSERT Trino сначала записывает данные во временную таблицу, а затем переносит их в целевую. На время загрузки на диске кластера pg-target нужен запас примерно на объем добавляемых данных;
-
большие таблицы. Коннектор PostgreSQL читает каждую таблицу одним запросом, поэтому скорость переноса одной большой таблицы ограничена каналом до исходной базы данных и производительностью баз данных. Разбейте большую таблицу на части по диапазонам ключа и выполните несколько запросов INSERT INTO ... SELECT ... WHERE id BETWEEN ... параллельно.
После миграции
-
Переключите приложение на кластер pg-target — подробнее в инструкции Подключиться к кластеру PostgreSQL. Для доступа к кластеру из интернета подключите публичный плавающий IP-адрес.
-
В исходной базе данных удалите пользователя
trino_readerи строку для него в файлеpg_hba.conf, закройте в файрволе доступ с IP-адреса облачного роутера. -
Если кластер Trino больше не нужен, удалите его или отключите внешний доступ. Если кластер остается для аналитики, удалите каталог pg_source.