SELECT и INSERT к данным, которые хранятся на удалённом сервере MySQL.
Создание таблицы
- Имена столбцов должны совпадать с именами в исходной таблице MySQL, но можно использовать только часть этих столбцов и в любом порядке.
- Типы столбцов могут отличаться от типов в исходной таблице MySQL. ClickHouse пытается преобразовать значения в типы данных ClickHouse.
- Настройка external_table_functions_use_nulls определяет, как обрабатывать столбцы Nullable. Значение по умолчанию: 1. Если установлено значение 0, функция таблицы не создаёт столбцы типа Nullable и вместо NULL выполняет вставку значений по умолчанию. Это также применимо к значениям NULL внутри массивов.
host:port— адрес сервера MySQL.database— имя удалённой базы данных.table— имя удалённой таблицы или запрос, передаваемый в MySQL как есть (см. Передача запроса вместо имени таблицы).user— пользователь MySQL.password— пароль пользователя.replace_query— флаг, преобразующий запросыINSERT INTOвREPLACE INTO. Еслиreplace_query=1, запрос заменяется.on_duplicate_clause— выражениеON DUPLICATE KEY on_duplicate_clause, которое добавляется к запросуINSERT. Пример:INSERT INTO t (c1,c2) VALUES ('a', 2) ON DUPLICATE KEY UPDATE c2 = c2 + 1, гдеon_duplicate_clause— этоUPDATE c2 = c2 + 1. См. документацию MySQL, чтобы узнать, какиеon_duplicate_clauseможно использовать с секциейON DUPLICATE KEY. Чтобы указатьon_duplicate_clause, нужно передать0в параметрreplace_query. Если одновременно передатьreplace_query = 1иon_duplicate_clause, ClickHouse сгенерирует исключение.
host и port следует указывать отдельно. Этот подход рекомендуется для продакшн-среды.
Простые условия WHERE, такие как =, !=, >, >=, <, <=, выполняются на сервере MySQL.
Остальные условия и ограничение выборки LIMIT выполняются в ClickHouse только после завершения запроса к MySQL.
TLS/SSL
Учетные данные для зашифрованного соединения с MySQL передаются как ключи именованной коллекции (или как аргументы «ключ-значение»):
Значения — это содержимое соответствующих PEM-файлов, которое можно скопировать в именованную коллекцию или в запрос. Они маскируются в журналах и запросах
SHOW так же, как пароли.
Эти же учетные данные можно указать в виде путей к файлам на сервере — в ssl_ca, ssl_cert и ssl_key, — но только в именованной коллекции, определенной в файле конфигурации сервера; такое значение нельзя переопределить в запросе. Сервер открывает эти файлы со своими привилегиями, поэтому прием пути из SQL позволил бы любому пользователю, который может определить источник MySQL, исследовать локальную файловую систему и проходить аутентификацию с сертификатом и ключом, к которым у него нет прав на чтение.
Передача запроса вместо имени таблицы
Вместо имени таблицы аргументtable может представлять собой запрос SELECT, который передаётся в MySQL как есть. Структура таблицы определяется по результату запроса. Запрос можно записать либо как подзапрос, либо обернуть в функцию query:
INSERT в неё не допускается. Тот же синтаксис поддерживает табличная функция mysql.
Форма подзапроса
(SELECT ...) разбирается в ClickHouse и перед отправкой на сервер повторно сериализуется в диалекте MySQL (с экранированием идентификаторов обратными кавычками). Поэтому она должна быть корректным ClickHouse SQL. Чтобы передать синтаксис, специфичный для MySQL и не разбираемый ClickHouse, используйте форму query('...'), текст которой отправляется в MySQL дословно.Любые внешние WHERE, LIMIT, агрегация и т. д. из окружающего запроса к ClickHouse не проталкиваются в переданный запрос — они применяются в ClickHouse после получения полного результата запроса. Чтобы ограничить объём данных, читаемых из MySQL, поместите фильтр внутрь переданного запроса. При external_table_strict_query = 1 внешний фильтр по столбцам таблицы приводит к исключению вместо локального применения, поскольку его нельзя протолкнуть в переданный запрос. Проверка охватывает предикат верхнего уровня в WHERE и каждый конъюнкт AND верхнего уровня. PREWHERE по столбцам этой таблицы не относится к области действия этой настройки: данный движок таблицы не поддерживает PREWHERE, и такой запрос отклоняется с ошибкой ILLEGAL_PREWHERE независимо от настройки. Проверка выполняется только там, где фильтр в принципе может быть протолкнут: когда эта таблица является единственной таблицей запроса, с любой стороны INNER JOIN или на сохраняющей стороне внешнего JOIN (левая сторона LEFT JOIN, правая сторона RIGHT JOIN). На несохраняющей стороне LEFT/RIGHT JOIN и с любой стороны FULL JOIN ничего не проталкивается и ничего не проверяется, поэтому фильтр по столбцам этой таблицы применяется локально после JOIN даже в строгом режиме. Там, где проверка выполняется, предикат, ссылающийся на другие таблицы, соединённые в окружающем запросе, не проталкивается и исключается из проверки — как если он ссылается только на присоединённую сторону, так и если смешивает её с этой таблицей внутри одного выражения без AND (например, OR); такой предикат сохраняет обычную точку вычисления в ClickHouse (WHERE после JOIN, PREWHERE до него) и не отклоняется.|. Например:
Пример использования
Создайте таблицу в MySQL:Настройки
Настройки по умолчанию не очень эффективны, поскольку при них даже не переиспользуются соединения. Эти настройки позволяют увеличить число запросов, выполняемых сервером в секунду.connection_auto_close
Позволяет автоматически закрывать соединение после выполнения запроса, то есть отключать его повторное использование.
Возможные значения:
- 1 — автоматическое закрытие соединения разрешено, поэтому его повторное использование отключено
- 0 — автоматическое закрытие соединения не разрешено, поэтому его повторное использование включено
1.
connection_max_tries
Задаёт число повторных попыток в пуле с failover.
Возможные значения:
- Положительное целое число.
- 0 — Для пула с failover повторные попытки не выполняются.
3.
connection_pool_size
Размер пула соединений (если все соединения заняты, запрос будет ждать, пока одно из них не освободится).
Возможные значения:
- Положительное целое число.
16.
connection_wait_timeout
Тайм-аут (в секундах) ожидания свободного соединения (если уже имеется connection_pool_size активных соединений), 0 — не ждать.
Возможные значения:
- Положительное целое число.
5.
connect_timeout
Тайм-аут подключения (в секундах).
Возможные значения:
- Положительное целое число.
10.
read_write_timeout
Тайм-аут операций чтения/записи (в секундах).
Возможные значения:
- Положительное целое число.
300.
enable_compression
Включает сжатие для соединения по протоколу MySQL.
Значение по умолчанию: false.
Этот параметр применяется к:
- движку таблицы
MySQL; - движку базы данных
MySQL; - табличной функции
mysql; - именованным коллекциям, используемым в интеграциях MySQL.