Правлю ссылки.
7.8 KiB
toc_priority | toc_title |
---|---|
29 | MaterializeMySQL |
MaterializeMySQL
Создает базу данных ClickHouse со всеми таблицами, существующими в MySQL, и всеми данными в этих таблицах.
Сервер ClickHouse работает как реплика MySQL. Он читает файл binlog и выполняет DDL and DML-запросы.
Создание базы данных
CREATE DATABASE [IF NOT EXISTS] db_name [ON CLUSTER cluster]
ENGINE = MaterializeMySQL('host:port', ['database' | database], 'user', 'password') [SETTINGS ...]
Параметры движка
host:port
— адрес сервера MySQL.database
— имя базы данных на удалённом сервере.user
— пользователь MySQL.password
— пароль пользователя.
Виртуальные столбцы
При работе с движком баз данных MaterializeMySQL
таблицы семейства ReplacingMergeTree используются с виртуальными столбцами _sign
и _version
.
_version
— счетчик транзакций. Тип UInt64._sign
— метка удаления. Тип Int8. Возможные значения:1
— строка не удалена,-1
— строка удалена.
Поддержка типов данных
MySQL | ClickHouse |
---|---|
TINY | Int8 |
SHORT | Int16 |
INT24 | Int32 |
LONG | UInt32 |
LONGLONG | UInt64 |
FLOAT | Float32 |
DOUBLE | Float64 |
DECIMAL, NEWDECIMAL | Decimal |
DATE, NEWDATE | Date |
DATETIME, TIMESTAMP | DateTime |
DATETIME2, TIMESTAMP2 | DateTime64 |
STRING | String |
VARCHAR, VAR_STRING | String |
BLOB | String |
Другие типы не поддерживаются. Если таблица MySQL содержит столбец такого типа, ClickHouse выдаст исключение "необработанный тип данных" и остановит репликацию.
Тип Nullable поддерживается.
Особенности и рекомендации
DDL-запросы
DDL-запросы в MySQL конвертируются в соответствующие DDL-запросы в ClickHouse (ALTER, CREATE, DROP, RENAME). Если ClickHouse не может спарсить какой-либо DDL-запрос, то он игнорируется.
Репликация данных
Движок MaterializeMySQL не поддерживает прямые запросы INSERT
, DELETE
и UPDATE
. Однако они поддерживаются с точки зрения репликации данных:
-
Запрос
INSERT
в MySQL конвертируется вINSERT
с_sign=1
. -
Запрос
DELETE
в MySQL конвертируется вINSERT
с_sign=-1
. -
Запрос
UPDATE
в MySQL конвертируется вINSERT
с_sign=-1
иINSERT
с_sign=1
.
Выборка из таблиц движка MaterializeMySQL
Запрос SELECT
из таблиц движка MaterializeMySQL имеет некоторую специфику:
-
Если
_version
не указан в запросеSELECT
, то используется модификатор FINAL. Таким образом, выбираются только строки сMAX(_version)
. -
Если
_sign
не указан в запросеSELECT
, то по умолчанию используетсяWHERE _sign=1
. Таким образом, удаленные строки не включаются в результирующий набор.
Индекс конверсии
Секции PRIMARY KEY
и INDEX
в MySQL конвертируются в кортежи ORDER BY
в таблицах ClickHouse.
ClickHouse имеет только один физический порядок, который определяется секцией ORDER BY
. Чтобы создать новый физический порядок, используйте материализованные представления.
Примечание
- Строки с
_sign=-1
физически не удаляются из таблиц. - Каскадные запросы
UPDATE/DELETE
не поддерживаются движкомMaterializeMySQL
. - Репликация может быть легко нарушена.
- Операции вручную с базами данных и таблицами запрещены.
Примеры использования
Запросы в MySQL:
mysql> CREATE DATABASE db;
mysql> CREATE TABLE db.test (a INT PRIMARY KEY, b INT);
mysql> INSERT INTO db.test VALUES (1, 11), (2, 22);
mysql> DELETE FROM db.test WHERE a=1;
mysql> ALTER TABLE db.test ADD COLUMN c VARCHAR(16);
mysql> UPDATE db.test SET c='Wow!', b=222;
mysql> SELECT * FROM test;
+---+------+------+
| a | b | c |
+---+------+------+
| 2 | 222 | Wow! |
+---+------+------+
База данных в ClickHouse, обмен данными с сервером MySQL:
База данных и созданная таблица:
CREATE DATABASE mysql ENGINE = MaterializeMySQL('localhost:3306', 'db', 'user', '***');
SHOW TABLES FROM mysql;
┌─name─┐
│ test │
└──────┘
После вставки данных:
SELECT * FROM mysql.test;
┌─a─┬──b─┐
│ 1 │ 11 │
│ 2 │ 22 │
└───┴────┘
После удаления данных, добавления столбца и обновления:
SELECT * FROM mysql.test;
┌─a─┬───b─┬─c────┐
│ 2 │ 222 │ Wow! │
└───┴─────┴──────┘