系统区域为tr_TR.UTF-8时Cassandra启动失败报SyntaxException
Apache Cassandra启动失败排查与修复建议
问题背景
通过以下源安装Apache Cassandra:deb [signed-by=/etc/apt/keyrings/apache-cassandra.asc] https://debian.cassandra.apache.org 50x main
启动服务后,systemctl显示状态为active (exited),正常数据库服务应处于active (running)状态。查看/var/log/cassandra/system.log发现启动异常,系统环境为Ubuntu 24.02。
错误日志详情
ERROR [main] 2024-09-25 14:50:58,401 CassandraDaemon.java:900 - Exception encountered during startup java.lang.ExceptionInInitializerError: null at org.apache.cassandra.service.CassandraDaemon.setupVirtualKeyspaces(CassandraDaemon.java:575) at org.apache.cassandra.service.CassandraDaemon.setup(CassandraDaemon.java:286) at org.apache.cassandra.service.CassandraDaemon.activate(CassandraDaemon.java:744) at org.apache.cassandra.service.CassandraDaemon.main(CassandraDaemon.java:878) Caused by: org.apache.cassandra.exceptions.SyntaxException: Failed parsing CREATE TABLE: [CREATE TABLE streaming ( id timeuuid, follower boolean, operation text, peers frozen<list<text>>, status text, progress_percentage float, last_updated_at timestamp, duration_millis bigint, failure_cause text, success_message text, bytes_to_receive bigint, bytes_received bigint, bytes_to_send bigint, bytes_sent bigint, files_to_receive bigint, files_received bigint, files_to_send bigint, files_sent bigint, status_ınıt_timestamp timestamp, status_start_timestamp timestamp, status_success_timestamp timestamp, status_faılure_timestamp timestamp, PRIMARY KEY ((id)))] reason: SyntaxException line 21:9 no viable alternative at character 'ı' at org.apache.cassandra.cql3.CQLFragmentParser.parseAny(CQLFragmentParser.java:48) at org.apache.cassandra.cql3.statements.schema.CreateTableStatement.parse(CreateTableStatement.java:465) at org.apache.cassandra.db.virtual.StreamingVirtualTable.<init>(StreamingVirtualTable.java:37) at org.apache.cassandra.db.virtual.SystemViewsKeyspace.<init>(SystemViewsKeyspace.java:47) at org.apache.cassandra.db.virtual.SystemViewsKeyspace.<clinit>(SystemViewsKeyspace.java:26) ... 4 common frames omitted
已尝试的无效操作
- 将系统区域从
tr_TR.UTF-8切换为en_US.UTF-8,修改GNOME设置并重新配置区域,问题未解决 - 切换到稳定版本41x,重新安装前彻底删除
/var/lib/cassandra和/var/log/cassandra目录,结果相同
问题根源定位
Cassandra自动创建streaming虚拟表时生成了无效字段名。查看StreamingVirtualTable.java的stateColumns()方法,发现代码使用无区域参数的toLowerCase():
sb.append(" status_").append(state.name().toLowerCase()).append("_timestamp timestamp, ");
在土耳其语区域中,大写字母“I”的小写转换结果是“ı”,导致生成的字段名如status_ınıt_timestamp包含CQL不识别的字符ı,触发语法解析错误。
修复方案
将toLowerCase()修改为toLowerCase(Locale.ENGLISH),强制使用英文规则进行大小写转换,避免区域化带来的字符异常。
内容的提问来源于stack exchange,提问作者anon
相关产品推荐
相关产品推荐

