ClickHouse/docs/ru/engines/database-engines/materialize-mysql.md
2021-02-06 13:01:52 +03:00

8.4 KiB
Raw Blame History

toc_priority toc_title
29 MaterializeMySQL

MaterializeMySQL

Создает базу данных ClickHouse со всеми таблицами, существующими в MySQL, и всеми данными в этих таблицах.

Сервер ClickHouse работает как реплика MySQL. Он читает файл binlog и выполняет DDL and DML-запросы.

MaterializeMySQL — экспериментальный движок баз данных.

Создание базы данных

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 выдаст исключение "Неподдерживаемый тип данных" ("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.

Выборка из таблиц движка MaterializeMySQL

Запрос SELECT из таблиц движка MaterializeMySQL имеет некоторую специфику:

  • Если в запросе SELECT напрямую не указан столбец _version, то используется модификатор FINAL. Таким образом, выбираются только строки с MAX(_version).

  • Если в запросе SELECT напрямую не указан столбец _sign, то по умолчанию используется WHERE _sign=1. Таким образом, удаленные строки не включаются в результирующий набор.

Конвертация индексов

Секции PRIMARY KEY и INDEX в MySQL конвертируются в кортежи ORDER BY в таблицах ClickHouse.

В таблицах ClickHouse данные физически хранятся в том порядке, который определяется секцией ORDER BY. Чтобы физически перегруппировать данные, используйте материализованные представления.

Примечание

  • Строки с _sign=-1 физически не удаляются из таблиц.
  • Каскадные запросы UPDATE/DELETE не поддерживаются движком MaterializeMySQL.
  • Репликация может быть легко нарушена.
  • Прямые операции изменения данных в таблицах и базах данных MaterializeMySQL запрещены.
  • На работу MaterializeMySQL влияет настройка optimize_on_insert. Когда таблица на MySQL сервере меняется, происходит слияние данных в соответсвующей таблице в базе данных 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! │ 
└───┴─────┴──────┘

Оригинальная статья