浅析mysql迁移到clickhouse的5种方法
作者:安家 发布时间:2024-01-27 21:51:47
数据迁移需要从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']);
官方文档: https://clickhouse.yandex/docs/en/operations/table_engines/mysql/
注意,实际数据存储在远端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')
网友文章: http://jackpgao.github.io/2018/02/04/ClickHouse-Use-MySQL-Data/
不支持自定义列,参考资料里的博主写的 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
官方文档: https://github.com/Altinity/clickhouse-mysql-data-reader#mysql-migration-case-1—migrate-existing-data
注意,上述三种都是从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,002<LINE FEED>0205" 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统一下载
<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,执行如下命令
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服务
总结
以上所述是小编给大家介绍的mysql迁移到clickhouse的5种方法,网站的支持!
如果你觉得本文对你有帮助,欢迎转载,烦请注明出处,谢谢!
来源:https://anjia0532.github.io/2019/07/17/mysql-to-clickhouse/


猜你喜欢
- 本文实例为大家分享了python实现坦克大战的具体代码,供大家参考,具体内容如下本游戏制作代码量较大具体代码与图片声源可以在我的GitHub
- 代码实现的目的:为一个自定义的类的某个属性在使用它时候,触发某个事件。 该程序的效果:点击输入按钮,弹出一个脚本提示输入框让用户输入他的姓名
- 本文实例讲述了python从sqlite读取并显示数据的方法。分享给大家供大家参考。具体实现方法如下:import cgi, os, sys
- 这篇文章主要介绍了微信小程序wxml列表渲染原理解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友
- 在windows下用python脚本实现文件的备份,参考《A Byte of Python3》第十一章(Page59)。#!/usr/bin
- 1、新建DLL打开VB6-->文件-->新建工程-->选择ActiveX DLL-->确定2、将默认工程、类重命名工
- 百度OCR体验地址:https://ai.baidu.com/tech/imagerecognition/general腾讯OCR体验地址:
- 网络上有很多个性化的404页面,但是404页面不仅仅是个性化展示,404页面本来目的是:告诉浏览者其所请求的页面不存在或链接错误,同时引导用
- 1. Python中的异常栈跟踪之前在做Java的时候,异常对象默认就包含stacktrace相关的信息,通过异常对象的相关方法printS
- 前言大家好,我是Peter~本文记录的是Pandas两种少用的读取文件方式:读取在线文件的数据读取剪贴板的数据声明:本文案例和在线数据仅用于
- http://swik.net/Ajax/Ajax+Mistakes在某网站瞎逛时,发现这个链接,进去逛了逛,觉得很有意思,大家也可以去看看
- 前言:在自动化测试中,经常需要查找操作文件,比如说查找配置文件(从而读取配置文件的信息),查找测试报告(从而发送测试报告邮件),经常要对大量
- CAS算法(compare and swap)CAS算法是一种有名的无锁算法。无锁编程,即不使用锁的情况下实现多线程之间的变量同步,也就是在
- 问题描述在某些问题背景下,需要确认是否多台终端在线,也就是会使用我们牛逼的ping这个命令,做一些的ping操作,如果需要确认的设备比较少,
- Blackfriday是在Go中实现的Markdown处理器。您可以安全地输入用户提供的数据,速度快,支持通用扩展(表,智能标点符号替换等)
- 1. 前言相信参与使用Oracle数据库进行项目开发、运维的同学常常被Oracle JDBC驱动的Maven依赖折磨。现在这一情况在今年二月
- 需要安装pywin32模块,pip install pywin32##pip install pywin32import win32api,
- 无论何时,IE总是让页面制作者感到那么的黯然销魂,尤其是IE6,IE7次之,虽然IE8已经做了很大的改进,但由于XP用户的数量实在太大,而且
- 数据准备moduls.py# 构建表结构from django.db import models# 表app01_publishclass
- 布局管理就是管理图形窗口中各个部件的位置和排列。图形窗口中的大量部件也需要通过布局管理,对部件进行整理分组、排列定位,才能使界面整齐有序、美