---
title: 'Перенести данные из MySQL в облачную базу данных MySQL с помощью Trino'
sidebar_label: 'Перенести данные из MySQL в облачную базу данных MySQL с помощью Trino'
sidebar_position: 1
description: 'Как перенести данные из MySQL в облачную базу данных MySQL с помощью Trino'
---

import {CustomTable} from '@selectel/docux/components'

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

Вы можете перенести таблицы из своей базы данных MySQL — на собственном сервере или в другом облаке — в облачную базу данных [MySQL semi-sync](/managed-databases/mysql-semi-sync) или [MySQL sync](/managed-databases/mysql-sync) с помощью [облака для Trino](/cloud-for-trino/about/about-cloud-for-trino.mdx). Trino читает данные из исходной базы и записывает их в целевую SQL-запросом, без промежуточных дампов и файлов.

Способ подходит, если нужно перенести отдельные базы данных и таблицы, отфильтровать или преобразовать данные при переносе. Чтобы перенести базу данных целиком вместе с представлениями, процедурами и триггерами, используйте [SQL-дамп](/managed-databases/mysql-semi-sync/database-migration.mdx).

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

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

* вариант 1 — новый кластер MySQL создается в пуле ru-7 в одной приватной подсети с кластером Trino. Trino подключается к нему по DNS-адресу мастер-ноды;
* вариант 2 — существующий кластер MySQL находится в другом пуле. Trino подключается к нему через интернет по [публичному плавающему IP-адресу](/managed-databases/mysql-semi-sync/public-ip.mdx).

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

Исходная и целевая базы подключаются к Trino как два [каталога](/cloud-for-trino/manage/catalogs.mdx) с коннектором MySQL. Каждая база данных MySQL отображается в каталоге как схема. В одном SQL-запросе можно читать данные из одного каталога и записывать их в другой.

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

* исходная база данных MySQL 5.7 или выше, доступная из интернета по публичному IP-адресу или DNS-адресу;
* права на создание пользователей в исходной базе данных и доступ к файрволу сервера;
* консольный клиент `mysql` с доступом к исходной базе данных — чтобы получить структуру таблиц;
* компьютер с клиентом для подключения к Trino — [Trino CLI](https://trino.io/docs/current/client/cli.html) или [DBeaver](https://dbeaver.io/download/).

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

<CustomTable>
  <table>
    <thead>
      <tr>
        <th>Ресурс</th>
        <th>Имя в примере</th>
      </tr>
    </thead>

    <tbody>
      <tr>
        <td>Приватная сеть</td>
        <td>trino-migration-net</td>
      </tr>

      <tr>
        <td>Облачный роутер</td>
        <td>trino-migration-router</td>
      </tr>

      <tr>
        <td>Кластер облачных баз данных MySQL</td>
        <td>mysql-target</td>
      </tr>

      <tr>
        <td>Пользователь целевой базы данных</td>
        <td>trino_writer</td>
      </tr>

      <tr>
        <td>Кластер Trino</td>
        <td>trino-migration</td>
      </tr>

      <tr>
        <td>Каталог Trino для исходной базы данных</td>
        <td>mysql_source</td>
      </tr>

      <tr>
        <td>Каталог Trino для целевой базы данных</td>
        <td>mysql_target</td>
      </tr>

      <tr>
        <td>Пользователь исходной базы данных</td>
        <td>trino_reader</td>
      </tr>

      <tr>
        <td>База данных и таблица для переноса</td>
        <td>shop.orders</td>
      </tr>
    </tbody>
  </table>
</CustomTable>

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

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

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

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

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

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

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

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

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

Кластер Trino подключается к приватной подсети. Чтобы Trino мог подключиться к исходной базе и к кластеру в другом пуле через интернет, подключите подсеть к облачному роутеру с доступом в интернет. Подробнее в подразделе [Настроить доступ в интернет через облачный роутер](/cloud-servers/cloud-networks/configure-access-to-internet.mdx#internet-access-via-cloud-router).

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

   1.1. В [панели управления](https://my.selectel.ru/vpc/default/networks/) в верхнем меню нажмите **Продукты** и выберите **Облачные серверы**.

   1.2. Перейдите в раздел **Сеть** → вкладка **Приватные сети**.

   1.3. Нажмите **Создать сеть**.

   1.4. Выберите [локацию](/infrastructure/locations.mdx) — пул ru-7.

   1.5. Введите имя сети — trino-migration-net.

   1.6. Введите CIDR подсети, например `192.168.0.0/24`.

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

2. Создайте облачный роутер с подключением к интернету:

   2.1. В [панели управления](https://my.selectel.ru/vpc/default/routers/) в верхнем меню нажмите **Продукты** и выберите **Облачные серверы**.

   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-адрес роутера — [шлюз подсети](/cloud-servers/cloud-networks/private-networks-and-subnets.mdx#default-gateway), например `192.168.0.1`. Если IP-адрес роутера совпадает со шлюзом подсети, устройства в подсети выходят в интернет без дополнительных маршрутов.

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

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

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

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

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

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

   ```bash
   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 или используйте существующий кластер в другом пуле. Порт для подключения зависит от СУБД:

<CustomTable>
  <table>
    <tbody>
      <tr>
        <th>СУБД</th>
        <th>Порт</th>
        <th>Особенности</th>
      </tr>

      <tr>
        <td>MySQL semi-sync</td>
        <td> 3306 </td>
        <td>Нет ограничений на структуру таблиц</td>
      </tr>

      <tr>
        <td>MySQL sync</td>
        <td> 6033 — подключение через ProxySQL </td>
        <td>В кластере с репликами все таблицы должны иметь первичный ключ, иначе запись в них невозможна — см. <a href="/managed-databases/mysql-sync/limitations.mdx">Ограничения кластеров MySQL sync с репликами</a></td>
      </tr>
    </tbody>
  </table>
</CustomTable>

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

1. Создайте кластер [MySQL semi-sync](/managed-databases/mysql-semi-sync/create-cluster.mdx) или [MySQL sync](/managed-databases/mysql-sync/create-cluster.mdx) с именем mysql-target. При создании кластера:

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

2. Дождитесь, пока кластер будет создан.

3. [Создайте базу данных](/managed-databases/mysql-semi-sync/create-cluster.mdx) shop: страница кластера → вкладка **Базы данных** → **Создать базу данных**.

4. [Создайте пользователя](/managed-databases/mysql-semi-sync/manage-users.mdx) trino_writer и сохраните его пароль — в панели управления он храниться не будет.

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

6. Скопируйте DNS-адрес мастер-ноды. Можно посмотреть в [панели управления](https://my.selectel.ru/vpc/default/dbaas/): в верхнем меню нажмите **Продукты** → **Облачные базы данных** → вкладка **Активные** → страница кластера → вкладка **Подключение** → блок **Адреса для подключения**. Для DNS-адресов используется механизм master discovery — адрес привязан к роли ноды и не изменится, если мастером станет реплика.

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

Кластер в другом пуле не может находиться в одной подсети с кластером Trino, поэтому Trino подключается к нему через интернет по публичному плавающему IP-адресу. Для публичных плавающих IP-адресов используется механизм master discovery: адрес переходит на новую ноду вместе с ролью мастера. Подробнее в инструкции Публичный плавающий IP-адрес в кластере [MySQL semi-sync](/managed-databases/mysql-semi-sync/public-ip.mdx) или [MySQL sync](/managed-databases/mysql-sync/public-ip.mdx).

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

   1.1. В [панели управления](https://my.selectel.ru/vpc/default/dbaas/) в верхнем меню нажмите **Продукты** и выберите **Облачные базы данных**.

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

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

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

   1.5. Если подсеть кластера соответствует [требованиям](/managed-databases/mysql-semi-sync/public-ip.mdx#requirements), нажмите **Подключить**. Если не соответствует — выберите существующий облачный роутер или создайте новый и нажмите **Подключить роутер и адрес**.

2. Ограничьте доступ к кластеру: добавьте внешний IP-адрес роутера trino-migration-router в [список разрешенных IP-адресов](/managed-databases/mysql-semi-sync/network-access-control.mdx) (страница кластера → вкладка **Настройки** → блок **Управление сетевым доступом**). Добавьте в список и адреса ваших приложений — подключения со всех остальных адресов будут запрещены.

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

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

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

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

Для миграции нужны два [каталога](/cloud-for-trino/manage/catalogs.mdx) с коннектором MySQL: mysql_source — для исходной базы данных и mysql_target — для целевой. Каталоги можно добавить при создании кластера или [после создания](/cloud-for-trino/manage/catalogs.mdx#add-catalog-in-existing-cluster).

1. В [панели управления](https://my.selectel.ru/data-platform/default/trino/) в верхнем меню нажмите **Продукты** и выберите Trino.

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

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

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

5. Выберите [версию Trino](/cloud-for-trino/about/about-cloud-for-trino.mdx#versions). После создания кластера версию изменить нельзя.

6. В блоке **Конфигурация** выберите конфигурации координатора и воркеров и количество воркеров. Подробнее в подразделе [Конфигурация](/cloud-for-trino/create-cluster.mdx#configuration) инструкции Создать кластер Trino.

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

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

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

8. В блоке **Пароль администратора** введите пароль или нажмите **Сгенерировать**. Скопируйте и сохраните пароль — его нельзя будет посмотреть в панели управления, но можно [изменить](/cloud-for-trino/manage/change-administrator-password.mdx).

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

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

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

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

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

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

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

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

<CustomTable>
  <table>
    <tbody>
      <tr>
        <th>Параметр</th>
        <th>Каталог mysql_source</th>
        <th>Каталог mysql_target</th>
      </tr>

      <tr>
        <td>DNS-адрес или IP-адрес</td>
        <td>публичный адрес исходной базы данных</td>
        <td>вариант 1 — DNS-адрес мастер-ноды кластера mysql-target; вариант 2 — публичный IP-адрес</td>
      </tr>

      <tr>
        <td>Порт</td>
        <td>порт исходной базы данных, обычно 3306 </td>
        <td>3306 для MySQL semi-sync, 6033 для MySQL sync </td>
      </tr>

      <tr>
        <td>Имя пользователя</td>
        <td> trino_reader </td>
        <td> trino_writer </td>
      </tr>

      <tr>
        <td>Пароль</td>
        <td>пароль пользователя trino_reader </td>
        <td>пароль пользователя trino_writer </td>
      </tr>
    </tbody>
  </table>
</CustomTable>

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

К кластеру Trino подключается пользователь admin с паролем администратора, который вы задали при создании кластера. Подробнее о способах подключения в инструкции [Подключиться к кластеру Trino](/cloud-for-trino/manage/connect-to-cluster.mdx).

#### Через Trino CLI

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

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

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

   Укажите `<trino_address>` — адрес кластера Trino для подключения из интернета. Можно посмотреть в [панели управления](https://my.selectel.ru/data-platform/default/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:

```bash
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` на исходной базе данных выполните запрос:

   ```bash
   SHOW CREATE TABLE shop.orders;
   ```

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

   ```bash
   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. Отключите запись через временную таблицу:

   ```bash
   SET SESSION mysql_target.non_transactional_insert = true;
   ```

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

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

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

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

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

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

   ```bash
   SELECT
     (SELECT count(*) FROM mysql_source.shop.orders) AS source_rows,
     (SELECT count(*) FROM mysql_target.shop.orders) AS target_rows;
   ```

2. Сравните контрольные значения, например сумму и максимальный id:

   ```bash
   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](https://trino.io/docs/current/connector/mysql.html#type-mapping) документации Trino. Чтобы перенести такие столбцы, используйте [SQL-дамп](/managed-databases/mysql-semi-sync/database-migration.mdx);
* часовые пояса. Trino передает в MySQL часовой пояс своей сессии. Если на исходном сервере не загружены таблицы часовых поясов, запросы к столбцам TIMESTAMP могут завершаться ошибкой Unknown or incorrect time zone. Загрузите таблицы часовых поясов на исходный сервер утилитой `mysql_tzinfo_to_sql`;
* объекты базы данных. Trino переносит только данные таблиц. Представления, хранимые процедуры, функции, триггеры, события и пользователей создайте в целевом кластере вручную;
* MySQL sync с репликами. Все таблицы должны иметь первичный ключ и подсистему хранения InnoDB. Изменять структуру больших таблиц после переноса рекомендуем утилитой `pt-online-schema-change` — подробнее в инструкции [Изменение структуры таблиц](/managed-databases/mysql-sync/change-table-schema.mdx);
* согласованность данных. Каждая таблица читается в свой момент времени. Остановите запись в исходную базу на время переноса или догрузите новые строки перед переключением приложения;
* количество подключений. В облачных базах данных MySQL количество подключений зависит от объема RAM нод — 50 подключений на 1 ГБ. При параллельном переносе нескольких таблиц учитывайте этот лимит;
* перенос через интернет. В варианте 2 скорость переноса зависит от канала между пулами, а кластер доступен из интернета — ограничьте доступ списком разрешенных IP-адресов и отключите публичный IP-адрес после миграции, если он не нужен;
* Public preview. Облако для Trino предоставляется без SLA. Перед переносом критичных данных сделайте резервную копию исходной базы данных.

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

1. Переключите приложение на целевой кластер — подробнее в инструкции Подключиться к кластеру [MySQL semi-sync](/managed-databases/mysql-semi-sync/connect-to-cluster.mdx) или [MySQL sync](/managed-databases/mysql-sync/connect-to-cluster.mdx).

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

3. Для варианта 2: если публичный IP-адрес больше не нужен, [отключите его](/managed-databases/mysql-semi-sync/public-ip.mdx#disconnect-public-floating-ip) и удалите IP-адрес роутера Trino из списка разрешенных адресов.

4. Если кластер Trino больше не нужен, удалите его или [отключите внешний доступ](/cloud-for-trino/manage/connect-to-cluster.mdx#disable-external-access). Если кластер остается для аналитики, [удалите каталог](/cloud-for-trino/manage/catalogs.mdx#delete-catalog) mysql_source.
