ClickHouse数据表操作集合

1.定义数据表

在定义数据表之前,首先得了解定义数据库,数据库目前支持五种引擎:

    Ordinary       默认引擎
    Dictionary     字典引擎         此类数据库会自动为所有数据字典创建他们的数据表。)
    Memory         内存引擎         用于存放临时数据,此类数据库下的数据表只会停留在内存,重启数据丢失。
    Lazy           日志引擎         此类数据库下只能使用log系列的表引擎。
    Mysql          Mysql引擎       此类数据库会自动拉取远端Mysql中的数据,并创建Mysql表引擎的数据表。
创建数据库:
create database if not exists testdb

数据路径下会有testdb文件夹;
metadata路径下会有testdb.sql文件。

查看数据库:
show databases

删除数据库:
drop database testdb

2.定义数据表

建表完整语法:
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 = MergeTree()

3.数据表相关操作

建表举例
create table content (title String,url String,enenttime Datetime) engine = Memory;

复制同contnet一样的表结构为content_v1表
create table content_v1 as content engine = TinyLog                     只有表结构
create table content_v1 engine = TinyLog as select ...                  只有表结构
create table content_v1 engine = TinyLog as select * from content       表结构+数据

查看表定义结构:
show create table content           原样输出        
desc test                           表格显示

删除表:
drop table content              物理删除,立即释放空间;删除表数据+表空间
truncate table content          物理删除,立即释放空间;删除表数据,保留表结构
delete table content [FROM]     逻辑删除,删除的数据做标记;逐行删除表数据,保留表空间

4.默认值表达式

表字段支持三种默认值表达式:
DEFAULT
MATERIALIZED
ALIAS

三者区别:
数据写入时,只有default类型的字段可以出现在INSERT语句中。
数据查询时,只有default类型的字段可以通过在SELECT*返回。
数据存储时,只有default和materialized类型的字段才支持持久化。
表字段被定义了默认值,不再强制要求定义数据类型,CK根据默认值类型推断;

    如果同时对表字段定义了默认值表达式和数据类型,则按照定义的数据类型为主。
示例演示:
CREATE TABLE test ( id String, c1 DEFAULT 1000,  c2 String DEFAULT c1) ENGINE = TinyLog

INSERT INTO test(id) values('A000')

SELECT 
    c1, 
    c2, 
    toTypeName(c1), 
    toTypeName(c2)
FROM test

┌───c1─┬─c2───┬─toTypeName(c1)─┬─toTypeName(c2)─┐
│ 10001000 │ UInt16         │ String         │
└──────┴──────┴────────────────┴────────────────┘

c1根据字段默认值推断为无符号的整数
c2根据定义的类型判断为字符型

5.数据表的基本操作

追加新字段
ALTER TABLE xxx add column item String DEFAULT 'mac'        默认最后一行加
ALTER TABLE xxx add column app  String AFTER ID             在ID列后面加新字段

修改数据类型
ALTER TABLE content MODIFY COLUMN ip IPv4

修改备注
ALTER TABLE content comment column ID '主键列'

删除已有字段
ALTER TABLE content DROP COLUMN [IF EXISTS] name

移动数据表
RENAME TABLE default.content TO test.test

清空数据表
drop table content              物理删除,立即释放空间;删除表数据+表空间
truncate table content          物理删除,立即释放空间;删除表数据,保留表结构
delete table content [FROM]     逻辑删除,删除的数据做标记;逐行删除表数据,保留表空间

6.数据分区的基本操作

查询分区表
  SELECT 
    table, 
    partition_id, 
    name, 
    path
FROM system.parts
WHERE table = 'test'

┌─table─┬─partition_id─┬─name─────────┬─path───────────────────────────────────────────────┐
│ test  │ 202012202012_1_3_1 │ /data/clickhouse/data/data/test/test/202012_1_3_1/ │
│ test  │ 210506210506_4_4_0 │ /data/clickhouse/data/data/test/test/210506_4_4_0/ │
└───────┴──────────────┴──────────────┴────────────────────────────────────────────────────┘
删除指定分区
语法:
alter table tb_name drop partition partition_id

alter table test drop partition 201905

复制分区数据
ClickHosue支持将A表的分区数据复制到B表,这项特性可以用于快速写入、多表间数据同步和备份等场景。

语法:
ALTER TABLE B REPALCE PARTITION partition_expr FROM A

满足条件才可相互复制:
两张表需要拥有相同的分区键;
它们的表结构完全相同。

假设test_v1和test_v2表分区键和表结构完全相同
CREATE TABLE test.test_v1 (`id` String,url String,EventTime Date) ENGINE = MergeTree() PARTITION BY toYYYYMM(EventTime) ORDER BY id 

insert into test_v1 values ('A006-V1','www.v1.com','2019-08-05'),('A007-v1','www.v1.con','2019-08-20')

select * from test_v1
┌─id──────┬─url────────┬──EventTime─┐
│ A006-V1 │ www.v1.com │ 2019-08-05 │
│ A007-v1 │ www.v1.con │ 2019-08-20 │
└─────────┴────────────┴────────────┘

ALTER TABLE test_v2 REPLACE PARTITION 201908 FROM test_v1

SELECT * FROM test_v2 ORDER BY EventTime ASC
┌─id──────┬─url────────┬──EventTime─┐
│ A006-V1 │ www.v1.com │ 2019-08-05 │
│ A007-v1 │ www.v1.con │ 2019-08-20 │
└─────────┴────────────┴────────────
重置分区数据
        如果数据表的某一列数据不正确,需要将其初始化。

语法:
ALTER TABLE tb_name CLEAR COLUMN cloumn_name IN PARTITION partition_expr

示例演示:
ALTER TABLE test_v2 CLEAR COLUMN url     IN PARTITION 201908

SELECT * FROM test_v2 ORDER BY EventTime ASC

┌─id──────┬─url─┬──EventTime─┐
│ A006-V1 │     │ 2019-08-05 │
│ A007-v1 │     │ 2019-08-20 │
└─────────┴─────┴────────────┘
卸载与装载分区
        表分区可以通过DETACH语句卸载,分区被卸载后,它的物理数据并没有删除,而是被转移到了当前数据表目录的detached子目录下。装载是卸载的反过程。常用于分区数据的迁移和备份场景。

卸载语法:
ALTER TABLE tb_name DETACH PARTITION partition_expr

示例演示:
ALTER TABLE test_v2 DETACH PARTITION 201908

SELECT * FROM test_v2 ORDER BY EventTime ASC

ll /data/clickhouse/data/data/test/test_v2/
drwxr-x--- 3 clickhouse clickhouse 26 Dec  8 14:23 detached
-rw-r----- 1 clickhouse clickhouse  1 Dec  7 17:15 format_version.txt

ll /data/clickhouse/data/data/test/test_v2/detached/
drwxr-x--- 2 clickhouse clickhouse 203 Dec  8 14:23 201908_2_2_0

# 此时一旦分区被移动到detached的目录下,就代表已经脱离了ClickHouse的管理。ClickHouse并不会主动清理这些文件。



装载语法:
ALTER TABLE tb_name ATTACH PARTITION partition_expr

示例演示:
ALTER TABLE test_v2 ATTACH PARTITION 201908

SELECT * FROM test_v2 ORDER BY EventTime ASC
┌─id──────┬─url─┬──EventTime─┐
│ A006-V1 │     │ 2019-08-05 │
│ A007-v1 │     │ 2019-08-20 │
└─────────┴─────┴────────────┘

ll /data/clickhouse/data/data/test/test_v2/detached/
total 0

ll /data/clickhouse/data/data/test/test_v2/
total 4
drwxr-x--- 2 clickhouse clickhouse 203 Dec  8 14:33 201908_3_3_0
drwxr-x--- 2 clickhouse clickhouse   6 Dec  8 14:33 detached
-rw-r----- 1 clickhouse clickhouse   1 Dec  7 17:15 format_version.txt

7.分布式DDL执行

DDL:数据定义语言。
CREATE、ALTER、DROP、RENAME、及TRUNCATE等DDL语句都支持分布式。

DDL语法:

CREATE TABLE tb_name ON CLUSTER my_cluster (
id String,
url String,
eventtime Date
)
ENGINE = MergeTree()
PARTITION BY toYYYYMM(eventtime)
ORDER BY id

8.数据的写入

INSERT支持三种范式写入。

第一种使用VALUES格式的常规语法:
INSERT INTO table [(c1,c2,c3...)]  VALUES (V11,V12,V13...),(V21,V22,V23)

示例演示:
INSERT INTO test_v2 VALUES ('A0011','www.xxx.com','2020-12-08'),('A0012','www.nnn.com','2020-11-08'),('A0013','www.qqq.com','2020-12-09')


第二种使用指定格式语法:
INSERT INTO table [(c1,c2,c3...)] FORMAT format_name data_set

示例演示:
INSERT INTO test_v2 FORMAT CSV \
'A0011','www.xxx.com','2020-12-08'\
'A0012','www.nnn.com','2020-11-08'\
'A0013','www.qqq.com','2020-12-09'


第三种使用SELECT子句形式的语法:
INSERT INTO table [(c1,c2,c3...)] SELECT ...

示例演示:
INSERT INTO test_v2 SELECT 'A0020','www.ooo.com','now()'

9.数据的删除与修改
ClickHouse提供了DELETE和UPDATE的能力,这类操作称Mutation查询。(是ALTER语句的变种)

    适用于批量数据的修改和删除

    不支持事务,一旦提交被执行,无法回滚;

    Mutation语句的执行是一个异步的后台过程,语句被提交之后就会立即返回,但是具体逻辑并不一定执行完毕,需要通过system.mutations系统表查询。
DELETE语句完整语法:
ALTER TABLE table DELETE WHERE filter_expr

示例演示:
ALTER TABLE test_v2 DELETE WHERE id = 'A006-V1'         异步重操作。

进入目录发现,再执行了DETELE操作之后数据目录发生了变化,每个原有的目录后末尾都加了_6的后缀,此外,目录下还多了Mmutation_6.txt的文件夹。
ll /data/clickhouse/data/data/test/test_v2/
total 8
drwxr-x--- 2 clickhouse clickhouse 234 Dec  8 15:27 201908_3_3_0_6
drwxr-x--- 2 clickhouse clickhouse 234 Dec  8 15:27 202011_5_5_0_6
drwxr-x--- 2 clickhouse clickhouse 234 Dec  8 15:27 202012_4_4_0_6
drwxr-x--- 2 clickhouse clickhouse   6 Dec  8 14:33 detached
-rw-r----- 1 clickhouse clickhouse   1 Dec  7 17:15 format_version.txt
-rw-r----- 1 clickhouse clickhouse  92 Dec  8 15:27 mutation_6.txt

# cat mutation_6.txt 
format version: 1
create time: 2020-12-08 15:27:39
commands: DELETE WHERE id = \'A006-V1\' 


SELECT  database,table,mutation_id,block_numbers.number AS num, is_done FROM system.mutations
┌─database─┬─table───┬─mutation_id────┬─num─┬─is_done─┐
│ test     │ test_v2 │ mutation_6.txt │ [6]1 │
└──────────┴─────────┴────────────────┴─────┴─────────┘
    每执行一条ALTER TABLE xxx DELETE FROM 语句,都会在mutation系统表中生成一条对应的执行计划,当is_done为1时,代表执行完毕。同时也会在数据目录下会以mutation_id为名生成与之对应的日志文件用于记录相关信息。

    删除的过程是以数据表的每个分区目录为单位,将所有目录重写为新的目录,新目录的命名规则在原有名称之上加上system.mutations.block_numbers.number,数据在重写的过程中会将需要删除的数据去掉。就数据不会立即删除,标记为非激活状态(active 0)。等到MergeTree引擎的下一次合并动作触发时,这些非激活目录才会被真正从物理上删除。

10.DBA运维常用查询

查看当前连接数
众所周知,CH 对外暴露的原生接口分为 TCP 和 HTTP 两类,通过 system.metrics 即可查询当前的 TCP、HTTP 与内部副本的连接数。

SELECT *
FROM system.metrics
WHERE (metric = 'TCPConnection') OR (metric = 'HTTPConnection')

┌─metric─────────┬─value─┬─description─────────────────────────────────────────────────────────┐
│ TCPConnection  │     1 │ Number of connections to TCP server (clients with native interface) │
│ HTTPConnection │     0 │ Number of connections to HTTP server                                │
└────────────────┴───────┴─────────────────────────────────────────────────────────────────────┘

简便方式:
SELECT *
FROM system.metrics
WHERE metric LIKE '%Connection';

┌─metric────────────────┬─value─┬─description─────────────────────────────────────────────────────────┐
│ TCPConnection         │     1 │ Number of connections to TCP server (clients with native interface) │
│ HTTPConnection        │     0 │ Number of connections to HTTP server                                │
│ InterserverConnection │     0 │ Number of connections from other replicas to fetch parts            │
└───────────────────────┴───────┴─────────────────────────────────────────────────────────────────────┘

查看集群配置

SELECT *
FROM system.clusters

┌─cluster───────────────────────────┬─shard_num─┬─shard_weight─┬─replica_num─┬─host_name─────┬─host_address──┬─port─┬─is_local─┬─user────┬─default_database─┬─errors_count─┬─estimated_recovery_time─┐
│ perftest_1shards_2replicas        │         111192.168.6.51192.168.6.5190000default │                  │            00 │
│ perftest_1shards_2replicas        │         112192.168.6.120192.168.6.12090001default │                  │            00 │
│ test_cluster_two_shards           │         111127.0.0.1127.0.0.190001default │                  │            00 │
│ test_cluster_two_shards           │         211127.0.0.2127.0.0.290000default │                  │            00 │
│ test_cluster_two_shards_localhost │         111 │ localhost     │ ::190001default │                  │            00 │
│ test_cluster_two_shards_localhost │         211 │ localhost     │ ::190001default │                  │            00 │
│ test_shard_localhost              │         111 │ localhost     │ ::190001default │                  │            00 │
│ test_shard_localhost_secure       │         111 │ localhost     │ ::194400default │                  │            00 │
│ test_unavailable_shard            │         111 │ localhost     │ ::190001default │                  │            00 │
│ test_unavailable_shard            │         211 │ localhost     │ ::110default │                  │            00 │
└───────────────────────────────────┴───────────┴──────────────┴─────────────┴───────────────┴───────────────┴──────┴──────────┴─────────┴──────────────────┴──────────────┴─────────────────────────┘

SELECT *
FROM system.macros

┌─macro───┬─substitution──┐
│ replica │ 192.168.6.120 │
└─────────┴───────────────┘

存储空间统计
查询CH各个存储路径的空间

SELECT 
    name, 
    path, 
    formatReadableSize(free_space) AS free, 
    formatReadableSize(total_space) AS total, 
    formatReadableSize(keep_free_space) AS reserved
FROM system.disks

┌─name────┬─path─────────────────┬─free──────┬─total──────┬─reserved─┐
│ default/var/lib/clickhouse/72.99 GiB │ 191.02 GiB │ 0.00 B   │
└─────────┴──────────────────────┴───────────┴────────────┴──────────┘

各个数据库占用空间统计

SELECT 
    database, 
    formatReadableSize(sum(bytes_on_disk)) AS on_disk
FROM system.parts
GROUP BY database

┌─database─┬─on_disk──┐
│ system   │ 1.50 KiB │
│ default1.99 KiB │
└──────────┴──────────┘
当前正在执行的查询
SELECT 
    query_id, 
    user, 
    address, 
    query
FROM system.processes
ORDER BY query_id ASC


┌─query_id─────────────────────────────┬─user────┬─address─┬─query─────────────────────────────────────────────────────────────────────────────┐
│ 8879f041-6e54-405b-b84a-e3d4a0fd4c5d │ default │ ::1SELECT query_id, user, address, query FROM system.processes ORDER BY query_id ASC │
│ beda6163-609e-40ed-bb38-c33a7300c183 │ default │ ::1SELECT * FROM system.macros                                                       │
└──────────────────────────────────────┴─────────┴─────────┴───────────────────────────────────────────────────────────────────────────────────┘

更多精彩内容欢迎关注微信公众号
ClickHouse数据表操作集合_第1张图片

你可能感兴趣的:(kafka,数据库)