跳到主要内容
跳到主要内容

在 ClickHouse 中插入和导出 SQL 数据

ClickHouse 可以通过多种方式轻松集成到 OLTP 数据库基础设施中。一种方法是使用 SQL 转储在其他数据库和 ClickHouse 之间传输数据。

创建 SQL 转储

数据可以使用 SQLInsert 以 SQL 格式转储。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 表存在于 some_db MySQL 数据库中。

某些数据库管理系统可能限制单个批处理可以处理的值的数量。默认情况下,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 服务器。