ClickHouse插入数据报错:无法向只读模式表写入(错误码164)
解决ClickHouse插入时的"Cannot insert into table in readonly mode"错误
这个错误(Code:164)指向很明确——你的ClickHouse实例当前处于只读模式,导致无法执行插入操作。下面是一步步排查和解决的实操方案:
1. 检查用户配置的只读状态
首先打开ClickHouse的用户配置文件(通常路径是/etc/clickhouse-server/users.xml),定位到你使用的default用户对应的配置段,检查其关联profile的readonly设置:
<!-- 找到用户配置部分 --> <users> <default> <profile>default</profile> <!-- 其他用户配置项... --> </default> </users> <!-- 找到对应的profile配置 --> <profiles> <default> <!-- 确保readonly设置为0(0=可写,1=只读) --> <readonly>0</readonly> <!-- 其他profile配置项... --> </default> </profiles>
如果readonly值是1,改成0后重启ClickHouse服务:
sudo systemctl restart clickhouse-server
2. 检查ClickHouse启动参数
有时候启动ClickHouse时会手动添加--readonly参数强制开启只读模式,你可以排查启动配置:
- 若用systemd管理服务,查看
/etc/systemd/system/clickhouse-server.service里的ExecStart行,确认没有--readonly参数; - 若为手动启动,检查启动命令里是否包含该参数,去掉后重新启动实例。
3. 排查临时只读触发条件
ClickHouse会在一些异常场景下自动切换到只读模式,比如磁盘空间不足。你可以这样确认:
- 执行SQL查询当前readonly状态:
SELECT name, value FROM system.settings WHERE name = 'readonly'
如果返回的value是1,先检查磁盘空间:
df -h
如果磁盘已满,清理出足够空间后,执行以下命令关闭只读模式(需要管理员权限):
SET readonly = 0;
4. 验证Node.js连接配置
虽然你提供的连接代码里没有显式设置readonly,但可以再确认下是否有隐藏配置项。确保config对象里没有误加readonly参数,比如不要出现:
config: { // 禁止添加这行:readonly: 1 session_timeout : 60, output_format_json_quote_64bit_integers : 0, enable_http_compression : 0 }
5. 确认用户插入权限
最后,确保default用户拥有目标表的插入权限,若还未授权可以执行:
GRANT INSERT ON mydb.logs_1 TO default;
完成以上步骤后,再尝试用你的Node.js代码插入数据,应该就能正常执行了。
内容的提问来源于stack exchange,提问作者Ashish Tiwari




