8.6 KiB
toc_priority: 29 toc_title: MaterializedMySQL
MaterializedMySQL
Создает базу данных ClickHouse со всеми таблицами, существующими в MySQL, и всеми данными в этих таблицах.
Сервер ClickHouse работает как реплика MySQL. Он читает файл binlog и выполняет DDL and DML-запросы.
MaterializedMySQL
— экспериментальный движок баз данных.
Создание базы данных
CREATE DATABASE [IF NOT EXISTS] db_name [ON CLUSTER cluster]
ENGINE = MaterializedMySQL('host:port', ['database' | database], 'user', 'password') [SETTINGS ...]
Параметры движка
host:port
— адрес сервера MySQL.database
— имя базы данных на удалённом сервере.user
— пользователь MySQL.password
— пароль пользователя.
Виртуальные столбцы
При работе с движком баз данных MaterializedMySQL
используются таблицы семейства 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 |
ENUM | Enum |
STRING | String |
VARCHAR, VAR_STRING | String |
BLOB | String |
Другие типы не поддерживаются. Если таблица MySQL содержит столбец другого типа, ClickHouse выдаст исключение "Неподдерживаемый тип данных" ("Unhandled data type") и остановит репликацию.
Тип Nullable поддерживается.
Особенности и рекомендации
DDL-запросы
DDL-запросы в MySQL конвертируются в соответствующие DDL-запросы в ClickHouse (ALTER, CREATE, DROP, RENAME). Если ClickHouse не может конвертировать какой-либо DDL-запрос, он его игнорирует.
Репликация данных
Данные являются неизменяемыми со стороны пользователя ClickHouse, но автоматически обновляются путём репликации следующих запросов из MySQL:
-
Запрос
INSERT
конвертируется в ClickHouse вINSERT
с_sign=1
. -
Запрос
DELETE
конвертируется в ClickHouse вINSERT
с_sign=-1
. -
Запрос
UPDATE
конвертируется в ClickHouse вINSERT
с_sign=-1
иINSERT
с_sign=1
.
Выборка из таблиц движка MaterializedMySQL
Запрос SELECT
из таблиц движка MaterializedMySQL
имеет некоторую специфику:
-
Если в запросе
SELECT
напрямую не указан столбец_version
, то используется модификатор FINAL. Таким образом, выбираются только строки сMAX(_version)
. -
Если в запросе
SELECT
напрямую не указан столбец_sign
, то по умолчанию используетсяWHERE _sign=1
. Таким образом, удаленные строки не включаются в результирующий набор. -
Результат включает комментарии к столбцам, если они существуют в таблицах базы данных MySQL.
Конвертация индексов
Секции PRIMARY KEY
и INDEX
в MySQL конвертируются в кортежи ORDER BY
в таблицах ClickHouse.
В таблицах ClickHouse данные физически хранятся в том порядке, который определяется секцией ORDER BY
. Чтобы физически перегруппировать данные, используйте материализованные представления.
Примечание
- Строки с
_sign=-1
физически не удаляются из таблиц. - Каскадные запросы
UPDATE/DELETE
не поддерживаются движкомMaterializedMySQL
. - Репликация может быть легко нарушена.
- Прямые операции изменения данных в таблицах и базах данных
MaterializedMySQL
запрещены. - На работу
MaterializedMySQL
влияет настройка optimize_on_insert. Когда таблица на MySQL сервере меняется, происходит слияние данных в соответсвующей таблице в базе данныхMaterializedMySQL
.
Примеры использования
Запросы в 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 = MaterializedMySQL('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! │
└───┴─────┴──────┘