ClickHouse можно легко интегрировать в инфраструктуру OLTP-баз данных разными способами. Один из них — передача данных между другими базами данных и ClickHouse с помощью SQL-дампов.
Создание SQL-дампов
Данные можно экспортировать в формате SQL с помощью SQLInsert. ClickHouse запишет данные в виде INSERT INTO <table name> VALUES(... и будет использовать параметр output_format_sql_insert_table_name в качестве имени таблицы:
SET output_format_sql_insert_table_name = 'some_table';
SELECT * FROM some_data
INTO OUTFILE 'dump.sql'
FORMAT SQLInsertИмена столбцов можно не указывать, отключив параметр output_format_sql_insert_include_column_names:
SET output_format_sql_insert_include_column_names = 0Теперь мы можем импортировать файл dump.sql в другую OLTP-базу данных:
mysql some_db < dump.sqlМы предполагаем, что таблица some_table существует в базе данных MySQL some_db.
В некоторых СУБД могут быть ограничения на количество значений, которые можно обработать в рамках одного батча. По умолчанию ClickHouse создает батчи по 65k значений, но это можно изменить с помощью опции output_format_sql_insert_max_batch_size:
SET output_format_sql_insert_max_batch_size = 1000;Экспорт набора значений
В ClickHouse есть формат Values, похожий на SQLInsert, но без части INSERT INTO table VALUES; он возвращает только набор значений:
SELECT * FROM some_data LIMIT 3 FORMAT Values('Bangor_City_Forest','2015-07-01',34),('Alireza_Afzal','2017-02-01',24),('Akhaura-Laksam-Chittagong_Line','2015-09-01',30)Вставка данных из SQL-дампов
Для чтения SQL-дампов используется MySQLDump:
SELECT *
FROM file('dump.sql', MySQLDump)
LIMIT 5┌─path───────────────────────────┬──────month─┬─hits─┐
│ Bangor_City_Forest │ 2015-07-01 │ 34 │
│ Alireza_Afzal │ 2017-02-01 │ 24 │
│ Akhaura-Laksam-Chittagong_Line │ 2015-09-01 │ 30 │
│ 1973_National_500 │ 2017-10-01 │ 80 │
│ Attachment │ 2017-09-01 │ 1356 │
└────────────────────────────────┴────────────┴──────┘По умолчанию ClickHouse пропускает неизвестные столбцы (это управляется параметром input_format_skip_unknown_fields) и обрабатывает данные для первой таблицы, найденной в дампе (если в один файл выгружено несколько таблиц). DDL-операторы будут пропущены. Чтобы загрузить данные из дампа MySQL в таблицу (файл mysql.sql):
INSERT INTO some_data
FROM INFILE 'mysql.sql' FORMAT MySQLDumpМожно также автоматически создать таблицу из файла дампа MySQL:
CREATE TABLE table_from_mysql
ENGINE = MergeTree
ORDER BY tuple() AS
SELECT *
FROM file('mysql.sql', MySQLDump)Здесь мы создали таблицу table_from_mysql на основе структуры, которую ClickHouse автоматически определил. ClickHouse либо определяет типы по данным, либо использует DDL, если он доступен:
DESCRIBE TABLE table_from_mysql;┌─name──┬─type─────────────┬─default_type─┬─default_expression─┬─comment─┬─codec_expression─┬─ttl_expression─┐
│ path │ Nullable(String) │ │ │ │ │ │
│ month │ Nullable(Date32) │ │ │ │ │ │
│ hits │ Nullable(UInt32) │ │ │ │ │ │
└───────┴──────────────────┴──────────────┴────────────────────┴─────────┴──────────────────┴────────────────┘Другие форматы
ClickHouse поддерживает множество форматов — как текстовых, так и двоичных, — для разных сценариев использования и платформ. Подробнее о форматах и способах работы с ними читайте в следующих статьях:
Также обратите внимание на clickhouse-local — портативный полнофункциональный инструмент для работы с локальными и удалёнными файлами без сервера ClickHouse.