重启服务器后ClickHouse服务无法启动,请求排查解决
重启服务器后ClickHouse服务无法启动,请求排查解决
看起来你遇到了ClickHouse崩溃后无法重启的棘手问题,先别慌,我们从你提供的崩溃日志入手一步步分析:
首先整理你给出的核心崩溃日志,方便后续排查:
2024.03.10 16:15:23.798502 [ 110215 ] {} <Fatal> BaseDaemon: ########## Short fault info ############ 2024.03.10 16:15:23.798552 [ 110215 ] {} <Fatal> BaseDaemon: (version 23.12.2.59 (official build), build id: 7F4C1A822F9C67A4D137A58F9A95BD4B0F1B6A8A, git hash: 17ab210e76170917215be8cc3ae07d465a341d42) (from thread 110196) Received signal 6 2024.03.10 16:15:23.798584 [ 110215 ] {} <Fatal> BaseDaemon: Signal description: Aborted 2024.03.10 16:15:23.798591 [ 110215 ] {} <Fatal> BaseDaemon: 2024.03.10 16:15:23.798608 [ 110215 ] {} <Fatal> BaseDaemon: Stack trace: 0x00007fa96aaa800b 0x00007fa96aa87859 0x0000000016eacf24 0x0000000016eca40d 0x000000000c9786e8 0x0000000012de0bb3 0x0000000012e083e7 0x0000000012eb2a92 0x00000000109cab4d 0x00000000109dd644 0x00000000109e1117 0x00000000109d847e...
日志里的关键信息:你的ClickHouse版本是23.12.2.59,进程收到了信号6(SIGABRT)——这通常意味着程序触发了断言失败、内存访问违规导致内核终止进程,或是磁盘/数据损坏引发的崩溃。
下面是具体的排查和解决步骤:
第一步:排查基础磁盘与权限问题
先排除最容易忽略的环境问题:- 用
df -h检查磁盘是否已满,ClickHouse磁盘满时会直接崩溃且无法启动;用df -i检查inode是否耗尽。 - 检查ClickHouse数据目录权限,默认路径是
/var/lib/clickhouse/,执行sudo ls -ld /var/lib/clickhouse/,确保所有者和组是clickhouse:clickhouse,如果不对用sudo chown -R clickhouse:clickhouse /var/lib/clickhouse/修复。 - 清理残留锁文件:如果之前崩溃残留了PID锁,执行
sudo rm -f /var/run/clickhouse/clickhouse-server.pid,再尝试重启服务。
- 用
第二步:强制恢复数据启动ClickHouse
如果是数据损坏导致启动时崩溃,可以尝试强制恢复:- 在ClickHouse数据目录下创建恢复标记文件:
sudo touch /var/lib/clickhouse/flags/force_restore_data,这个文件会让ClickHouse启动时跳过部分数据一致性检查,尝试恢复损坏的表。 - 尝试启动服务:
sudo systemctl start clickhouse-server,如果能启动,立刻备份重要表的数据(比如用INSERT INTO OUTFILE ...或者clickhouse-backup工具)。
- 在ClickHouse数据目录下创建恢复标记文件:
第三步:定位崩溃核心模块(核心转储分析)
日志里的栈跟踪不完整,我们可以通过系统核心转储定位问题:- 用
coredumpctl list clickhouse-server查看最近的核心转储记录,找到对应崩溃时间的条目,记录核心文件路径。 - 用GDB分析核心转储:
gdb /usr/bin/clickhouse-server <核心文件路径>,输入bt full查看完整栈跟踪,就能知道是哪个函数触发的崩溃(比如MergeTree存储引擎、内存分配或是某个查询组件)。
- 用
第四步:跳过损坏表临时启动服务
如果确定是某张表损坏导致无法启动,可以临时跳过该表:- 编辑ClickHouse主配置文件
/etc/clickhouse-server/config.xml,在<yandex>标签内添加:<tables> <table_name> <name>your_broken_table_name</name> <skip>1</skip> </table_name> </tables> - 或者启动时直接加参数:
sudo clickhouse-server --skip-broken-tables,启动后尽快备份其他正常表的数据,再修复或重建损坏表。
- 编辑ClickHouse主配置文件
第五步:修复损坏的表数据
如果是MergeTree表损坏,尝试以下修复方式:- 先备份该表的元数据和数据:
sudo cp -r /var/lib/clickhouse/data/default/your_broken_table /tmp/your_broken_table_backup - 用
clickhouse-local导出可恢复的数据:clickhouse-local --query "SELECT * FROM file('/var/lib/clickhouse/data/default/your_broken_table/*') FORMAT CSV" > /tmp/your_table_backup.csv - 删除损坏的表:
DROP TABLE your_broken_table,重建表结构后从备份文件导入数据。
- 先备份该表的元数据和数据:
第六步:检查系统资源限制
ClickHouse对文件描述符等资源要求很高,检查/etc/security/limits.conf中是否有以下配置:clickhouse soft nofile 262144 clickhouse hard nofile 262144 clickhouse soft nproc 131072 clickhouse hard nproc 131072如果没有,添加后执行
ulimit -n 262144临时生效,再重启服务。
如果以上步骤都无法解决,考虑升级到同大版本的最新小版本(比如23.12.7.5)——你当前用的23.12.2.59可能存在已知的崩溃bug,升级后再尝试启动。
备注:内容来源于stack exchange,提问作者mohammadjavadkh




