You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

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会在一些异常场景下自动切换到只读模式,比如磁盘空间不足。你可以这样确认:

  1. 执行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

火山引擎 最新活动