Миграция из MySQL в Doris
В этом руководстве MySQL JDBC Catalog используется для копирования стабильного снимка данных во внутреннюю таблицу Doris. Этот подход подходит для разовой или периодической пакетной миграции и не переносит автоматически последующие обновления, удаления и операции DDL. Варианты непрерывной синхронизации с помощью CDC приведены ниже.
Предварительные требования
- База данных MySQL с именем
migration_sourceи учётная запись в исходной системе с правом SELECT для демонстрационной таблицы. - Сетевая доступность источника со всех узлов FE/BE Doris. Установите
mysql-connector-j-8.3.0.jarв соответствии с разделами MySQL Catalog и развёртывание драйвера. В примере используется имя файла драйвера, поэтому Jar должен находиться вjdbc_drivers_dirна всех узлах FE/BE. - Учётная запись Doris с правами на создание объектов Catalog, баз данных и таблиц, чтение внешней таблицы и загрузку данных в целевую таблицу. См. раздел авторизация.
- Выполняйте подготовку источника в
migration_source; используйте пустую целевую таблицу. Замените приведённые в примере хосты, имя пользователя и пароль своими значениями.
Базовое использование
1. Подготовьте исходную таблицу
Подготовьте этот пример в исходной базе данных, используя учётную запись с правами CREATE и INSERT. Для подключения через Catalog используется описанная выше учётная запись для чтения из источника.
CREATE TABLE migration_demo (
id BIGINT PRIMARY KEY,
amount DECIMAL(12,2),
note VARCHAR(100)
);
INSERT INTO migration_demo VALUES (1, 12.50, 'first'), (2, NULL, NULL);
Результат: создана таблица с 2 строками.
2. Создайте и проверьте Catalog в Doris
CREATE CATALOG migration_mysql PROPERTIES (
'type' = 'jdbc',
'user' = 'migration_reader',
'password' = '<source_password>',
'jdbc_url' = 'jdbc:mysql://mysql-host:3306/migration_source',
'driver_url' = 'mysql-connector-j-8.3.0.jar',
'driver_class' = 'com.mysql.cj.jdbc.Driver'
);
DESC migration_mysql.migration_source.migration_demo;
Схема внешней таблицы должна содержать id, amount и note. Прежде чем создавать целевую таблицу, проверьте фактические типы, полученные при сопоставлении.
3. Создайте целевую таблицу и скопируйте данные
CREATE DATABASE IF NOT EXISTS migration_target;
CREATE TABLE migration_target.mysql_demo (
id BIGINT NOT NULL,
amount DECIMAL(12,2),
note STRING
)
DUPLICATE KEY(id)
DISTRIBUTED BY HASH(id) BUCKETS 1
PROPERTIES ('replication_num' = '1');
INSERT INTO migration_target.mysql_demo (id, amount, note)
SELECT id, amount, note FROM migration_mysql.migration_source.migration_demo;
SELECT id, amount, note FROM migration_target.mysql_demo ORDER BY id;
+------+--------+-------+
| id | amount | note |
+------+--------+-------+
| 1 | 12.50 | first |
| 2 | NULL | NULL |
+------+--------+-------+
Одна реплика и один бакет позволяют использовать этот пример для локальной проверки. При выборе параметров производственных таблиц учитывайте доступные BE и требования к надёжности. Повторное выполнение INSERT добавляет дублирующиеся строки.
Параметры подключения
| Параметр | Тип | Обязательность / значение по умолчанию | Описание |
|---|---|---|---|
type | STRING | Обязательный, без значения по умолчанию | Используйте jdbc |
user / password | STRING | Обязательные, без значения по умолчанию | Учётные данные исходной базы данных |
jdbc_url | STRING | Обязательный, без значения по умолчанию | URL подключения JDBC к источнику, включая имя базы данных |
driver_url | STRING | Обязательный, без значения по умолчанию | Jar, доступный всем узлам FE/BE; в этом примере используется имя заранее установленного файла |
driver_class | STRING | Обязательный, без значения по умолчанию | Класс Java для выбранного драйвера |
Сведения о пулах соединений, сопоставлении имён и настройках расположения драйверов см. в полном справочнике JDBC.
Типы и различия между версиями
- Расширяйте типы беззнаковых целых чисел: например,
INT UNSIGNEDсопоставляется сBIGINT, аBIGINT UNSIGNEDсопоставляется сLARGEINT. Не копируйте без изменений их знаковые аналоги. - MySQL JDBC Catalog сопоставляет JSON с
STRING, без автоматического преобразования вVARIANT. ДляTIME,ENUMиSETследуйте правилам сопоставления Catalog; JDBC и CDC могут использовать разные правила. - Метаданные JDBC для
TINYINT(1)зависят от настроек драйвера. Проверяйте результатDESC; не считайте любой TINYINT типом Boolean. - В линейке 4.1, начиная с 4.1.5,
TIMESTAMPсопоставляется сTIMESTAMPTZ, а двоичные типы сопоставляются сVARBINARY;DATETIMEостаётся датой и временем без часового пояса. В более ранних версиях сопоставления и настройки отличаются. В Dev используется актуальное сопоставление. - Пакетный INSERT не копирует поведение первичного ключа, AUTO_INCREMENT, индексы и ограничения источника. Полные правила см. в справочнике по сопоставлению типов MySQL.
Непрерывная синхронизация
Используйте синхронизацию с помощью Flink CDC, если при миграции нужно перенести начальный снимок, а затем передавать последующие обновления и удаления. Выбирайте совместимые версии Flink, CDC и Doris Connector по справочнику коннектора, а не на основе отдельных требований к минимальной версии каждого компонента.
В Dev также доступен встроенный MySQL CDC. Этот способ с автоматическим созданием таблиц требует наличия первичных ключей в источнике и в настоящее время обеспечивает семантику at-least-once. Сведения о правах доступа к журналам, ресурсах репликации и мониторинге см. в этом справочнике; не применяйте к этому способу сопоставления типов JDBC, описанные на этой странице.
Проверка и ошибки
Для одного и того же снимка и диапазона с заданными границами выполните COUNT(*), COUNT(amount) и SUM(amount) для исходной таблицы migration_mysql.migration_source.migration_demo и целевой таблицы migration_target.mysql_demo. В этом примере должны получиться 2, 1 и 12.50 соответственно. Также сверьте конкретные значения в выборке, NULL, точность и часовые пояса. Полный порядок проверки и переключения на целевую систему см. в разделе Обзор миграции.
При ошибках подключения проверьте сетевую доступность источника со всех узлов FE/BE, файлы драйверов, права доступа к источнику и ограничения на расположение драйверов. Проверяйте результат DESC и явно преобразуйте несовместимые типы. После неудачного импорта определите, какие диапазоны уже записаны, прежде чем повторять попытку; не повторяйте вслепую весь INSERT.
Рекомендации
Проверьте среду с помощью этой небольшой таблицы, затем выполняйте миграцию больших объёмов данных пакетами по стабильным ключам или временным диапазонам. Для непрерывной репликации нужна целевая модель, которая поддерживает обновления, удаления и повторное применение данных; проектируйте таблицы снимков и постоянно обновляемые зеркала отдельно.