Перенести данные из PostgreSQL в облачную базу данных PostgreSQL с помощью Trino
Вы можете перенести таблицы из одной или нескольких баз данных PostgreSQL в облачную базу данных PostgreSQL с помощью облака для Trino. Такой способ подходит, если нужно перенести отдельные таблицы, отфильтровать или преобразовать данные при переносе.
Сервер с исходной базой данных и кластер PostgreSQL с целевой базой данных подключаются к облаку для Trino как два каталога с помощью коннектора PostgreSQL. Каталог PostgreSQL подключается к одной базе данных: если вы переносите несколько баз данных, нужно добавить по паре каталогов для каждой. Trino читает данные из исходной базы данных и записывает их в целевую в одном SQL-запросе, без промежуточных файлов и выгрузок.
При переносе данных с помощью Trino действуют ограничения.
Ограничения
Перенести данные
- Подготовьте сервер с исходной базой данных PostgreSQL.
- Подготовьте целевой кластер PostgreSQL.
- Создайте кластер Trino с каталогами.
- Подключитесь к кластеру Trino.
- Проверьте каталоги.
- Перенесите данные с помощью Trino.
- Проверьте результат.
- Переключите сервисы.
1. Подготовить сервер с исходной базой данных PostgreSQL
Чтобы защитить данные от изменения в исходной базе данных, Trino будет подключаться к ней от имени отдельного пользователя с правами только на чтение.
-
Подключитесь к исходной базе данных PostgreSQL от имени пользователя, у которого есть права на создание ролей.
-
Создайте нового пользователя и выдайте ему права только на чтение с помощью привилегии
SELECT:CREATE USER <user_name> WITH PASSWORD '<password>';GRANT CONNECT ON DATABASE <source_database> TO <user_name>;GRANT USAGE ON SCHEMA public TO <user_name>;GRANT SELECT ON ALL TABLES IN SCHEMA public TO <user_name>;Укажите:
<user_name>— имя пользователя;<password>— пароль пользователя;<source_database>— имя базы данных, из которой нужно перенести данные.
Если вы переносите несколько схем, выдайте привилегии
USAGEиSELECTна каждую схему. -
Разрешите подключения к исходной базе данных — добавьте в файл
pg_hba.confстроку:host <source_database> <user_name> 0.0.0.0/0 <authentication_method>Укажите:
<source_database>— имя базы данных, из которой нужно перенести данные;<user_name>— имя пользователя;<authentication_method>— метод аутентификации, который используется на сервере, обычноscram-sha-256. Если на сервере используетсяmd5, укажите его вместоscram-sha-256.
-
Убедитесь, что PostgreSQL принимает подключения на внешнем интерфейсе: в файле
postgresql.confзначение параметраlisten_addressesдолжно содержать публичный IP-адрес сервера или*. Изменение параметраlisten_addressesприменяется только после перезапуска PostgreSQL. -
Примените изменения в файле
pg_hba.conf:SELECT pg_reload_conf(); -
Убедитесь, что сервер доступен из интернета по публичному IP-адресу или DNS-адресу.
-
Если на сервере используется фильтрация трафика, разрешите входящие подключения на порт PostgreSQL (обычно — 5432) в файрволе или группах безопасности облачного провайдера.
2. Подготовить целевой кластер PostgreSQL
Облако для Trino доступно только в пуле ru-7. Если вы хотите перенести данные из Trino в облачную базу данных PostgreSQL через приватную подсеть, создайте кластер PostgreSQL в пуле ru-7 и используйте одну подсеть для кластеров PostgreSQL и Trino.
Если кластеры PostgreSQL и Trino будут находиться в разных пулах, Trino сможет подключаться к PostgreSQL только через интернет по публичному плавающему IP-адресу.
-
Создайте кластер PostgreSQL. При создании кластера:
-
если хотите перенести данные через приватную подсеть, выберите локацию — пул ru-7;
-
выберите версию PostgreSQL не ниже версии исходной базы данных;
-
выберите конфигурацию нод с размером диска, достаточным для объема переносимых данных.
-
-
Выдайте пользователю доступ к созданной базе данных в качестве владельца. Владелец базы данных может создавать в ней схемы и таблицы — это нужно Trino для записи данных.
-
Если хотите перенести данные через интернет, подключите публичный плавающий IP-адрес к кластеру.
3. Создать кластер Trino с каталогами
Каталог PostgreSQL подключается к одной базе данных: если вы переносите несколько баз данных, добавьте по паре каталогов для каждой.
Используйте инструкцию Создать кластер Trino. При создании кластера:
-
в блоке Сеть:
-
если целевой кластер PostgreSQL создан в пуле ru-7, выберите подсеть целевого кластера;
-
чтобы подключаться к Trino из интернета, отметьте чекбокс Внешний доступ к графическому интерфейсу;
-
-
в блоке Каталоги добавьте два каталога с типом коннектора PostgreSql для исходной и целевой баз данных. При добавлении каталогов используйте параметры подключения:
4. Подключиться к кластеру Trino
Вы можете подключиться к кластеру через графический интерфейс Trino, консольный клиент Trino CLI и DBeaver.
Графический интерфейс Trino
Trino CLI
DBeaver
-
В панели управления в верхнем меню нажмите Продукты и выберите Trino.
-
В карточке кластера в столбце GUI нажмите .
-
Введите логин —
admin. -
Введите пароль администратора — задается при создании кластера. После создания кластера пароль нельзя посмотреть в панели управления, но можно изменить.
-
Нажмите Log In.
5. Проверить каталоги
Выведите список каталогов, схем и таблиц исходной базы данных и схем целевой базы данных:
SHOW CATALOGS;
SHOW SCHEMAS FROM <source_catalog>;
SHOW TABLES FROM <source_catalog>.public;
SHOW SCHEMAS FROM <target_catalog>;
Укажите:
<source_catalog>— имя каталога сервера с исходной базой данных;<target_catalog>— имя каталога целевого кластера.
В списке каталогов должны быть оба созданных каталога, а в схеме <source_catalog>.public — таблицы исходной базы данных.
6. Перенести данные с помощью Trino
-
Опционально: чтобы перенести столбцы-массивы и столбцы с неподдерживаемыми типами данных, настройте сопоставление типов данных. По умолчанию коннектор PostgreSQL пропускает такие столбцы — они не попадут в целевую таблицу:
SET SESSION <source_catalog>.array_mapping = 'AS_ARRAY';SET SESSION <source_catalog>.unsupported_type_handling = 'CONVERT_TO_VARCHAR';Укажите
<source_catalog>— имя каталога сервера с исходной базой данных.Значение
AS_ARRAYпереносит массивы фиксированной размерности, для массивов произвольной размерности используйте значениеAS_JSON. ЗначениеCONVERT_TO_VARCHARпереносит столбцы с неподдерживаемыми типами как текст. Подробнее в разделе Type mapping документации Trino. -
Если вы переносите схему, отличную от public, создайте ее в целевой базе данных:
CREATE SCHEMA IF NOT EXISTS <target_catalog>.<schema>;Укажите:
<target_catalog>— имя каталога целевого кластера;<schema>— имя схемы.
-
Перенесите таблицу:
CREATE TABLE <target_catalog>.public.<target_table> ASSELECT * FROM <source_catalog>.public.<source_table>;Укажите:
<target_catalog>— имя каталога целевого кластера;<target_table>— имя целевой таблицы;<source_catalog>— имя каталога сервера с исходной базой данных;<source_table>— имя исходной таблицы.
Чтобы перенести часть данных или изменить их при переносе, добавьте в запрос фильтры и выражения — например, условие
WHEREпо дате или функциюlower(), которая приведет значения столбца к нижнему регистру.В выводе появится количество записанных строк.
-
Опционально: догрузите строки, которые появились в исходной базе данных после переноса:
INSERT INTO <target_catalog>.public.<target_table>SELECT * FROM <source_catalog>.public.<source_table>WHERE <column> > (SELECT coalesce(max(<column>), 0) FROM <target_catalog>.public.<target_table>);Укажите:
<target_catalog>— имя каталога целевого кластера;<target_table>— имя целевой таблицы;<source_catalog>— имя каталога сервера с исходной базой данных;<source_table>— имя исходной таблицы;<column>— столбец с возрастающим идентификатором строк.
Запрос подходит для таблиц, в которые строки добавляются только с возрастающим идентификатором. Изменения и удаления строк в исходной базе данных таким образом не перенести нельзя.
-
Повторите шаги 1–4 для каждой таблицы.
7. Проверить результат
-
Сравните количество строк в исходной и целевой таблицах:
SELECT(SELECT count(*) FROM <source_catalog>.public.<source_table>) AS source_rows,(SELECT count(*) FROM <target_catalog>.public.<target_table>) AS target_rows;Укажите:
<source_catalog>— имя каталога сервера с исходной базой данных;<source_table>— имя исходной таблицы;<target_catalog>— имя каталога целевого кластера;<target_table>— имя целевой таблицы.
-
Опционально: найдите строки исходной таблицы, которых нет в целевой:
SELECT * FROM <source_catalog>.public.<source_table>EXCEPTSELECT * FROM <target_catalog>.public.<target_table>;Укажите:
<source_catalog>— имя каталога сервера с исходной базой данных;<source_table>— имя исходной таблицы;<target_catalog>— имя каталога целевого кластера;<target_table>— имя целевой таблицы.
Пустой вывод означает, что все строки перенесены. На больших таблицах запрос создает значительную нагрузку на обе базы данных. Столбцы типа
jsonвEXCEPTсравнить нельзя — перечислите столбцы явно или ограничьтесь сравнением количества строк. -
Выведите список столбцов целевой таблицы:
SHOW COLUMNS FROM <target_catalog>.public.<target_table>;Укажите:
<target_catalog>— имя каталога целевого кластера;<target_table>— имя целевой таблицы.
-
Сверьте столбцы целевой таблицы, которые вы получили на шаге 3, со структурой исходной таблицы — например, с выводом команды
\d <source_table>вpsql, где<source_table>— имя исходной таблицы. Столбцы с типами данных, которые Trino пропускает, не видны в каталоге — сверьте их со структурой исходной таблицы напрямую.
8. Переключить сервисы
-
Переключите сервисы на целевой кластер — подробнее в инструкции Подключиться к кластеру PostgreSQL. Для доступа к кластеру из интернета подключите публичный плавающий IP-адрес.
-
Если в целевом кластере PostgreSQL вы подключали публичный плавающий IP-адрес и он больше не нужен, отключите его.
-
Если кластер Trino больше не нужен, удалите его.
-
Если сервер с исходной базой данных MySQL больше не нужен, удалите его.