作者简介
马听,多年 DBA 实战经验,对 MySQL、 Redis、ClickHouse 等数据库有一定了解,专栏《一线数据库工程师带你深入理解 MySQL》、《Redis 运维实战》作者。
这篇文章来总结下 CH 常用的管理语句。
1 会话相关的管理语句
我们经常需要确定数据库当前正在执行的 SQL,CH 提供了一些系统表用于记录这些信息,具体用法如下:
1.1 获取活跃会话
代码语言:javascript复制SELECT query_id, user, address, elapsed, query FROM system.processes ORDER BY query_id;
或者跟 MySQL 一样,执行:
代码语言:javascript复制SHOW PROCESSLIST;
1.2 kill 查询
如果某条 SQL 运行的太久了,影响到实例性能了,则可以与业务确定后,进行 kill 操作:
代码语言:javascript复制kill query where query_id='a410013e-f8f6-4ba7-a23a-48ae43535041';
1.3 获取 mutation 操作
CH 的 update 和 delete 操作,算 DDL 操作,CH 称为 mutation,而要确定 mutation 队列,可以使用下面的 SQL:
代码语言:javascript复制SELECT * FROM system.mutations;
1.4 kill mutation 操作
代码语言:javascript复制KILL MUTATION mutation_id = 'trx_id';
2 磁盘空间相关的管理语句
2.1 查看表所使用的空间
代码语言:javascript复制SELECT database, table, partition, name part_name, active, bytes_on_disk FROM system.parts where database not in 'system' ORDER BY database, table, partition, name;
2.2 查看库大小
下面的 SQL 是查看库大小并排序:
代码语言:javascript复制SELECT database, sum(bytes_on_disk) as db_size FROM system.parts GROUP BY database order by db_size desc;
3 性能相关
3.1 慢查询
可以在 users.xml 配置文件中设置 log_queries = 1 来开启慢查询记录。
而需要定位到慢查询可以使用下面的 SQL:
代码语言:javascript复制SELECT user, client_hostname AS host, client_name AS client,formatDateTime(query_start_time, '%T') AS started,query_duration_ms / 1000 AS sec, round(memory_usage / 1048576) AS MEM_MB, result_rows AS RES_CNT,toDecimal32(result_bytes / 1048576, 6) AS RES_MB, read_rows AS R_CNT, round(read_bytes / 1048576) AS R_MB, written_rows AS W_CNT, round(written_bytes / 1048576) AS W_MB, query FROM system.query_log WHERE type= 2 ORDER BY query_duration_ms DESC LIMIT 10
3.2 正在执行的 SQL 概要
正在执行的查询总次数、正在发生的合并操作总次数
代码语言:javascript复制select * from system.metrics limit 5;
3.3 累积 SQL 概要
查看服务运行过程总的查询次数、总的 select 次数
代码语言:javascript复制select * from system.events limit 5;
3.4 正在后台运行的概要信息
查看当前分配的内存、执行队列中的任务数量等
代码语言:javascript复制select * from system.asynchronous_metrics limit 5;
4 复制相关
检查复制是否异常:
代码语言:javascript复制SELECT database, table, is_leader, total_replicas,active_replicas FROM system.replicas WHERE is_readonly OR is_session_expired OR future_parts > 20 OR parts_to_check > 10 OR queue_size > 20 OR inserts_in_queue > 10 OR log_max_index - log_pointer > 10 OR total_replicas < 2 OR active_replicas < total_replicas;
5 SQL 基准测试
ClickHouse 自带基准测试工具 clickhouse-benchmark,用法如下:
代码语言:javascript复制echo "select * from testcluster_shard_1.tc_shard_all;" |clickhouse-benchmark -i 5
代码语言:javascript复制-i 5 表示 SQL 执行 5 次
会显示 QPS、RPS 及各百分位的查询执行时间,上面的举例语句执行结果如下:
专栏《ClickHouse 实战笔记》系列文章推荐
第01期:Kafka 数据同步到 ClickHouse
第02期:ClickTail CH 实现 MySQL 慢查询实时展示
第03期:使用 Grafana 展示 ClickHouse 数据
第04期:ClickHouse 高可用集群搭建
第05期:ClickHouse 环形复制集群搭建