前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >史上最全-mysql迁移到clickhouse的5种办法

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

作者头像
Fayson
发布2019-07-22 17:20:02
12.3K1
发布2019-07-22 17:20:02
举报
文章被收录于专栏:Hadoop实操

转载原文地址:

https://anjia0532.github.io/2019/07/17/mysql-to-clickhouse/

1

create table engin mysql

代码语言:javascript
复制
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']);

官方文档:

代码语言:javascript
复制
https://clickhouse.yandex/docs/en/operations/table_engines/mysql/

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

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

2

insert into select from

代码语言:javascript
复制
-- 先建表
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函数对数据进行处理,比如

代码语言:javascript
复制
select toDate(xx) from mysql("host:port","db","table_name","user_name","password")

3

create table as select from

代码语言:javascript
复制
CREATE TABLE [IF NOT EXISTS] [db.]table_name
ENGINE =Log
AS 
SELECT *
FROM mysql('host:port', 'db', 'article_clientuser_sum', 'user', 'password')

网友文章:

代码语言:javascript
复制
http://jackpgao.github.io/2018/02/04/ClickHouse-Use-MySQL-Data/

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

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

4

Altinity/clickhouse-mysql-data-reader

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

代码语言:javascript
复制
## 创建表
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

官方文档:

代码语言:javascript
复制
https://github.com/Altinity/clickhouse-mysql-data-reader#mysql-migration-case-1—migrate-existing-data

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

csv

代码语言:javascript
复制
## 忽略建表
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) ,报
代码语言:javascript
复制
Code: 27. DB::Exception: Cannot parse input: expected , before: xxxx: (at row 69) ERROR: garbage after Nullable(Date): "8,002<LINE FEED>0205" sed ' :a;s/,,/,\\N,/g;ta' |clickhouse-client -h host --query "INSERT INTO [db].table FORMAT CSV"

将 ,, 替换成 ,\N,

代码语言:javascript
复制
python clean_csv.py --src=src.csv --dest=dest.csv --chunksize=50000 --cols --encoding=utf-8 --delimiter=,

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

代码语言:javascript
复制
https://anjia0532.github.io/2019/07/16/clean-csv/

5

StreamSets

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

代码语言:javascript
复制
https://anjia0532.github.io/2019/06/10/cdh-streamsets/

本文只展示从mysql全量导入clickhouse 本文假设你已经搭建起streamsets服务

启用并重启服务

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

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

代码语言:javascript
复制
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <groupId>com.anjia</groupId>
  <artifactId>demo</artifactId>
  <packaging>jar</packaging>
  <version>1.0-SNAPSHOT</version>
  <name>demo</name>
  <url>http://maven.apache.org</url>
  <dependencies>
    <dependency>
        <groupId>ru.yandex.clickhouse</groupId>
        <artifactId>clickhouse-jdbc</artifactId>
        <version>0.1.54</version>
    </dependency>
    <dependency>
      <groupId>mysql</groupId>
      <artifactId>mysql-connector-java</artifactId>
      <version>5.1.47</version>
  </dependency>
  </dependencies>
</project>

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

代码语言:javascript
复制
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服务

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2019-07-20,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Hadoop实操 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
云数据库 SQL Server
腾讯云数据库 SQL Server (TencentDB for SQL Server)是业界最常用的商用数据库之一,对基于 Windows 架构的应用程序具有完美的支持。TencentDB for SQL Server 拥有微软正版授权,可持续为用户提供最新的功能,避免未授权使用软件的风险。具有即开即用、稳定可靠、安全运行、弹性扩缩等特点。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档