主题
在clickhouse中有一些常用的基础命令,这里进行记录总结一下。
clickhouse的安装可以参照我的 另一篇clickhouse安装记录
clickhouse概念框架
常用命令
1.服务启动/停止
注:需要按照教程正确安装了服务后
启动: service clickhouse-server start
停止:service clickhouse-server stop
重启:service clickhouse-server restart
2.登录
clickhouse-client --user 你的账号 --password 你的密码
3.数据库
3.1查看数据库
show databases
注意:在对数据表进行操作的时候,如果不指定数据库名的话。会对上图的default库进行操作,比如新建或者查询。
3.2新建数据库
3.2.1clickhouse数据库引擎
CREATE [IF NOT EXISTS] DATABASE 你的数据库名称 [ON CLUSTER cluster] ;
3.2.2mysql数据库引擎
CREATE DATABASE [IF NOT EXISTS] 你的数据库名称 [ON CLUSTER cluster] ENGINE = MySQL('你的mysql地址 : 你的mysql端口 ', ['连接的mysql数据里的数据库' | 你的数据库名称], '你的mysql账号', '你的mysql密码')
3.2.3延迟引擎
没什么使用场景
3.2.4Atomic
没什么使用场景,官方也没留什么资料
3.3 删除数据库
drop database 你的数据库名称
注意:删库要小心呀
4.数据表
clickhouse中的数据表分为本地表和分区表,其中本地表是真正持有数据的结构,分区表并不真正存储数据,只是给用户一个操作集群所有数据的入口。
举个例子,假设有一个机器A、B、C组成的clickhouse集群,且每个机器都是clickhouse的一个分片:
初始状态下:
机器名称 | 本地表 | 本地表数据 | 全局表 |
A | hello | 1 | hello_all |
B | hello | 1 | hello_all |
C | hello | 1 | hello_all |
state1: 对 机器A 的 hello 本地表 插入数据 [2,3,4] ,插入完成后所有的插入数据都进入到服务器A本地进行存储了,集群的数据状态如下所示:
机器名称 | 本地表 | 本地表数据 | 全局表 |
A | hello | 1,2,3,4 | hello_all |
B | hello | 1 | hello_all |
C | hello | 1 | hello_all |
state2: 对 机器B 的 hello_all 全局表 插入 [2,3,4], 插入完成后。集群的数据状态可能如下所示:
机器名称 | 本地表 | 本地表数据 | 全局表 |
A | hello | 1,2 | hello_all |
B | hello | 1,3 | hello_all |
C | hello | 1,4 | hello_all |
4.1 本地表
4.1.1建表
clickhouse有自己的字段数据结构,主要有整形(Int8-Int64、UInt8-UInt64)、浮点型(Float32:float、Float64:double)、字符串(String, FixString(N))、枚举型、数组型、元组型、日期及时间戳这些数据类型。与常见的mysql里的数据类型的对应关系参考概念框架中的数据类型部分。
在时间应用场景里主要是使用mergetree家族引擎。mergetree家族的引擎主要是基于mergetree引擎的基础上增加了些特定功能如预先统计、唯一索引之类的。此处不做详细讨论,可以参考官方文档进行了解。处理mergetree家族之外的其他引擎使用场景都极少,这里以最常见的mergetree为例,举个例子新建数据表(index_granularity 是指定多少条数据clickhouse对数据进行压缩打包,默认是8192):
CREATE TABLE 你想建的数据表名
(`字段1` String,`字段2` String)
ENGINE = MergeTree
PARTITION BY 你想用来分区的字段名
ORDER BY “索引”字段名(可以多个)
SETTINGS index_granularity = 8192;
4.1.2删表
drop table 你要删除的表
4.1.3修改表
不建议直接在线上环境上对数据表进行修改。因为有数据的情况修改表结构会导致clickhouse要花费资源进行数据重排等操作,操作不慎可能会有数据丢失|错误的风险。
改变表结构:
ALTER TABLE [你的数据库].你的数据表 [ON CLUSTER cluster] ADD|DROP|CLEAR|COMMENT|MODIFY COLUMN ...
1.增加列
ADD COLUMN [IF NOT EXISTS] 新增列名 [新增列的数据类型] [新增列的默认值] [AFTER 新增列字段放置哪个列之后]
demo:
ALTER TABLE visits ADD COLUMN browser String AFTER user_id
2.删除列
DROP COLUMN [IF EXISTS] 待删除列名
ALTER TABLE visits DROP COLUMN browser
3.重置列
CLEAR COLUMN [IF EXISTS] 待清空列名 (也可以在后面加入条件进行处理)
ALTER TABLE op_log_recharge CLEAR COLUMN recharge_money
# 可选的后续条件
# (IN PARTITION tuple())
# (where dateStr = '2021-05-20')
4.增加注释
COMMENT COLUMN [IF EXISTS] 列名 '新加的注释'
ALTER TABLE op_log_login COMMENT COLUMN userId '用户角色Id'
5.改变列的数据类型、默认表达式及TTL
MODIFY COLUMN [IF EXISTS] 列名 [数据类型] [默认值] [数据过期时间TTL]
ALTER TABLE op_log_login MODIFY COLUMN userIp String
4.2 分区表
分区表和本地表归类于table,但是分区表并没有像本地表一样真正存储了数据,更像是将用户指令在集群上做map-reduce的一个入口。
因为clickhouse的集群数据同步是以异步任务的方式在节点中进行同步的,所以在连接中通过对分区表给集群新增数据的时候,数据可能会延迟存入分区表中(理论上集群的节点越多,完成同步的时间就越长)。在通过分区表进行集群查询的实践中是非常流畅的,在插入中则经常需要等待十几秒数据才能完全同步,所以有能力的团队都会将分区表的集群插入添加一个中间层来完成,可以实现按自己的逻辑将数据落盘到不同分片的本地表里。
4.2.1建表
CREATE TABLE 分区表名称 AS 本地表名称 ENGINE = Distributed(集群名称, 数据库名称, 本地表名称, 数据分配模式)
其中集群名称可以参考我的另一篇clickhouse安装记录中如何配置的集群名称;数据分配模式是指的如何将数据分配到不同切片上的,最常用的是rand()将需要数据随机分配到不同分片,保持每个节点的压力比较均衡。
4.2.2删表
drop table 你要删除的表