mysql到clickhouse

这几年机会所有大厂都在做去O的事情,机会让mysql普及了整个互联网行业,但是mysql其实是有很大问题的,与oracle比起来,差距很明显;

mysql 把历史数据迁移到clickhouse 有几种方案

1. mysql 引擎

CH 提供mysql 引擎,其实就是一个映射,可以看成一个查询入口;

比如在CH 执行一条sql语句,它其实是跑到mysql去执行的,而且执行完后CH也不保留查询的结果;

迁移的时候可以这么做:

建一个MySQL 引擎

sql 复制代码
CREATE TABLE mysql_order
ENGINE = MySQL('mysql-host:3306', 'db', 'orders', 'user', 'pwd');

因为 mysql引擎不存数据,还需要一个同步表:

sql 复制代码
CREATE TABLE order_olap (
    id          UInt64,
    user_id     UInt64,
    amount      Decimal(18,2),
    create_time DateTime
) ENGINE = MergeTree
PARTITION BY toYYYYMM(create_time)
ORDER BY (user_id, create_time);

然后按月拉取数据

sql 复制代码
-- 例如导入 2023-01 月的历史数据
INSERT INTO order_olap
SELECT id, user_id, amount, create_time
FROM mysql_order
WHERE create_time >= '2023-01-01 00:00:00'
  AND create_time <  '2023-02-01 00:00:00';

2.MaterializedMySQL

ClickHouse MaterializedMySQL数据库引擎会:

首次创建时自动全量拉取(含历史)

之后消费 Binlog 做增量同步(INSERT/UPDATE/DELETE)

sql 复制代码
SET allow_experimental_database_materialize_mysql = 1

CREATE DATABASE ck_db
ENGINE = MaterializeMySQL(
    'mysql-host:3306', 'source_db', 'user', 'password'
)
SETTINGS
    materialized_mysql_tables_list = 'orders';  

一般用第一种,理由也很简单,可以做数据清洗;而且数据可控;

第二种虽然省事,但是全量阶段对 MySQL 有读压力,不适合超大多分表同时建;

3.KAFKA

顺带聊一下kafka 引擎,这种引擎也是不存数据的,但是和mysql 还不大一样,它是一个消费管道;在这个引擎种一个sql语句查询一遍后,offset 就推进了,再执行相同的sql就查不到了,除非你重置offset;

所以一般配合物化视图做;

sql 复制代码
-- 1. 创建 Kafka 引擎表,作为消费管道(不存储数据)
CREATE TABLE kafka_src
ENGINE = Kafka
SETTINGS
    kafka_broker_list = 'localhost:9092',
    kafka_topic_list = 'topic',
    kafka_group_name = 'new_group',
    kafka_format = 'JSONEachRow',
    kafka_auto_offset_reset = 'earliest'
AS SELECT
    timestamp UInt64,
    level String,
    message String;

-- 2. 创建目标存储表,使用 MergeTree 引擎真正存储数据
CREATE TABLE target
ENGINE = MergeTree
ORDER BY (level, day)
AS SELECT
    day Date,
    level String,
    total UInt64;

-- 3. 创建物化视图,将 Kafka 管道中的数据转换并写入目标表
CREATE MATERIALIZED VIEW mv TO target
AS
SELECT
    toDate(toDateTime(timestamp)) AS day,
    level,
    count() as total
FROM kafka_src
GROUP BY day, level;

这里可能会有疑问了,明明物化视图是需要插入的时候才会触发的,为什么kafka 引擎不需要插入操作也能触发呢?

Kafka 引擎表不存数据,只是一个消费者;

ClickHouse 做了一件特殊的事:

MV 绑定到 Kafka 引擎后,Kafka 引擎会启动内部消费者线程ClickHouse。

ClickHouse 的后台线程会持续从 Kafka 拉取消息并组成一个个数据块。因为拉取到了新数据,所以物化视图就会被自动触发,完成数据清洗和落盘;

javascript 复制代码
Kafka Topic → [Kafka引擎消费者线程] → 生成虚拟Block → 触发MV → 清洗/转换 → 写入MergeTree
相关推荐
Elastic 中国社区官方博客16 分钟前
控制告警如何触发、恢复和发送通知:Elastic 可观测性中的 Kibana 通用告警
大数据·数据库·安全·elasticsearch·搜索引擎·全文检索·es
IT界的老黄牛19 分钟前
ClickHouse 运维 SQL 速查:system 表查跑批、内存、合并与磁盘一篇通
大数据·clickhouse·磁盘占用·命令速查·运维排查·system表
GlobalInfo19 分钟前
全球人工智能数据中心保险市场动态、发展趋势及项目可行性研究报告2026-2032
数据库·人工智能·ai·数据中心
星马梦缘25 分钟前
关于人工智能学院游戏设计大赛决赛的内部分工通知
数据库·人工智能·游戏
Databend29 分钟前
以云原生湖仓支撑 AI 应用落地丨Databend 亮相 2026 人工智能开放计算大会
大数据·数据库·数据分析
计算机毕设定制辅导-无忧学长31 分钟前
《基于微信小程序的个人智能刷题助手的设计与实现》
java·spring boot·mysql·微信小程序·uniapp·个人智能刷题助手系统
geovindu33 分钟前
sql:Managing Complex Joins and Subqueries in SQL using mysql 9.0
大数据·数据库·数据仓库·sql·mysql·数据库开发·数据库架构
国科安芯36 分钟前
星载微控制器MCU选型与系统设计的证据化方法
大数据·数据库·单片机·嵌入式硬件·低轨卫星·商业航天·抗辐射
Sayuanni%341 分钟前
Redis(初阶)
数据库·redis·缓存
jnrjian1 小时前
Oracle TDE 大小钥匙 HSM DEK 与 EDB key.bin
数据库·oracle