将 mysql 数据迁移到 clickhouse (最新版)

一、前驱知识

已经在mysql中插入了海量的数据了,这个时候mysql 承载不了这么大的数据,并且数据只需要查询,修改和删除非常少,并且不需要支持事务,这个时候需要换一个底层存储,这里选用的是 clickhouse 来进行存储。

演示方便这里使用的数据量很小,其实很大的话也很快。

本文迁移示例表

  • mysql安装在docker中,迁移的表结构
text 复制代码
CREATE TABLE `change_handler1` (
  `client_id` int NOT NULL COMMENT '网关id',
  `equipment` varchar(48) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '设备编码',
  `point_id` varchar(16) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '测点id',
  `value_last` decimal(18,6) DEFAULT NULL COMMENT '上值',
  `value_latest` decimal(18,6) DEFAULT NULL COMMENT '下值',
  `value_change` decimal(18,6) DEFAULT NULL COMMENT '电量',
  `window_end_time_last` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '最新封窗时间',
  `window_end_time_latest` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '上个封窗时间',
  `window_end_time_msg_time` datetime DEFAULT NULL COMMENT '窗口网关发送时间',
  `window_size` bigint DEFAULT NULL COMMENT '窗口时间长度秒',
  `create_time` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  `update_time` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '更新时间',
  `electricity_value` decimal(18,6) DEFAULT NULL COMMENT '电费',
  `price_type` bigint DEFAULT NULL COMMENT '峰谷平尖类型',
  PRIMARY KEY (`client_id`,`equipment`,`point_id`,`window_end_time_last`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3 ROW_FORMAT=DYNAMIC COMMENT='电量清洗';
  • clickhouse 安装在docker中,映射后的表结构
text 复制代码
CREATE TABLE history_db.change_handler(
   `client_id` int  COMMENT '网关id',
  `equipment` String  COMMENT '设备编码',
  `point_id`  String COMMENT '测点id',
  `value_last` Decimal(18,6)  COMMENT '上值',
  `value_latest` Decimal(18,6)  COMMENT '下值',
  `value_change` Decimal(18,6)  COMMENT '电量',
  `window_end_time_last` DateTime  COMMENT '最新封窗时间',
  `window_end_time_latest` DateTime  COMMENT '上个封窗时间',
  `window_end_time_msg_time` DateTime  COMMENT '窗口网关发送时间',
  `window_size` Int32  COMMENT '窗口时间长度秒',
  `create_time` DateTime  COMMENT '创建时间',
  `update_time` DateTime  COMMENT '更新时间',
  `electricity_value` Decimal(18,6)  COMMENT '电费',
  `price_type` Int32  COMMENT '峰谷平尖类型'
   ) ENGINE = MergeTree()
   order by (client_id,equipment,point_id,window_end_time_last)
   PRIMARY KEY (client_id,equipment,point_id,window_end_time_last);

二、数据迁移

我看了网上的几种方式,几种都是在clickhouse 这边来做的,我觉得没必要,因为表非常大的话,网络开销是非常大的,所以我这里采用的是从mysql 那里将数据迁移出来,然后导入clickhouse 用 clickhouse-client 来导入

2.1 mysql 数据导出

首先进到mysql的机器里面执行命令

text 复制代码
select change_handler1.* into outfile '/var/lib/mysql-files/change_handler1.txt' from change_handler1;

ps: 注意这里的导出路径,如果不是这个(/var/lib/mysql-files)路径下会报错,最好写这个路径,反正只是一个临时存储路径

然后我们将导出的文件拷贝到clickhouse的机器上,我这里是容器,直接用 docker cp 拷贝的,如果不是容器,用FTP之类的拷贝过去

拷贝到 clickhouse 容器中

2.2 clickhouse 导入

先进入clickhouse容器,这里使用的是 clickhouse-client 来导入的,如果没有的话可以直接安装

text 复制代码
sudo apt-get install clickhouse-client

执行导入命令,如果设置了密码的话用 --password 来指定

text 复制代码
cat change_handler1.txt | clickhouse-client -u 用户 --password 密码 --query="INSERT INTO history_db.change_handler FORMAT TabSeparated"

FORMAT 后面跟的是格式,如果导入的是CSV格式的话 写CSV

2.3 结果

执行完成之后就可以连接clickhouse 看数据了,数据已经过去了

相关推荐
kejiashao1 小时前
Android View的绘制流程及事件分发机制
android
小蜜蜂嗡嗡2 小时前
flutter实现付费解锁内容的遮挡
android·flutter
进击的cc2 小时前
拒绝背诵!一文带你打穿 Android ANR 发生的底层全链路
android·面试
进击的cc2 小时前
App 启动优化全家桶:别再只盯着 Application 了,热启动优化你真的做对了吗?
android·面试
FirstFrost --sy2 小时前
MySQL复合查询
数据库·mysql
imuliuliang2 小时前
MySQL的底层原理与架构
数据库·mysql·架构
彭波3962 小时前
安卓手机端安装xapk、apkm软件!怎样安装xapk软件?安卓的apk和XAPK的区别?附教程
android·智能手机
Yang-Never3 小时前
ADB ->adb shell perfetto 抓取 trace 指令
android·开发语言·adb·android studio
ShiJiuD6668889994 小时前
mysql 基础笔记一
数据库·笔记·mysql
standovon4 小时前
【MySQL基础篇】概述及SQL指令:DDL及DML
sql·mysql·oracle