Перейти к основному содержимому

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

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

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

При переносе данных с помощью Trino действуют ограничения.

Ограничения

Гарантия переноса данных

Облако для Trino находится на стадии публичного тестирования (public preview):

  • продукт предоставляется без SLA;
  • доступность сервисов не гарантируется;
  • возможны сбои в работе продукта.

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

Типы данных

Trino поддерживает основные типы данных MySQL: числа, DECIMAL, строковые и двоичные типы, ENUM, JSON, DATE, TIME, DATETIME и TIMESTAMP. Столбцы с другими типами данных (например, SET, YEAR и пространственными типами) Trino по умолчанию не поддерживает, и запрос SELECT * их не покажет. Если в таблице есть столбцы с неподдерживаемыми типами данных, перечислите в запросах INSERT и SELECT только поддерживаемые столбцы — остальные получат значения по умолчанию. Подробнее в разделе Type mapping документации Trino.

Если нужно перенести столбцы всех типов или базу данных целиком вместе с представлениями, процедурами и триггерами, используйте SQL-дамп. Подробнее в инструкциях Миграция баз данных MySQL в облачные базы данных MySQL semi-sync и Миграция баз данных MySQL в облачные базы данных MySQL sync

Часовые пояса

Trino передает в MySQL часовой пояс своей сессии. Если на исходном сервере не загружены таблицы часовых поясов, запросы к столбцам TIMESTAMP могут завершаться ошибкой Unknown or incorrect time zone. Загрузите таблицы часовых поясов на исходный сервер утилитой mysql_tzinfo_to_sql

Объекты базы данных

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

MySQL sync с репликами

Все таблицы должны иметь первичный ключ и подсистему хранения InnoDB. Изменять структуру больших таблиц после переноса рекомендуем утилитой pt-online-schema-change, подробнее в инструкции Изменение структуры таблиц

Согласованность данных

Каждая таблица читается в определенный момент времени. Если не остановить запись в исходной базе данных на время переноса, СУБД продолжит операции записи в таблицы, из-за чего часть данных окажется несогласованной. Остановите запись в исходной базе данных на время переноса данных или повторно перенесите изменившиеся данные перед переключением сервисов

Количество подключений

В облачных базах данных MySQL количество подключений зависит от объема RAM нод — 50 подключений на 1 ГБ. При параллельном переносе нескольких таблиц учитывайте этот лимит

Перенос данных через интернет

При переносе данных через интернет скорость переноса зависит от канала между пулами. Трафик при передаче данных шифруется, но публичный плавающий IP-адрес кластера MySQL доступен из интернета — при необходимости ограничьте доступ списком разрешенных IP-адресов и отключите публичный IP-адрес после переноса, если он не нужен.

Если вы хотите перенести данные из Trino в облачную базу данных MySQL через приватную подсеть, целевой кластер MySQL и кластер Trino должны находиться в одном пуле и одной приватной подсети

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

  1. Подготовьте сервер с исходной базой данных MySQL.
  2. Подготовьте целевой кластер MySQL.
  3. Создайте кластер Trino с каталогами.
  4. Подключитесь к кластеру Trino.
  5. Проверьте каталоги.
  6. Перенесите данные с помощью Trino.
  7. Проверьте результат.
  8. Переключите сервисы.

1. Подготовить сервер с исходной базой данных MySQL

Чтобы защитить данные от изменения в исходной базе данных, Trino будет подключаться к ней от имени отдельного пользователя с правами только на чтение. Исходная база данных должна использовать MySQL 5.7 или выше.

  1. Опционально: чтобы защитить данные, которые передаются через интернет, включите на исходном сервере TLS.

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

  3. Создайте нового пользователя и выдайте ему права только на чтение с помощью привилегии SELECT:

    CREATE USER '<user_name>'@'%' IDENTIFIED BY '<password>';
    GRANT SELECT ON <source_database>.* TO '<user_name>'@'%';

    Укажите:

    • <user_name> — имя пользователя;
    • <password> — пароль пользователя;
    • <source_database> — имя базы данных, из которой нужно перенести данные.

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

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

  5. Убедитесь, что сервер доступен из интернета по публичному IP-адресу или DNS-адресу.

  6. Если на сервере используется фильтрация трафика, разрешите входящие подключения на порт MySQL (обычно — 3306) в файрволе или группах безопасности облачного провайдера.

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

к сведению

Облако для Trino доступно только в пуле ru-7. Если вы хотите перенести данные из Trino в облачную базу данных MySQL через приватную подсеть, создайте кластер MySQL в пуле ru-7 и используйте одну подсеть для кластеров MySQL и Trino.

Если кластеры MySQL и Trino будут находиться в разных пулах, Trino сможет подключаться к MySQL только через интернет по публичному плавающему IP-адресу.

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

    • если хотите перенести данные через приватную подсеть, выберите локацию — пул ru-7;

    • выберите версию MySQL не ниже версии исходной базы данных;

    • выберите конфигурацию нод с размером диска, достаточным для объема переносимых данных.

  2. Создайте базу данных, в которую нужно перенести данные.

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

  4. Создайте пользователя.

  5. Выдайте пользователю доступ к созданным базам данных.

  6. Если хотите перенести данные через интернет, подключите публичный плавающий IP-адрес к ноде кластера. Для публичных плавающих IP-адресов используется механизм master discovery: адрес переходит на новую ноду вместе с ролью мастера.

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

Используйте инструкцию Создать кластер Trino. При создании кластера:

  • в блоке Сеть:

    • если целевой кластер MySQL создан в пуле ru-7, выберите подсеть целевого кластера;

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

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

ПараметрКаталог сервера с исходной базой данныхКаталог целевого кластера
ХостПубличный IP-адрес или DNS-адрес сервера
  • если кластер MySQL в пуле ru-7 — DNS-адрес мастер-ноды кластера, можно скопировать в панели управления: в верхнем меню нажмите Продукты → Облачные базы данных → вкладка Активные → страница кластера → вкладка Подключение → блок Адреса для подключения → строка ноды → в столбце DNS-адрес нажмите . Адрес привязан к роли мастер-ноды и не изменится, если мастером станет реплика;

  • если кластер MySQL не в пуле ru-7 — публичный IP-адрес кластера, можно скопировать в панели управления: в верхнем меню нажмите Продукты → Облачные базы данных → вкладка Активные → страница кластера → вкладка Подключение → блок Адреса для подключения → строка ноды → в столбце IP-адрес нажмите рядом с публичным IP-адресом

ПортПорт исходной базы данных, обычно 3306
  • 3306 — для MySQL semi-sync;
  • 6033 — для MySQL sync (подключение через ProxySQL)
Имя пользователяИмя пользователя, которого вы создали при подготовке сервера с исходной базой данных MySQL на шаге 2Имя пользователя, которого вы создали при подготовке целевого кластера MySQL на шаге 4
ПарольПароль пользователя, которого вы создали при подготовке сервера с исходной базой данных MySQL на шаге 2

Пароль пользователя, которого вы создали при подготовке целевого кластера MySQL на шаге 4. После создания кластера пароль нельзя посмотреть в панели управления, но можно изменить

4. Подключиться к кластеру Trino

Вы можете подключиться к кластеру через графический интерфейс Trino, консольный клиент Trino CLI и DBeaver.

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

  2. В карточке кластера в столбце GUI нажмите .

  3. Введите логин — admin.

  4. Введите пароль администратора — задается при создании кластера. После создания кластера пароль нельзя посмотреть в панели управления, но можно изменить.

  5. Нажмите Log In.

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

Выведите список каталогов, схем и таблиц исходной базы данных и схем целевой базы данных:

SHOW CATALOGS;
SHOW SCHEMAS FROM <source_catalog>;
SHOW TABLES FROM <source_catalog>.<source_database>;
SHOW SCHEMAS FROM <target_catalog>;

Укажите:

  • <source_catalog> — имя каталога сервера с исходной базой данных;
  • <source_database> — имя исходной базы данных;
  • <target_catalog> — имя каталога целевого кластера.

В списке каталогов должны быть оба созданных каталога, в схеме <source_catalog>.<source_database> — таблицы исходной базы данных, а в каталоге <target_catalog> — схема целевой базы данных.

6. Перенести данные с помощью Trino

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

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

    SHOW CREATE TABLE <source_database>.<source_table>;

    Укажите:

    • <source_database> — имя исходной базы данных;
    • <source_table> — имя исходной таблицы.

    Скопируйте результат запроса.

  2. Создайте таблицу в целевой базе данных:

    CALL <target_catalog>.system.execute(query => '
    <create_table_query>
    ');

    Укажите:

    • <target_catalog> — имя каталога целевого кластера;
    • <create_table_query> — структура исходной таблицы, которую вы получили и скопировали на шаге 1.

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

  3. Если вы используете кластер MySQL sync с репликами, отключите запись через временную таблицу:

    SET SESSION <target_catalog>.non_transactional_insert = true;

    Укажите <target_catalog> — имя каталога целевого кластера.

    По умолчанию Trino сначала записывает данные во временную таблицу без первичного ключа и только потом переносит их в целевую. В кластере MySQL sync с репликами в таблицу без первичного ключа записать данные нельзя.

  4. Опционально: если вы используете кластер MySQL semi-sync, чтобы ускорить перенос данных, отключите запись через временную таблицу:

    SET SESSION <target_catalog>.non_transactional_insert = true;

    Укажите <target_catalog> — имя каталога целевого кластера.

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

    INSERT INTO <target_catalog>.<target_database>.<target_table>
    SELECT * FROM <source_catalog>.<source_database>.<source_table>;

    Укажите:

    • <target_catalog> — имя каталога целевого кластера;
    • <target_database> — имя целевой базы данных;
    • <target_table> — имя целевой таблицы;
    • <source_catalog> — имя каталога сервера с исходной базой данных;
    • <source_database> — имя исходной базы данных;
    • <source_table> — имя исходной таблицы.

    В выводе появится количество записанных строк. Счетчик AUTO_INCREMENT в целевой таблице продолжится после максимального перенесенного значения.

  6. Если при записи данных в целевую таблицу возникла ошибка, в ней останется только часть строк. Чтобы заново перенести все данные:

    6.1. Очистите целевую таблицу:

    TRUNCATE TABLE <target_catalog>.<target_database>.<target_table>;

    Укажите:

    • <target_catalog> — имя каталога целевого кластера;
    • <target_database> — имя целевой базы данных;
    • <target_table> — имя целевой таблицы.

    6.2. Повторите шаг 5.

  7. Повторите шаги 1–6 для каждой таблицы каждой базы данных.

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

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

    SELECT
    (SELECT count(*) FROM <source_catalog>.<source_database>.<source_table>) AS source_rows,
    (SELECT count(*) FROM <target_catalog>.<target_database>.<target_table>) AS target_rows;

    Укажите:

    • <source_catalog> — имя каталога сервера с исходной базой данных;
    • <source_database> — имя исходной базы данных;
    • <source_table> — имя исходной таблицы;
    • <target_catalog> — имя каталога целевого кластера;
    • <target_database> — имя целевой базы данных;
    • <target_table> — имя целевой таблицы.
  2. Сравните контрольные значения — например, сумму и максимальное значение числового столбца:

    SELECT 'source' AS side, sum(<column>), max(<column>) FROM <source_catalog>.<source_database>.<source_table>
    UNION ALL
    SELECT 'target', sum(<column>), max(<column>) FROM <target_catalog>.<target_database>.<target_table>;

    Укажите:

    • <column> — числовой столбец, по которому сравниваются контрольные значения;
    • <source_catalog> — имя каталога сервера с исходной базой данных;
    • <source_database> — имя исходной базы данных;
    • <source_table> — имя исходной таблицы;
    • <target_catalog> — имя каталога целевого кластера;
    • <target_database> — имя целевой базы данных;
    • <target_table> — имя целевой таблицы.
  3. Выведите список столбцов целевой таблицы:

    SHOW COLUMNS FROM <target_catalog>.<target_database>.<target_table>;

    Укажите:

    • <target_catalog> — имя каталога целевого кластера;
    • <target_database> — имя целевой базы данных;
    • <target_table> — имя целевой таблицы.
  4. Сверьте столбцы целевой таблицы, которые вы получили на шаге 3, со структурой исходной таблицы, которую вы получили при переносе данных на шаге 1. Столбцы с типами данных, которые Trino не поддерживает, не видны в каталогах — сверьте их со структурой исходной таблицы напрямую.

8. Переключить сервисы

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

  2. Если в целевом кластере MySQL вы подключали публичный плавающий IP-адрес и он больше не нужен, отключите его.

  3. Если кластер Trino больше не нужен, удалите его.

  4. Если сервер с исходной базой данных MySQL больше не нужен, удалите его.