Skip to main content

Перенести данные из MySQL в облачную базу данных MySQL с помощью Trino

Вы можете перенести таблицы из своей базы данных MySQL — на собственном сервере или в другом облаке — в облачную базу данных MySQL semi-sync или MySQL sync с помощью облака для Trino. Trino читает данные из исходной базы и записывает их в целевую SQL-запросом, без промежуточных дампов и файлов.

Способ подходит, если нужно перенести отдельные базы данных и таблицы, отфильтровать или преобразовать данные при переносе. Чтобы перенести базу данных целиком вместе с представлениями, процедурами и триггерами, используйте SQL-дамп.

Как устроена миграция

Целевой кластер MySQL можно создать рядом с Trino или использовать существующий кластер в другом пуле:

  • вариант 1 — новый кластер MySQL создается в пуле ru-7 в одной приватной подсети с кластером Trino. Trino подключается к нему по DNS-адресу мастер-ноды;
  • вариант 2 — существующий кластер MySQL находится в другом пуле. Trino подключается к нему через интернет по публичному плавающему IP-адресу.

В обоих вариантах к исходной базе Trino подключается через интернет. Для этого подсеть кластера Trino подключена к облачному роутеру с доступом в интернет — роутер выпускает трафик подсети в интернет через свой внешний IP-адрес. SQL-запросы вы отправляете в Trino со своего компьютера через внешний доступ к кластеру Trino.

Исходная и целевая базы подключаются к Trino как два каталога с коннектором MySQL. Каждая база данных MySQL отображается в каталоге как схема. В одном SQL-запросе можно читать данные из одного каталога и записывать их в другой.

Что нужно для миграции

  • исходная база данных MySQL 5.7 или выше, доступная из интернета по публичному IP-адресу или DNS-адресу;
  • права на создание пользователей в исходной базе данных и доступ к файрволу сервера;
  • консольный клиент mysql с доступом к исходной базе данных — чтобы получить структуру таблиц;
  • компьютер с клиентом для подключения к Trino — Trino CLI или DBeaver.

В инструкции используются имена из примера — замените их на свои:

РесурсИмя в примере
Приватная сеть trino-migration-net
Облачный роутер trino-migration-router
Кластер облачных баз данных MySQL mysql-target
Пользователь целевой базы данных trino_writer
Кластер Trino trino-migration
Каталог Trino для исходной базы данных mysql_source
Каталог Trino для целевой базы данных mysql_target
Пользователь исходной базы данных trino_reader
База данных и таблица для переноса shop.orders

Шаги миграции

  1. Настройте сеть.

  2. Подготовьте исходную базу данных.

  3. Подготовьте целевой кластер MySQL.

  4. Создайте кластер Trino с каталогами.

  5. Подключитесь к кластеру Trino и проверьте каталоги.

  6. Перенесите данные.

  7. Проверьте результат.

1. Настроить сеть

Кластер Trino подключается к приватной подсети. Чтобы Trino мог подключиться к исходной базе и к кластеру в другом пуле через интернет, подключите подсеть к облачному роутеру с доступом в интернет. Подробнее в подразделе Настроить доступ в интернет через облачный роутер.

  1. Создайте приватную сеть:

    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. Создайте облачный роутер с подключением к интернету:

    2.1. В панели управления в верхнем меню нажмите Продукты и выберите Облачные серверы.

    2.2. Перейдите в раздел Сеть → вкладка Облачные роутеры.

    2.3. Нажмите Создать роутер.

    2.4. Выберите локацию — пул ru-7.

    2.5. Выберите тип роутера.

    2.6. Введите имя роутера — trino-migration-router.

    2.7. Отметьте чекбокс Подключить роутер к интернету — для роутера будет выделен внешний IP-адрес.

    2.8. Нажмите Создать.

  3. Подключите подсеть к облачному роутеру:

    3.1. Откройте страницу роутера trino-migration-router.

    3.2. Нажмите Подключить подсеть.

    3.3. Выберите подсеть сети trino-migration-net.

    3.4. Введите IP-адрес роутера — шлюз подсети, например 192.168.0.1. Если IP-адрес роутера совпадает со шлюзом подсети, устройства в подсети выходят в интернет без дополнительных маршрутов.

    3.5. Нажмите Подключить.

  4. Скопируйте внешний IP-адрес роутера — с него Trino будет подключаться к исходной базе и к кластеру в другом пуле. Можно посмотреть на странице роутера.

2. Подготовить исходную базу данных

Trino подключается к исходной базе от имени отдельного пользователя с правами только на чтение — так миграция не изменит данные в источнике.

  1. Подключитесь к исходной базе данных пользователем с правами на создание пользователей.

  2. Создайте пользователя, которому разрешено подключаться только с внешнего IP-адреса облачного роутера, и выдайте ему права на чтение:

    CREATE USER 'trino_reader'@'<router_ip>' IDENTIFIED BY '<password>';
    GRANT SELECT ON shop.* TO 'trino_reader'@'<router_ip>';

    Укажите:

    • <router_ip> — внешний IP-адрес облачного роутера, который вы скопировали на шаге 1;
    • <password> — пароль пользователя.

    Если вы переносите несколько баз данных, выдайте привилегию SELECT на каждую.

  3. Убедитесь, что MySQL принимает подключения на внешнем интерфейсе: в конфигурации сервера параметр bind_address должен содержать публичный IP-адрес сервера или 0.0.0.0. Изменение параметра применяется только после перезапуска MySQL.

  4. В файрволе сервера или в группах безопасности облачного провайдера разрешите входящие подключения на порт MySQL (по умолчанию — 3306) с внешнего IP-адреса облачного роутера.

    Трафик между Trino и исходной базой идет через интернет. Рекомендуем включить на сервере TLS.

3. Подготовить целевой кластер MySQL

Создайте новый кластер в пуле ru-7 или используйте существующий кластер в другом пуле. Порт для подключения зависит от СУБД:

СУБДПортОсобенности
MySQL semi-sync 3306 Нет ограничений на структуру таблиц
MySQL sync 6033 — подключение через ProxySQL В кластере с репликами все таблицы должны иметь первичный ключ, иначе запись в них невозможна — см. Ограничения кластеров MySQL sync с репликами

Вариант 1. Создать кластер в пуле ru-7

  1. Создайте кластер MySQL semi-sync или MySQL sync с именем mysql-target. При создании кластера:

    • выберите локацию — пул ru-7;
    • выберите версию MySQL не ниже версии исходной базы данных;
    • в блоке Сеть выберите подсеть сети trino-migration-net — в ней будет и кластер Trino;
    • выберите конфигурацию нод с размером диска с запасом относительно объема переносимых данных.
  2. Дождитесь, пока кластер будет создан.

  3. Создайте базу данных shop: страница кластера → вкладка Базы данных → Создать базу данных.

  4. Создайте пользователя trino_writer и сохраните его пароль — в панели управления он храниться не будет.

  5. Выдайте пользователю trino_writer доступ к базе данных shop: страница кластера → вкладка Базы данных → страница базы данных → блок Имеют доступ → Добавить.

  6. Скопируйте DNS-адрес мастер-ноды. Можно посмотреть в панели управления: в верхнем меню нажмите Продукты → Облачные базы данных → вкладка Активные → страница кластера → вкладка Подключение → блок Адреса для подключения. Для DNS-адресов используется механизм master discovery — адрес привязан к роли ноды и не изменится, если мастером станет реплика.

Вариант 2. Использовать существующий кластер в другом пуле

Кластер в другом пуле не может находиться в одной подсети с кластером Trino, поэтому Trino подключается к нему через интернет по публичному плавающему IP-адресу. Для публичных плавающих IP-адресов используется механизм master discovery: адрес переходит на новую ноду вместе с ролью мастера. Подробнее в инструкции Публичный плавающий IP-адрес в кластере MySQL semi-sync или MySQL sync.

  1. Подключите публичный плавающий IP-адрес к ноде кластера:

    1.1. В панели управления в верхнем меню нажмите Продукты и выберите Облачные базы данных.

    1.2. Откройте вкладку Активные.

    1.3. Откройте страницу кластера → вкладка Настройки.

    1.4. В блоке Адреса и статусы нод в строке мастер-ноды нажмите Подключить публичный IP.

    1.5. Если подсеть кластера соответствует требованиям, нажмите Подключить. Если не соответствует — выберите существующий облачный роутер или создайте новый и нажмите Подключить роутер и адрес.

  2. Ограничьте доступ к кластеру: добавьте внешний IP-адрес роутера trino-migration-router в список разрешенных IP-адресов (страница кластера → вкладка Настройки → блок Управление сетевым доступом). Добавьте в список и адреса ваших приложений — подключения со всех остальных адресов будут запрещены.

  3. Если в кластере нет базы данных и пользователя для переноса, создайте их, как в шагах 3–5 варианта 1.

  4. Скопируйте публичный IP-адрес: страница кластера → вкладка Подключение → блок Адреса для подключения.

    Если существующий кластер находится в пуле ru-7, но в другой приватной подсети, публичный IP-адрес не нужен: подключите подсеть кластера к роутеру trino-migration-router и используйте DNS-адрес мастер-ноды. Если исходная база — это тоже кластер облачных баз данных Selectel в другом пуле, подключите к нему публичный IP-адрес так же.

4. Создать кластер Trino с каталогами

Для миграции нужны два каталога с коннектором MySQL: mysql_source — для исходной базы данных и mysql_target — для целевой. Каталоги можно добавить при создании кластера или после создания.

  1. В панели управления в верхнем меню нажмите Продукты и выберите Trino.

  2. Нажмите Создать кластер.

  3. Введите имя кластера — trino-migration.

  4. Выберите локацию — пул ru-7. После создания кластера локацию изменить нельзя.

  5. Выберите версию Trino. После создания кластера версию изменить нельзя.

  6. В блоке Конфигурация выберите конфигурации координатора и воркеров и количество воркеров. Подробнее в подразделе Конфигурация инструкции Создать кластер Trino.

  7. В блоке Сеть:

    7.1. В поле Подсеть выберите подсеть сети trino-migration-net. После создания кластера подсеть изменить нельзя.

    7.2. Отметьте чекбокс Внешний доступ к графическому интерфейсу, чтобы подключаться к Trino со своего компьютера через интернет.

  8. В блоке Пароль администратора введите пароль или нажмите Сгенерировать. Скопируйте и сохраните пароль — его нельзя будет посмотреть в панели управления, но можно изменить.

  9. В блоке Каталоги добавьте каталоги mysql_source и mysql_target. Для каждого каталога:

    9.1. Нажмите Добавить.

    9.2. Введите имя каталога. Имя может содержать только строчные латинские буквы, цифры и нижнее подчеркивание, не более 63 символов.

    9.3. Выберите тип коннектора — MySql.

    9.4. Введите параметры подключения из таблицы ниже.

    9.5. Нажмите Добавить.

  10. Проверьте цену кластера.

  11. Нажмите Создать кластер.

ПараметрКаталог mysql_sourceКаталог mysql_target
DNS-адрес или IP-адреспубличный адрес исходной базы данныхвариант 1 — DNS-адрес мастер-ноды кластера mysql-target; вариант 2 — публичный IP-адрес
Портпорт исходной базы данных, обычно 3306 3306 для MySQL semi-sync, 6033 для MySQL sync
Имя пользователя trino_reader trino_writer
Парольпароль пользователя trino_reader пароль пользователя trino_writer

5. Подключиться к кластеру Trino и проверить каталоги

К кластеру Trino подключается пользователь admin с паролем администратора, который вы задали при создании кластера. Подробнее о способах подключения в инструкции Подключиться к кластеру Trino.

Через Trino CLI

  1. Откройте CLI.

  2. Подключитесь к кластеру:

    ./trino --server https://<trino_address> --user admin --password

    Укажите <trino_address> — адрес кластера Trino для подключения из интернета. Можно посмотреть в панели управления: в верхнем меню нажмите Продукты → Trino → страница кластера → вкладка Подключение.

  3. Введите пароль администратора.

Через DBeaver

  1. Откройте DBeaver.

  2. В верхнем меню нажмите База данных → Новое соединение.

  3. Выберите Trino и нажмите Далее.

  4. В поле Хост введите <trino_address> без https:// — адрес кластера Trino для подключения из интернета.

  5. В поле Порт введите 443.

  6. Введите имя пользователя — admin и пароль администратора.

  7. Откройте вкладку Свойства драйвера и для свойства SSL укажите значение true.

  8. Нажмите Тест соединения, затем Готово.

Проверьте каталоги

Выполните запросы в Trino CLI или в редакторе SQL DBeaver:

SHOW CATALOGS;
SHOW SCHEMAS FROM mysql_source;
SHOW TABLES FROM mysql_source.shop;
SHOW SCHEMAS FROM mysql_target;

В списке каталогов должны быть mysql_source и mysql_target, в схеме mysql_source.shop — таблицы исходной базы данных, а в каталоге mysql_target — схема shop.

Если запрос к каталогу завершается ошибкой подключения, проверьте, что подсеть кластера Trino подключена к облачному роутеру, а внешний IP-адрес роутера разрешен у пользователя trino_reader, в файрволе исходного сервера и — для варианта 2 — в списке разрешенных IP-адресов целевого кластера.

6. Перенести данные

Запрос CREATE TABLE ... AS SELECT создает таблицу без первичного ключа, индексов и значений по умолчанию, а в кластере MySQL sync с репликами в такую таблицу нельзя записать данные. Поэтому сначала создайте в целевой базе таблицы с той же структурой, что в источнике, а затем перенесите в них данные. Нативные запросы MySQL к целевой базе выполняйте через процедуру system.execute — так не нужен отдельный доступ к кластеру.

  1. Получите структуру таблицы: в клиенте mysql на исходной базе данных выполните запрос:

    SHOW CREATE TABLE shop.orders;
  2. Создайте таблицу в целевой базе — передайте результат предыдущего запроса в процедуру system.execute:

    CALL mysql_target.system.execute(query => '
    CREATE TABLE shop.orders (
    id bigint NOT NULL AUTO_INCREMENT,
    customer_id bigint NOT NULL,
    status varchar(32) NOT NULL DEFAULT ''new'',
    total decimal(12,2) NOT NULL,
    created_at datetime NOT NULL,
    PRIMARY KEY (id),
    KEY idx_customer (customer_id)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4
    ');

    Удвойте одинарные кавычки внутри структуры таблицы — как в значении DEFAULT ''new'' в примере. Если в таблицах есть внешние ключи, создавайте и заполняйте таблицы в порядке зависимостей: сначала таблицы, на которые ссылаются другие, затем ссылающиеся.

  3. Отключите запись через временную таблицу:

    SET SESSION mysql_target.non_transactional_insert = true;

    По умолчанию Trino сначала записывает данные во временную таблицу без первичного ключа и только потом переносит их в целевую. Для MySQL sync с репликами этот шаг обязателен — в таблицу без первичного ключа записать данные нельзя. Для MySQL semi-sync шаг ускоряет загрузку. При ошибке в целевой таблице останется часть строк — очистите ее запросом TRUNCATE TABLE mysql_target.shop.orders и повторите перенос.

  4. Перенесите данные:

    INSERT INTO mysql_target.shop.orders
    SELECT * FROM mysql_source.shop.orders;

    Trino вернет количество записанных строк. Счетчик AUTO_INCREMENT в целевой таблице продолжится после максимального перенесенного значения. Повторите шаги 1, 2 и 4 для каждой таблицы.

7. Проверить результат

  1. Сравните количество строк в исходной и целевой таблицах:

    SELECT
    (SELECT count(*) FROM mysql_source.shop.orders) AS source_rows,
    (SELECT count(*) FROM mysql_target.shop.orders) AS target_rows;
  2. Сравните контрольные значения, например сумму и максимальный id:

    SELECT 'source' AS side, sum(total), max(id) FROM mysql_source.shop.orders
    UNION ALL
    SELECT 'target', sum(total), max(id) FROM mysql_target.shop.orders;
  3. Сравните столбцы: выполните запрос SHOW COLUMNS FROM mysql_target.shop.orders; и сверьте результат со структурой таблицы в источнике. Столбцы с типами, которые Trino не поддерживает, не видны в каталогах — сверяйте с выводом SHOW CREATE TABLE в исходной базе.

Ограничения

Trino переносит данные, но не все объекты базы данных и настройки таблиц.

  • типы данных. Trino поддерживает основные типы MySQL: числа, DECIMAL, строковые и двоичные типы, ENUM, JSON, DATE, TIME, DATETIME и TIMESTAMP. Столбцы других типов — например, SET, YEAR и пространственных типов — Trino по умолчанию не видит, и SELECT * их не вернет. Если в таблице есть такие столбцы, перечислите в INSERT и SELECT только поддерживаемые столбцы — остальные получат значения по умолчанию. Подробнее в разделе Type mapping документации Trino. Чтобы перенести такие столбцы, используйте SQL-дамп;
  • часовые пояса. Trino передает в MySQL часовой пояс своей сессии. Если на исходном сервере не загружены таблицы часовых поясов, запросы к столбцам TIMESTAMP могут завершаться ошибкой Unknown or incorrect time zone. Загрузите таблицы часовых поясов на исходный сервер утилитой mysql_tzinfo_to_sql;
  • объекты базы данных. Trino переносит только данные таблиц. Представления, хранимые процедуры, функции, триггеры, события и пользователей создайте в целевом кластере вручную;
  • MySQL sync с репликами. Все таблицы должны иметь первичный ключ и подсистему хранения InnoDB. Изменять структуру больших таблиц после переноса рекомендуем утилитой pt-online-schema-change — подробнее в инструкции Изменение структуры таблиц;
  • согласованность данных. Каждая таблица читается в свой момент времени. Остановите запись в исходную базу на время переноса или догрузите новые строки перед переключением приложения;
  • количество подключений. В облачных базах данных MySQL количество подключений зависит от объема RAM нод — 50 подключений на 1 ГБ. При параллельном переносе нескольких таблиц учитывайте этот лимит;
  • перенос через интернет. В варианте 2 скорость переноса зависит от канала между пулами, а кластер доступен из интернета — ограничьте доступ списком разрешенных IP-адресов и отключите публичный IP-адрес после миграции, если он не нужен;
  • Public preview. Облако для Trino предоставляется без SLA. Перед переносом критичных данных сделайте резервную копию исходной базы данных.

После миграции

  1. Переключите приложение на целевой кластер — подробнее в инструкции Подключиться к кластеру MySQL semi-sync или MySQL sync.

  2. В исходной базе данных удалите пользователя trino_reader запросом DROP USER 'trino_reader'@'<router_ip>' и закройте в файрволе доступ с IP-адреса облачного роутера.

  3. Для варианта 2: если публичный IP-адрес больше не нужен, отключите его и удалите IP-адрес роутера Trino из списка разрешенных адресов.

  4. Если кластер Trino больше не нужен, удалите его или отключите внешний доступ. Если кластер остается для аналитики, удалите каталог mysql_source.