Перенести данные из 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.
В инструкции используются имена из примера — замените их на свои:
Шаги миграции
-
Настройте сеть.
-
Подготовьте исходную базу данных.
-
Подготовьте целевой кластер MySQL.
-
Создайте кластер 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-адрес роутера — с него Trino будет подключаться к исходной базе и к кластеру в другом пуле. Можно посмотреть на странице роутера.
2. Подготовить исходную базу данных
Trino подключается к исходной базе от имени отдельного пользователя с правами только на чтение — так миграция не изменит данные в источнике.
-
Подключитесь к исходной базе данных пользователем с правами на создание пользователей.
-
Создайте пользователя, которому разрешено подключаться только с внешнего 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 на каждую.
-
Убедитесь, что MySQL принимает подключения на внешнем интерфейсе: в конфигурации сервера параметр
bind_addressдолжен содержать публичный IP-адрес сервера или0.0.0.0. Изменение параметра применяется только после перезапуска MySQL. -
В файрволе сервера или в группах безопасности облачного провайдера разрешите входящие подключения на порт MySQL (по умолчанию — 3306) с внешнего IP-адреса облачного роутера.
Трафик между Trino и исходной базой идет через интернет. Рекомендуем включить на сервере TLS.
3. Подготовить целевой кластер MySQL
Создайте новый кластер в пуле ru-7 или используйте существующий кластер в другом пуле. Порт для подключения зависит от СУБД:
Вариант 1. Создать кластер в пуле ru-7
-
Создайте кластер MySQL semi-sync или MySQL sync с именем mysql-target. При создании кластера:
- выберите локацию — пул ru-7;
- выберите версию MySQL не ниже версии исходной базы данных;
- в блоке Сеть выберите подсеть сети trino-migration-net — в ней будет и кластер Trino;
- выберите конфигурацию нод с размером диска с запасом относительно объема переносимых данных.
-
Дождитесь, пока кластер будет создан.
-
Создайте базу данных shop: страница кластера → вкладка Базы данных → Создать базу данных.
-
Создайте пользователя trino_writer и сохраните его пароль — в панели управления он храниться не будет.
-
Выдайте пользователю trino_writer доступ к базе данных shop: страница кластера → вкладка Базы данных → страница базы данных → блок Имеют доступ → Добавить.
-
Скопируйте DNS-адрес мастер-ноды. Можно посмотреть в панели управления: в верхнем меню нажмите Продукты → Облачные базы данных → вкладка Активные → страница кластера → вкладка Подключение → блок Адреса для подключения. Для DNS-адресов используется механизм master discovery — адрес привязан к роли ноды и не изменится, если мастером станет реплика.
Вариант 2. Использовать существующий кластер в другом пуле
Кластер в другом пуле не может находиться в одной подсети с кластером Trino, поэтому Trino подключается к нему через интернет по публичному плавающему IP-адресу. Для публичных плавающих IP-адресов используется механизм master discovery: адрес переходит на новую ноду вместе с ролью мастера. Подробнее в инструкции Публичный плавающий IP-адрес в кластере MySQL semi-sync или MySQL sync.
-
Подключите публичный плавающий IP-адрес к ноде кластера:
1.1. В панели управления в верхнем меню нажмите Продукты и выберите Облачные базы данных.
1.2. Откройте вкладку Активные.
1.3. Откройте страницу кластера → вкладка Настройки.
1.4. В блоке Адреса и статусы нод в строке мастер-ноды нажмите Подключить публичный IP.
1.5. Если подсеть кластера соответствует требованиям, нажмите Подключить. Если не соответствует — выберите существующий облачный роутер или создайте новый и нажмите Подключить роутер и адрес.
-
Ограничьте доступ к кластеру: добавьте внешний IP-адрес роутера trino-migration-router в список разрешенных IP-адресов (страница кластера → вкладка Настройки → блок Управление сетевым доступом). Добавьте в список и адреса ваших приложений — подключения со всех остальных адресов будут запрещены.
-
Если в кластере нет базы данных и пользователя для переноса, создайте их, как в шагах 3–5 варианта 1.
-
Скопируйте публичный IP-адрес: страница кластера → вкладка Подключение → блок Адреса для подключения.
Если существующий кластер находится в пуле ru-7, но в другой приватной подсети, публичный IP-адрес не нужен: подключите подсеть кластера к роутеру trino-migration-router и используйте DNS-адрес мастер-ноды. Если исходная база — это тоже кластер облачных баз данных Selectel в другом пуле, подключите к нему публичный IP-адрес так же.
4. Создать кластер Trino с каталогами
Для миграции нужны два каталога с коннектором MySQL: mysql_source — для исходной базы данных и mysql_target — для целевой. Каталоги можно добавить при создании кластера или после создания.
-
В панели управления в верхнем меню нажмите Продукты и выберите Trino.
-
Нажмите Создать кластер.
-
Введите имя кластера — trino-migration.
-
Выберите локацию — пул ru-7. После создания кластера локацию изменить нельзя.
-
Выберите версию Trino. После создания кластера версию изменить нельзя.
-
В блоке Конфигурация выберите конфигурации координатора и воркеров и количество воркеров. Подробнее в подразделе Конфигурация инструкции Создать кластер Trino.
-
В блоке Сеть:
7.1. В поле Подсеть выберите подсеть сети trino-migration-net. После создания кластера подсеть изменить нельзя.
7.2. Отметьте чекбокс Внешний доступ к графическому интерфейсу, чтобы подключаться к Trino со своего компьютера через интернет.
-
В блоке Пароль администратора введите пароль или нажмите Сгенерировать. Скопируйте и сохраните пароль — его нельзя будет посмотреть в панели управления, но можно изменить.
-
В блоке Каталоги добавьте каталоги mysql_source и mysql_target. Для каждого каталога:
9.1. Нажмите Добавить.
9.2. Введите имя каталога. Имя может содержать только строчные латинские буквы, цифры и нижнее подчеркивание, не более 63 символов.
9.3. Выберите тип коннектора — MySql.
9.4. Введите параметры подключения из таблицы ниже.
9.5. Нажмите Добавить.
-
Проверьте цену кластера.
-
Нажмите Создать кластер.
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 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 — так не нужен отдельный доступ к кластеру.
-
Получите структуру таблицы: в клиенте
mysqlна исходной базе данных выполните запрос:SHOW CREATE TABLE shop.orders; -
Создайте таблицу в целевой базе — передайте результат предыдущего запроса в процедуру 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'' в примере. Если в таблицах есть внешние ключи, создавайте и заполняйте таблицы в порядке зависимостей: сначала таблицы, на которые ссылаются другие, затем ссылающиеся.
-
Отключите запись через временную таблицу:
SET SESSION mysql_target.non_transactional_insert = true;По умолчанию Trino сначала записывает данные во временную таблицу без первичного ключа и только потом переносит их в целевую. Для MySQL sync с репликами этот шаг обязателен — в таблицу без первичного ключа записать данные нельзя. Для MySQL semi-sync шаг ускоряет загрузку. При ошибке в целевой таблице останется часть строк — очистите ее запросом TRUNCATE TABLE mysql_target.shop.orders и повторите перенос.
-
Перенесите данные:
INSERT INTO mysql_target.shop.ordersSELECT * FROM mysql_source.shop.orders;Trino вернет количество записанных строк. Счетчик AUTO_INCREMENT в целевой таблице продолжится после максимального перенесенного значения. Повторите шаги 1, 2 и 4 для каждой таблицы.
7. Проверить результат
-
Сравните количество строк в исходной и целевой таблицах:
SELECT(SELECT count(*) FROM mysql_source.shop.orders) AS source_rows,(SELECT count(*) FROM mysql_target.shop.orders) AS target_rows; -
Сравните контрольные значения, например сумму и максимальный id:
SELECT 'source' AS side, sum(total), max(id) FROM mysql_source.shop.ordersUNION ALLSELECT 'target', sum(total), max(id) FROM mysql_target.shop.orders; -
Сравните столбцы: выполните запрос 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. Перед переносом критичных данных сделайте резервную копию исходной базы данных.
После миграции
-
Переключите приложение на целевой кластер — подробнее в инструкции Подключиться к кластеру MySQL semi-sync или MySQL sync.
-
В исходной базе данных удалите пользователя trino_reader запросом
DROP USER 'trino_reader'@'<router_ip>'и закройте в файрволе доступ с IP-адреса облачного роутера. -
Для варианта 2: если публичный IP-адрес больше не нужен, отключите его и удалите IP-адрес роутера Trino из списка разрешенных адресов.
-
Если кластер Trino больше не нужен, удалите его или отключите внешний доступ. Если кластер остается для аналитики, удалите каталог mysql_source.