运维管理19 分钟阅读
ClickHouse 运维命令 100 条
ClickHouse 的运维思路与传统 OLTP 数据库差异很大。很多问题并不是行锁或事务阻塞,而是分区设计不合理、数据分片不均、后台合并堆积、Mutation 长时间未完成、复制队列阻塞、查询内存超限或者磁盘上的数据 Part 数量过多。
2026年7月31日阅读—点赞—收藏—
dba100clickhouse墨力计划
在知识库中专注阅读,并随时返回相关工具与课程
ClickHouse 的运维思路与传统 OLTP 数据库差异很大。很多问题并不是行锁或事务阻塞,而是分区设计不合理、数据分片不均、后台合并堆积、Mutation 长时间未完成、复制队列阻塞、查询内存超限或者磁盘上的数据 Part 数量过多。
ClickHouse 的运维思路与传统 OLTP 数据库差异很大。很多问题并不是行锁或事务阻塞,而是分区设计不合理、数据分片不均、后台合并堆积、Mutation 长时间未完成、复制队列阻塞、查询内存超限或者磁盘上的数据 Part 数量过多。
下面整理了 ClickHouse DBA 日常使用频率较高的 100 条命令,覆盖连接、数据库对象、MergeTree 表、分区、查询诊断、系统指标、数据 Part、Mutation、分布式集群、复制、用户权限、备份恢复和服务日志等场景。
本文主要面向当前主流 ClickHouse 版本。不同版本、开源自建环境和 ClickHouse Cloud 之间可能存在差异,执行前应先确认版本、部署架构和账号权限。文中的集群名、数据库名、表名、路径、IP 和用户均为示例。
DROP、TRUNCATE、KILL、ALTER DELETE、OPTIMIZE FINAL、停止后台合并、恢复副本和恢复备份等操作具有风险,生产环境执行前必须确认影响范围。
1clickhouse-client \2 --host 192.168.1.10 \3 --port 9000 \4 --user dba \5 --password指定数据库:
1clickhouse-client --host 192.168.1.10 --database appdb --user dba --password1curl -sS 'https://clickhouse.example.com:8443/?query=SELECT%201'生产环境应使用认证和 TLS,避免将密码直接写入命令历史。
1SELECT version();1SELECT hostName();1SELECT2 currentDatabase(),3 currentUser();1SELECT2 timezone(),3 now(),4 now('UTC');1SELECT2 uptime() AS uptime_seconds,3 formatReadableTimeDelta(uptime()) AS uptime;1SELECT2 name,3 value4FROM system.server_settings5WHERE name IN ('tcp_port', 'http_port', 'https_port', 'tcp_port_secure');1SELECT *2FROM system.build_options3ORDER BY name;1SELECT *2FROM system.warnings;1SHOW DATABASES;详细查看:
1SELECT name, engine, data_path, metadata_path2FROM system.databases3ORDER BY name;1CREATE DATABASE appdb;集群范围创建:
1CREATE DATABASE appdb ON CLUSTER production_cluster;1SHOW TABLES FROM appdb;1DESCRIBE TABLE appdb.events;1SHOW CREATE TABLE appdb.events;1SELECT *2FROM system.table_engines3ORDER BY name;1SELECT2 database,3 name,4 engine,5 partition_key,6 sorting_key,7 primary_key,8 total_rows,9 total_bytes10FROM system.tables11WHERE database = 'appdb'12ORDER BY total_bytes DESC;1RENAME TABLE appdb.events TO appdb.events_old;1TRUNCATE TABLE appdb.stage_events;集群范围执行:
1TRUNCATE TABLE appdb.stage_events ON CLUSTER production_cluster;1DROP TABLE appdb.events_old;删除不可回退,必须先确认备份和依赖关系。
1CREATE TABLE appdb.events2(3 event_date Date,4 event_time DateTime,5 user_id UInt64,6 event_type LowCardinality(String),7 payload String8)9ENGINE = MergeTree10PARTITION BY toYYYYMM(event_date)11ORDER BY (event_date, user_id, event_time);ORDER BY 决定数据物理排序和稀疏索引结构,是 ClickHouse 表设计中最重要的部分之一。
1CREATE TABLE appdb.events_local ON CLUSTER production_cluster2(3 event_date Date,4 event_time DateTime,5 user_id UInt64,6 event_type LowCardinality(String)7)8ENGINE = ReplicatedMergeTree(9 '/clickhouse/tables/{shard}/appdb/events_local',10 '{replica}'11)12PARTITION BY toYYYYMM(event_date)13ORDER BY (event_date, user_id, event_time);1CREATE TABLE appdb.events_all ON CLUSTER production_cluster2AS appdb.events_local3ENGINE = Distributed(4 production_cluster,5 appdb,6 events_local,7 cityHash64(user_id)8);1ALTER TABLE appdb.events2ADD COLUMN source LowCardinality(String) DEFAULT 'unknown';1ALTER TABLE appdb.events2MODIFY COLUMN payload String;修改类型可能触发数据重写,应评估表规模和兼容性。
1ALTER TABLE appdb.events2DROP COLUMN payload;1ALTER TABLE appdb.events2ADD INDEX idx_event_type event_type TYPE set(100) GRANULARITY 4;对已有数据物化索引:
1ALTER TABLE appdb.events2MATERIALIZE INDEX idx_event_type;1SELECT2 database,3 table,4 name,5 type,6 expression,7 granularity8FROM system.data_skipping_indices9WHERE database = 'appdb'10 AND table = 'events';1ALTER TABLE appdb.events2MODIFY TTL event_date + INTERVAL 180 DAY DELETE;1ALTER TABLE appdb.events2MATERIALIZE TTL;该操作可能触发大量后台合并和数据删除,应在低峰期评估执行。
1INSERT INTO appdb.events2VALUES3(4 '2026-07-27',5 '2026-07-27 10:00:00',6 1001,7 'login',8 '{}'9);1INSERT INTO appdb.events2SELECT *3FROM appdb.events_stage4WHERE event_date = '2026-07-27';1SELECT count()2FROM appdb.events;1SELECT2 event_type,3 count() AS rows4FROM appdb.events5WHERE event_time >= now() - INTERVAL 1 DAY6GROUP BY event_type7ORDER BY rows DESC;1EXPLAIN2SELECT count()3FROM appdb.events4WHERE user_id = 1001;1EXPLAIN PIPELINE2SELECT count()3FROM appdb.events4WHERE event_date >= today() - 7;1EXPLAIN indexes = 12SELECT *3FROM appdb.events4WHERE event_date = today()5 AND user_id = 1001;1clickhouse-client \2 --query="SELECT * FROM appdb.events FORMAT CSVWithNames" \3 > events.csv1clickhouse-client \2 --query="INSERT INTO appdb.events FORMAT CSV" \3 < events.csv如果文件包含表头,应使用与文件匹配的格式。
1clickhouse-local \2 --file events.csv \3 --input-format CSVWithNames \4 --query "SELECT event_type, count() FROM table GROUP BY event_type"1SELECT2 query_id,3 user,4 address,5 elapsed,6 read_rows,7 read_bytes,8 memory_usage,9 query10FROM system.processes11ORDER BY elapsed DESC;1SELECT2 hostName() AS host,3 query_id,4 user,5 elapsed,6 memory_usage,7 query8FROM clusterAllReplicas('production_cluster', system.processes)9ORDER BY elapsed DESC;1KILL QUERY2WHERE query_id = 'query-id'3SYNC;1SELECT2 event_time,3 query_id,4 user,5 exception_code,6 exception,7 query8FROM system.query_log9WHERE type IN ('ExceptionBeforeStart', 'ExceptionWhileProcessing')10 AND event_time >= now() - INTERVAL 1 HOUR11ORDER BY event_time DESC;1SELECT2 query_id,3 user,4 query_duration_ms,5 read_rows,6 formatReadableSize(read_bytes) AS read_size,7 formatReadableSize(memory_usage) AS memory,8 query9FROM system.query_log10WHERE type = 'QueryFinish'11 AND event_time >= now() - INTERVAL 1 HOUR12ORDER BY query_duration_ms DESC13LIMIT 20;1SELECT2 query_id,3 user,4 formatReadableSize(memory_usage) AS memory,5 query_duration_ms,6 query7FROM system.query_log8WHERE type = 'QueryFinish'9 AND event_time >= now() - INTERVAL 1 HOUR10ORDER BY memory_usage DESC11LIMIT 20;1SELECT2 metric,3 value,4 description5FROM system.metrics6ORDER BY metric;1SELECT2 event,3 value,4 description5FROM system.events6ORDER BY value DESC;1SELECT2 metric,3 value4FROM system.asynchronous_metrics5ORDER BY metric;1SYSTEM FLUSH LOGS;执行后再查询 system.query_log,可以减少日志尚未落表造成的遗漏。
1SELECT2 name,3 path,4 formatReadableSize(free_space) AS free,5 formatReadableSize(total_space) AS total,6 round(free_space * 100 / total_space, 2) AS free_pct7FROM system.disks;1SELECT *2FROM system.storage_policies3ORDER BY policy_name, volume_name, volume_priority;1SELECT2 database,3 table,4 sum(rows) AS rows,5 formatReadableSize(sum(bytes_on_disk)) AS disk_size6FROM system.parts7WHERE active8GROUP BY database, table9ORDER BY sum(bytes_on_disk) DESC10LIMIT 20;1SELECT2 database,3 table,4 partition,5 sum(rows) AS rows,6 count() AS parts,7 formatReadableSize(sum(bytes_on_disk)) AS disk_size8FROM system.parts9WHERE active10 AND database = 'appdb'11 AND table = 'events'12GROUP BY database, table, partition13ORDER BY partition;1SELECT2 database,3 table,4 count() AS active_parts5FROM system.parts6WHERE active7GROUP BY database, table8ORDER BY active_parts DESC;Part 数量过多通常与写入批次过小或后台合并跟不上有关。
1SELECT2 database,3 table,4 elapsed,5 progress,6 num_parts,7 result_part_name,8 formatReadableSize(total_size_bytes_compressed) AS size9FROM system.merges10ORDER BY elapsed DESC;1OPTIMIZE TABLE appdb.events FINAL;FINAL 可能产生大量 CPU、磁盘 I/O 和临时空间消耗,不应作为日常定时维护命令。
1SELECT2 database,3 table,4 mutation_id,5 command,6 create_time,7 parts_to_do,8 is_done,9 latest_fail_reason10FROM system.mutations11ORDER BY create_time DESC;1ALTER TABLE appdb.events2DELETE WHERE event_date < today() - 180;该操作会创建 Mutation。大范围删除优先考虑按分区删除。
1ALTER TABLE appdb.events2DROP PARTITION '202601';按分区删除通常比行级 Mutation 更高效,但必须确认分区表达式和目标分区值。
1SELECT2 cluster,3 shard_num,4 replica_num,5 host_name,6 host_address,7 port,8 is_local9FROM system.clusters10ORDER BY cluster, shard_num, replica_num;1SELECT2 hostName() AS host,3 version()4FROM clusterAllReplicas('production_cluster', system.one);1SELECT2 database,3 table,4 is_leader,5 is_readonly,6 is_session_expired,7 queue_size,8 inserts_in_queue,9 merges_in_queue,10 absolute_delay,11 zookeeper_exception12FROM system.replicas13ORDER BY absolute_delay DESC;1SELECT2 database,3 table,4 replica_name,5 position,6 node_name,7 type,8 create_time,9 num_tries,10 last_exception11FROM system.replication_queue12ORDER BY create_time;1SYSTEM SYNC REPLICA appdb.events_local;1SYSTEM RESTART REPLICA appdb.events_local;执行期间表会短暂不可用,只应在确认副本状态异常后使用。
1SELECT2 database,3 table,4 data_path,5 is_blocked,6 error_count,7 last_exception8FROM system.distribution_queue9ORDER BY error_count DESC;1SYSTEM FLUSH DISTRIBUTED appdb.events_all;1SELECT *2FROM system.zookeeper_connection;1SELECT2 entry,3 host,4 port,5 status,6 exception_code,7 exception_text,8 query9FROM system.distributed_ddl_queue10ORDER BY entry DESC;1SHOW USERS;详细查看:
1SELECT *2FROM system.users;1CREATE USER appuser2IDENTIFIED WITH sha256_password BY 'Replace_With_Strong_Password';1ALTER USER appuser2IDENTIFIED WITH sha256_password BY 'Replace_With_New_Strong_Password';1CREATE ROLE readonly_role;1GRANT SELECT ON appdb.* TO readonly_role;2GRANT readonly_role TO appuser;1REVOKE SELECT ON appdb.* FROM readonly_role;1SHOW GRANTS FOR appuser;1SELECT2 name,3 value,4 changed,5 description6FROM system.settings7ORDER BY name;1SET max_memory_usage = 10000000000;该设置只影响当前会话,具体值应结合节点内存和并发量确定。
1SET max_execution_time = 300;1BACKUP TABLE appdb.events2TO Disk('backups', 'appdb_events_20260727.zip');需要先在服务器配置中定义 backups 磁盘。
1BACKUP DATABASE appdb2TO Disk('backups', 'appdb_20260727.zip');1BACKUP DATABASE appdb2TO Disk('backups', 'appdb_async_20260727.zip')3ASYNC;1SELECT *2FROM system.backups3ORDER BY start_time DESC;1RESTORE TABLE appdb.events2FROM Disk('backups', 'appdb_events_20260727.zip');1RESTORE TABLE appdb.events AS appdb.events_restore2FROM Disk('backups', 'appdb_events_20260727.zip');恢复到新表更适合先做数据校验。
1ALTER TABLE appdb.events2FREEZE PARTITION '202607'3WITH NAME 'events_202607';FREEZE 生成硬链接快照,但不等同于完整的异地备份。
1SYSTEM UNFREEZE WITH NAME 'events_202607';1SYSTEM STOP MERGES appdb.events;1SYSTEM START MERGES appdb.events;长期停止合并会造成 Part 堆积,只能作为短期故障处理手段。
1systemctl status clickhouse-server1systemctl start clickhouse-server1systemctl stop clickhouse-server停库前应确认业务、复制和后台任务状态。
1systemctl restart clickhouse-server1journalctl -u clickhouse-server --since "1 hour ago"1tail -200 /var/log/clickhouse-server/clickhouse-server.log2tail -200 /var/log/clickhouse-server/clickhouse-server.err.log实际路径以配置文件为准。
1ps -ef | grep '[c]lickhouse-server'1ss -lntp | grep -E ':(8123|9000|9009|8443|9440)\b'不同协议和安全配置使用的端口可能不同。
1df -h2df -i3iostat -x 1 5ClickHouse 对磁盘吞吐和延迟较敏感,空间告警还要结合 Part、Merge、Mutation 和复制队列一起分析。
1SELECT 'running_queries' AS item, toString(count()) AS value2FROM system.processes3UNION ALL4SELECT 'active_merges', toString(count())5FROM system.merges6UNION ALL7SELECT 'unfinished_mutations', toString(count())8FROM system.mutations9WHERE NOT is_done10UNION ALL11SELECT 'replica_queue', toString(sum(queue_size))12FROM system.replicas13UNION ALL14SELECT 'disk_free',15 arrayStringConcat(16 groupArray(concat(name, ':', formatReadableSize(free_space))),17 ', '18 )19FROM system.disks;ClickHouse DBA 排查问题时,不能只盯着 CPU 和一条慢 SQL。更有效的顺序通常是先确认磁盘空间和节点状态,再看 system.processes、system.query_log、system.parts、system.merges、system.mutations、system.replicas 和 system.replication_queue。
如果 Part 数量持续增长,通常要检查写入批次和合并能力;如果 Mutation 长时间不结束,要判断是否扫描和重写了过多数据;如果副本延迟,则要进一步区分网络、Keeper、复制队列和磁盘 I/O 问题。
真正适合生产环境的 ClickHouse 运维,不是频繁执行 OPTIMIZE FINAL,而是通过合理的分区、排序键、批量写入、存储策略和复制设计,让后台任务能够长期稳定运行。