clickhouse 同步mysql_033-史上最全-mysql迁移到clickhouse的5种办法

这篇博客详细介绍了5种将数据从MySQL迁移到ClickHouse的方法,包括使用CREATE TABLE AS SELECT, INSERT INTO SELECT, CREATE TABLE ENGINE MySQL, Altinity的clickhouse-mysql-data-reader工具,以及CSV导入。每种方法的优缺点和注意事项都进行了阐述,适用于不同场景的数据迁移需求。" 118416371,9942725,2021低压电工考试必备:题库与模拟测试,"['电工考试', '安全规程', '电气知识', '职业技能', '培训资料']

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

这是坚持技术写作计划(含翻译)的第33篇,定个小目标999,每周最少2篇。

数据迁移需要从mysql导入clickhouse, 总结方案如下,包括clickhouse自身支持的三种方式,第三方工具两种。

create table engin mysql

CREATE TABLE [IF NOT EXISTS] [db.]table_name [ON CLUSTER cluster]

(

name1 [type1] [DEFAULT|MATERIALIZED|ALIAS expr1] [TTL expr1],

name2 [type2] [DEFAULT|MATERIALIZED|ALIAS expr2] [TTL expr2],

...

INDEX index_name1 expr1 TYPE type1(...) GRANULARITY value1,

INDEX index_name2 expr2 TYPE type2(...) GRANULARITY value2

) ENGINE = MySQL('host:port', 'database', 'table', 'user', 'password'[, replace_query, 'on_duplicate_clause']);

复制代码

注意,实际数据存储在远端mysql数据库中,可以理解成外表。

可以通过在mysql增删数据进行验证。

insert into select from

-- 先建表

CREATE TABLE [IF NOT EXISTS] [db.]table_name [ON CLUSTER cluster]

(

name1 [type1] [DEFAULT|MATERIALIZED|ALIAS expr1],

name2 [type2] [DEFAULT|MATERIALIZED|ALIAS expr2],

...

) ENGINE = engine

-- 导入数据

INSERT INTO [db.]table [(c1, c2, c3)] select 列或者* from mysql('host:port', 'db', 'table_name', 'user', 'password')

复制代码

可以自定义列类型,列数,使用clickhouse函数对数据进行处理,比如 select toDate(xx) from mysql("host:port","db","table_name","user_name","password")

create table as select from

CREATE TABLE [IF NOT EXISTS] [db.]table_name

ENGINE =Log

AS

SELECT *

FROM mysql('host:port', 'db', 'article_clientuser_sum', 'user', 'password')

复制代码

不支持自定义列,参考资料里的博主写的 ENGIN=MergeTree 测试失败。

可以理解成 create table 和 insert into select 的组合

Altinity/clickhouse-mysql-data-reader

Altinity公司开源的一个python工具,用来从mysql迁移数据到clickhouse(支持binlog增量更新和全量导入),但是官方readme和代码脱节,根据quick start跑不通。

## 创建表

clickhouse-mysql \

--src-host=127.0.0.1 \

--src-user=reader \

--src-password=Qwerty1# \

--table-templates-with-create-database \

--src-table=airline.ontime > create_clickhouse_table_template.sql

## 修改脚本

vim create_clickhouse_table_template.sql

## 导入建表

clickhouse-client -mn < create_clickhouse_table_template.sql

## 数据导入

clickhouse-mysql \

--src-host=127.0.0.1 \

--src-user=reader \

--src-password=Qwerty1# \

--table-migrate \

--dst-host=127.0.0.1 \

--dst-table=logunified \

--csvpool

复制代码

注意,上述三种都是从mysql导入clickhouse,如果数据量大,对于mysql压力还是挺大的。下面介绍两种离线方式(streamsets支持实时,也支持离线)

csv

## 忽略建表

clickhouse-client \

-h host \

--query="INSERT INTO [db].table FORMAT CSV" < test.csv

复制代码

但是如果源数据质量不高,往往会有问题,比如包含特殊字符(分隔符,转义符),或者换行。被坑的很惨。

自定义分隔符, --format_csv_delimiter="|"

遇到错误跳过而不中止, --input_format_allow_errors_num=10 最多允许10行错误, --input_format_allow_errors_ratio=0.1 允许10%的错误

csv 跳过空值(null) ,报 Code: 27. DB::Exception: Cannot parse input: expected , before: xxxx: (at row 69) ERROR: garbage after Nullable(Date): "8,0020205"  sed ' :a;s/,,/,\\N,/g;ta' |clickhouse-client -h host --query "INSERT INTO [db].table FORMAT CSV" 将 ,, 替换成 ,\N,

python clean_csv.py --src=src.csv --dest=dest.csv --chunksize=50000 --cols --encoding=utf-8 --delimiter=,

clean_csv.py参考我另外一篇 032-csv文件容错处理

streamsets

streamsets支持从mysql或者读csv全量导入,也支持订阅binlog增量插入,参考我另外一篇 025-大数据ETL工具之StreamSets安装及订阅mysql binlog。

本文只展示从mysql全量导入clickhouse

本文假设你已经搭建起streamsets服务

启用并重启服务

上传mysql和clickhouse的jdbc jar和依赖包

便捷方式,创建pom.xml,使用maven统一下载

xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">

4.0.0

com.anjia

demo

jar

1.0-SNAPSHOT

demo

http://maven.apache.org

ru.yandex.clickhouse

clickhouse-jdbc

0.1.54

mysql

mysql-connector-java

5.1.47

复制代码

如果本地装有maven,执行如下命令

mvn dependency:copy-dependencies -DoutputDirectory=lib -DincludeScope=compile

所有需要的jar会下载并复制到lib目录下

然后拷贝到 streamsets /opt/streamsets-datacollector-3.9.1/streamsets-libs-extras/streamsets-datacollector-jdbc-lib/lib/ 目录下

重启streamsets服务

参考资料

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值