本文描述常见错误及处理办法。

连接集群超时

问题描述:通过clickhouse-client或者其他客户端工具连接集群的时候,报“connect timed out”错误。

解决办法:
  • 检查网络是否畅通。通过ping命令检查网络是否通畅,通过telnet命令探测数据库3306和8123端口是否开放。
  • 检查是否配置了ClickHouse白名单,配置方法请参见 设置白名单
  • 客户端机器IP是否正确。通常公司办公网内的机器IP经常变动,用户看到的不是正确的IP地址。通过访问专业IP探查服务确定真实IP,示例:whatsmyip

时间字段显示错误

问题描述:往表里写入时间戳数据,查询出来的结果与实际数据相差8小时。

解决办法:

  • 用SELECT timezone()语句,查看集群时区设置是否是Etc/UTC。
  • 用SELECT Now()语句,查看当前时间是否与当地时间一致。

查询结果不一致

问题描述:在数据停止写入的情况下,同一个select查询语句,每次查询到的结果不一致。通过select count(*) 数据只有整体数据的大概一半,或者数据一直在跳变。

解决办法:

  • 是否是多节点集群。多节点集群需要建分布式表,往分布式表里写入数据并查询,每次查询结果一致;否则每次查询到不同分片的数据,因此结果不一致。
  • 是否是多副本集群。多副本集群需要建Replicated系列表引擎的表,才能实现副本间数据同步;否则每次查到不同副本,所以结果不同

建表后,发现表时有时无

问题描述:建表后,连接集群写入或查询,有时候 表存在,有时候报错,提示表不存在。

解决办法:可能原因是云数据库ClickHouse支持分布式集群,但是create table只会在当前被连接的节点上创建集群,并不会在分布式集群的每个节点上都建表。建表时,请使用 create table <table_name> on cluster default语句,保证表在每个节点上都被创建。

set global on cluster default 语法报错

可能原因:

1)clickhouse-client在client端会进行语法解析,而set global on cluster default是我们在clickhouse-server中增加的语法。在clickhouse-client尚未更新到与clickhouse-server对齐的版本时,该语法会被client拦截。

2) set global on cluster default key = value; 中value是字符串,但是漏写了引号。

解决方法:

1)通过JDBC Driver等不会在client端解析语法的工具进行修改,比如DataGrip、DBeaver、或者直接写JDBC程序来执行该语句。

2)在字符串类型的value两侧加上引号。