ClickHouse/docs/ru/engines/database-engines/materialize-mysql.md
Dmitriy dcf1c1a071 Update roadmap.md and materialize-mysql.md
Правлю ссылки.
2021-01-18 18:36:14 +03:00

7.8 KiB
Raw Blame History

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! │ 
└───┴─────┴──────┘

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