Позволяет выполнять запросы SELECT и INSERT к данным, хранящимся на удаленном сервере MySQL.
Синтаксис
mysql({host:port, database, table, user, password[, replace_query, on_duplicate_clause] | named_collection[, option=value [,..]]})Аргументы
| Аргумент | Описание |
|---|---|
host:port |
Адрес сервера MySQL. |
database |
Имя удалённой базы данных. |
table |
Имя удалённой таблицы или запрос, передаваемый в MySQL как есть (см. Передача запроса вместо имени таблицы). |
user |
Имя пользователя MySQL. |
password |
Пароль пользователя. |
replace_query |
Флаг, который преобразует запросы INSERT INTO в REPLACE INTO. Возможные значения:- 0 — запрос выполняется как INSERT INTO.- 1 — запрос выполняется как REPLACE INTO. |
on_duplicate_clause |
Выражение ON DUPLICATE KEY on_duplicate_clause, добавляемое к запросу INSERT. Можно указывать только вместе с replace_query = 0 (если одновременно передать replace_query = 1 и on_duplicate_clause, ClickHouse выдаст исключение).Пример: INSERT INTO t (c1,c2) VALUES ('a', 2) ON DUPLICATE KEY UPDATE c2 = c2 + 1;Здесь on_duplicate_clause — это UPDATE c2 = c2 + 1. Сведения о том, какие on_duplicate_clause можно использовать с секцией ON DUPLICATE KEY, см. в документации MySQL. |
Аргументы также можно передавать с помощью именованных коллекций. В этом случае host и port нужно указывать отдельно. Такой подход рекомендуется для продакшн-среды.
Простые секции WHERE, такие как =, !=, >, >=, <, <=, в настоящее время выполняются на сервере MySQL.
Остальные условия и ограничение выборки LIMIT выполняются в ClickHouse только после завершения запроса к MySQL.
TLS/SSL
Учётные данные для зашифрованного подключения к MySQL передаются как ключи именованной коллекции (или как аргументы типа ключ-значение):
| Параметр | Описание |
|---|---|
ssl_ca_pem |
Содержимое CA‑сертификата, по которому проверяется сертификат сервера MySQL. |
ssl_cert_pem |
Содержимое клиентского сертификата для аутентификации на основе сертификата. |
ssl_key_pem |
Содержимое закрытого ключа, соответствующего ssl_cert_pem. |
Значениями служит содержимое соответствующих PEM-файлов, которое можно скопировать в именованную коллекцию или запрос. Они маскируются в журналах и в запросах SHOW так же, как пароли.
Эти же учётные данные можно также указать как пути к файлам на сервере в ssl_ca, ssl_cert и ssl_key — но только в именованной коллекции, определённой в файле конфигурации сервера; такое значение нельзя переопределить в запросе. Сервер открывает эти файлы со своими привилегиями, поэтому приём пути из SQL позволил бы любому пользователю, способному определить источник MySQL, исследовать локальную файловую систему и проходить аутентификацию с сертификатом и ключом, к которым у него нет доступа на чтение.
Передача запроса вместо имени таблицы
Вместо имени таблицы в качестве третьего аргумента можно указать запрос SELECT, который передаётся в MySQL как есть. Структура результирующей таблицы определяется по результату запроса. Запрос можно записать либо как подзапрос, либо обернуть в функцию query:
SELECT * FROM mysql('localhost:3306', 'test', (SELECT a, b FROM t1 JOIN t2 USING (id) WHERE a > 0), 'user', 'password');
SELECT * FROM mysql('localhost:3306', 'test', query('SELECT a, b FROM t1 JOIN t2 USING (id) WHERE a > 0'), 'user', 'password');Это позволяет проталкивать JOIN, агрегации и любую другую обработку в MySQL. Такая таблица доступна только для чтения: INSERT в неё не поддерживается. Тот же синтаксис поддерживает движок таблицы MySQL.
Поддерживается несколько реплик, которые должны быть перечислены через |. Например:
SELECT name FROM mysql(`mysql{1|2|3}:3306`, 'mysql_database', 'mysql_table', 'user', 'password');или
SELECT name FROM mysql(`mysql1:3306|mysql2:3306|mysql3:3306`, 'mysql_database', 'mysql_table', 'user', 'password');Возвращаемое значение
Объект таблицы с теми же столбцами, что и исходная таблица MySQL.
Примеры
Таблица в MySQL:
mysql> CREATE TABLE `test`.`test` (
-> `int_id` INT NOT NULL AUTO_INCREMENT,
-> `float` FLOAT NOT NULL,
-> PRIMARY KEY (`int_id`));
mysql> INSERT INTO test (`int_id`, `float`) VALUES (1,2);
mysql> SELECT * FROM test;
+--------+-------+
| int_id | float |
+--------+-------+
| 1 | 2 |
+--------+-------+Выборка данных из ClickHouse:
SELECT * FROM mysql('localhost:3306', 'test', 'test', 'bayonet', '123');Или с помощью именованных коллекций:
CREATE NAMED COLLECTION creds AS
host = 'localhost',
port = 3306,
database = 'test',
user = 'bayonet',
password = '123';
SELECT * FROM mysql(creds, table='test');┌─int_id─┬─float─┐
│ 1 │ 2 │
└────────┴───────┘enable_compression
Включает сжатие для подключения по протоколу MySQL.
Значение по умолчанию: false.
Этот параметр применяется к:
- табличной функции
mysql; - движку таблицы
MySQL; - движку базы данных
MySQL; - именованным коллекциям, используемым в интеграциях MySQL.
Когда параметр включен, ClickHouse запрашивает сжатие для соединения.
Пример:
SELECT *
FROM mysql(
'mysql80:3306',
'clickhouse',
'test_table',
'root',
'password',
SETTINGS enable_compression = 1
);Замена и вставка данных:
INSERT INTO FUNCTION mysql('localhost:3306', 'test', 'test', 'bayonet', '123', 1) (int_id, float) VALUES (1, 3);
INSERT INTO TABLE FUNCTION mysql('localhost:3306', 'test', 'test', 'bayonet', '123', 0, 'UPDATE int_id = int_id + 1') (int_id, float) VALUES (1, 4);
SELECT * FROM mysql('localhost:3306', 'test', 'test', 'bayonet', '123');┌─int_id─┬─float─┐
│ 1 │ 3 │
│ 2 │ 4 │
└────────┴───────┘Копирование данных из таблицы MySQL в таблицу ClickHouse:
CREATE TABLE mysql_copy
(
`id` UInt64,
`datetime` DateTime('UTC'),
`description` String,
)
ENGINE = MergeTree
ORDER BY (id,datetime);
INSERT INTO mysql_copy
SELECT * FROM mysql('host:port', 'database', 'table', 'user', 'password');Или, если копируете только инкрементный батч из MySQL на основе текущего максимального значения id:
INSERT INTO mysql_copy
SELECT * FROM mysql('host:port', 'database', 'table', 'user', 'password')
WHERE id > (SELECT max(id) FROM mysql_copy);