Перенести данные из MySQL в облачную базу данных MySQL с помощью Trino
Вы можете перенести таблицы из одной или нескольких баз данных MySQL в облачную базу данных MySQL semi-sync или MySQL sync с помощью облака для Trino. Такой способ подходит, если нужно перенести отдельные таблицы, отфильтровать или преобразовать данные при переносе.
Сервер с исходной базой данных и кластер MySQL с целевой базой данных подключаются к облаку для Trino как два каталога с помощью коннектора MySQL. Каждая база данных отображается в каталоге как схема. Trino читает данные из исходной базы данных и записывает их в целевую в одном SQL-запросе, без промежуточных файлов и выгрузок.
При переносе данных с помощью Trino действуют ограничения.
Ограничения
Перенести данные
- Подготовьте сервер с исходной базой данных MySQL.
- Подготовьте целевой кластер MySQL.
- Создайте кластер Trino с каталогами.
- Подключитесь к кластеру Trino.
- Проверьте каталоги.
- Перенесите данные с помощью Trino.
- Проверьте результат.
- Переключите сервисы.
1. Подготовить сервер с исходной базой данных MySQL
Чтобы защитить данные от изменения в исходной базе данных, Trino будет подключаться к ней от имени отдельного пользователя с правами только на чтение. Исходная база данных должна использовать MySQL 5.7 или выше.
-
Опционально: чтобы защитить данные, которые передаются через интернет, включите на исходном сервере TLS.
-
Подключитесь к исходной базе данных MySQL от имени пользователя, у которого есть права на создание пользователей.
-
Создайте нового пользователя и выдайте ему права только на чтение с помощью привилегии
SELECT:CREATE USER '<user_name>'@'%' IDENTIFIED BY '<password>';GRANT SELECT ON <source_database>.* TO '<user_name>'@'%';Укажите:
<user_name>— имя пользователя;<password>— пароль пользователя;<source_database>— имя базы данных, из которой нужно перенести данные.
Если вам нужно перенести данные из нескольких баз данных, выдайте привилегию
SELECTна каждую. -
Убедитесь, что MySQL принимает подключения на внешнем интерфейсе: в конфигурации сервера значение параметра
bind_addressдолжно содержать публичный IP-адрес сервера или0.0.0.0. Изменение параметра применяется только после перезапуска MySQL. -
Убедитесь, что сервер доступен из интернета по публичному IP-адресу или DNS-адресу.
-
Если на сервере используется фильтрация трафика, разрешите входящие подключения на порт MySQL (обычно — 3306) в файрволе или группах безопасности облачного провайдера.
2. Подготовить целевой кластер MySQL
Облако для Trino доступно только в пуле ru-7. Если вы хотите перенести данные из Trino в облачную базу данных MySQL через приватную подсеть, создайте кластер MySQL в пуле ru-7 и используйте одну подсеть для кластеров MySQL и Trino.
Если кластеры MySQL и Trino будут находиться в разных пулах, Trino сможет подключаться к MySQL только через интернет по публичному плавающему IP-адресу.
-
Создайте кластер MySQL semi-sync или MySQL sync. При создании кластера:
-
если хотите перенести данные через приватную подсеть, выберите локацию — пул ru-7;
-
выберите версию MySQL не ниже версии исходной базы данных;
-
выберите конфигурацию нод с размером диска, достаточным для объема переносимых данных.
-
-
Создайте базу данных, в которую нужно перенести данные.
-
Если нужно перенести данные из нескольких исходных баз данных, повторите шаг 2 для каждой.
-
Выдайте пользователю доступ к созданным базам данных.
-
Если хотите перенести данные через интернет, подключите публичный плавающий IP-адрес к ноде кластера. Для публичных плавающих IP-адресов используется механизм master discovery: адрес переходит на новую ноду вместе с ролью мастера.
3. Создать кластер Trino с каталогами
Используйте инструкцию Создать кластер Trino. При создании кластера:
-
в блоке Сеть:
-
если целевой кластер MySQL создан в пуле ru-7, выберите подсеть целевого кластера;
-
чтобы подключаться к Trino из интернета, отметьте чекбокс Внешний доступ к графическому интерфейсу;
-
-
в блоке Каталоги добавьте два каталога с типом коннектора MySql для исходной и целевой баз данных. При добавлении каталогов используйте параметры подключения:
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>.<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 — в таком случае не нужен отдельный доступ к кластеру.
-
Получите структуру исходной таблицы:
SHOW CREATE TABLE <source_database>.<source_table>;Укажите:
<source_database>— имя исходной базы данных;<source_table>— имя исходной таблицы.
Скопируйте результат запроса.
-
Создайте таблицу в целевой базе данных:
CALL <target_catalog>.system.execute(query => '<create_table_query>');Укажите:
<target_catalog>— имя каталога целевого кластера;<create_table_query>— структура исходной таблицы, которую вы получили и скопировали на шаге 1.
Если в структуре таблицы есть одинарные кавычки (например, в значениях
DEFAULT), измените их на двойные:''. Если в таблицах есть внешние ключи, создавайте и заполняйте таблицы в порядке зависимостей: сначала таблицы, на которые ссылаются другие, затем ссылающиеся. -
Если вы используете кластер MySQL sync с репликами, отключите запись через временную таблицу:
SET SESSION <target_catalog>.non_transactional_insert = true;Укажите
<target_catalog>— имя каталога целевого кластера.По умолчанию Trino сначала записывает данные во временную таблицу без первичного ключа и только потом переносит их в целевую. В кластере MySQL sync с репликами в таблицу без первичного ключа записать данные нельзя.
-
Опционально: если вы используете кластер MySQL semi-sync, чтобы ускорить перенос данных, отключите запись через временную таблицу:
SET SESSION <target_catalog>.non_transactional_insert = true;Укажите
<target_catalog>— имя каталога целевого кластера. -
Перенесите данные:
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.1. Очистите целевую таблицу:
TRUNCATE TABLE <target_catalog>.<target_database>.<target_table>;Укажите:
<target_catalog>— имя каталога целевого кластера;<target_database>— имя целевой базы данных;<target_table>— имя целевой таблицы.
6.2. Повторите шаг 5.
-
Повторите шаги 1–6 для каждой таблицы каждой базы данных.
7. Проверить результат
-
Сравните количество строк в исходной и целевой таблицах:
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>— имя целевой таблицы.
-
Сравните контрольные значения — например, сумму и максимальное значение числового столбца:
SELECT 'source' AS side, sum(<column>), max(<column>) FROM <source_catalog>.<source_database>.<source_table>UNION ALLSELECT '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>— имя целевой таблицы.
-
Выведите список столбцов целевой таблицы:
SHOW COLUMNS FROM <target_catalog>.<target_database>.<target_table>;Укажите:
<target_catalog>— имя каталога целевого кластера;<target_database>— имя целевой базы данных;<target_table>— имя целевой таблицы.
-
Сверьте столбцы целевой таблицы, которые вы получили на шаге 3, со структурой исходной таблицы, которую вы получили при переносе данных на шаге 1. Столбцы с типами данных, которые Trino не поддерживает, не видны в каталогах — сверьте их со структурой исходной таблицы напрямую.
8. Переключить сервисы
-
Переключите сервисы на целевой кластер — подробнее в инструкциях Подключиться к кластеру MySQL semi-sync или Подключиться к кластеру MySQL sync.
-
Если в целевом кластере MySQL вы подключали публичный плавающий IP-адрес и он больше не нужен, отключите его.
-
Если кластер Trino больше не нужен, удалите его.
-
Если сервер с исходной базой данных MySQL больше не нужен, удалите его.