当前位置: 首页 > 知识库问答 >
问题:

为什么我在启动时从删除的密钥空间得到Cassandra预准备语句重建错误?

强安和
2023-03-14

我正在运行一个2个节点(每个节点8个内核)的Cassandra 3.10集群,复制因子为1。随着时间的推移,我在我的cassandra集群上拥有并且已经拥有许多键空间。

我最近注意到,当我停下来/开始时,回来的时间非常慢。在我的两个系统中,我都看到了数以千计的“准备好的语句重建”堆栈跟踪,如下面的示例所示。log和debug.log。看起来Cassandra正在尝试为密钥空间准备语句,这些密钥空间已经不存在了,因为我之前已经删除了它们。

注意:当它启动时,我没有任何应用程序/客户端等连接到卡桑德拉。我还手动清理了提交日志,saved_caches以及先前删除键apces的数据文件,这在启动时没有任何区别。我看到我们的相同行为没有数据和提交日志。

有人知道Cassandra在启动时是从哪里得到这些信息的吗?或者知道如何在保留现有密钥空间的同时解决这个问题吗?

预准备语句重新创建警告:

WARN  [main] 2017-07-07 14:44:14,362 QueryProcessor.java:159 - prepared statement recreation error: update metric_resource set attributes = ? where t_uid ='TUID1' and metric_name =? and resource_name=?
org.apache.cassandra.db.KeyspaceNotDefinedException: Keyspace test_keyspace_1 does not exist
        at org.apache.cassandra.thrift.ThriftValidation.validateKeyspace(ThriftValidation.java:85) ~[apache-cassandra-3.10.jar:3.10]
        at org.apache.cassandra.thrift.ThriftValidation.validateColumnFamily(ThriftValidation.java:109) ~[apache-cassandra-3.10.jar:3.10]
        at org.apache.cassandra.cql3.statements.ModificationStatement$Parsed.prepare(ModificationStatement.java:796) ~[apache-cassandra-3.10.jar:3.10]
        at org.apache.cassandra.cql3.statements.ModificationStatement$Parsed.prepare(ModificationStatement.java:789) ~[apache-cassandra-3.10.jar:3.10]
        at org.apache.cassandra.cql3.QueryProcessor.getStatement(QueryProcessor.java:557) ~[apache-cassandra-3.10.jar:3.10]
        at org.apache.cassandra.cql3.QueryProcessor.prepare(QueryProcessor.java:412) ~[apache-cassandra-3.10.jar:3.10]
        at org.apache.cassandra.cql3.QueryProcessor.preloadPreparedStatement(QueryProcessor.java:154) ~[apache-cassandra-3.10.jar:3.10]
        at org.apache.cassandra.service.CassandraDaemon.setup(CassandraDaemon.java:358) [apache-cassandra-3.10.jar:3.10]
        at org.apache.cassandra.service.CassandraDaemon.activate(CassandraDaemon.java:601) [apache-cassandra-3.10.jar:3.10]
        at org.apache.cassandra.service.CassandraDaemon.main(CassandraDaemon.java:735) [apache-cassandra-3.10.jar:3.10]

与不存在的密钥空间相关的其他堆栈跟踪:

org.apache.cassandra.db.KeyspaceNotDefinedException: Keyspace test_keyspace1 does not exist
        at org.apache.cassandra.thrift.ThriftValidation.validateKeyspace(ThriftValidation.java:85) ~[apache-cassandra-3.10.jar:3.10]
        at org.apache.cassandra.thrift.ThriftValidation.validateColumnFamily(ThriftValidation.java:109) ~[apache-cassandra-3.10.jar:3.10]
        at org.apache.cassandra.cql3.statements.SelectStatement$RawStatement.prepare(SelectStatement.java:920) ~[apache-cassandra-3.10.jar:3.10]
        at org.apache.cassandra.cql3.statements.SelectStatement$RawStatement.prepare(SelectStatement.java:915) ~[apache-cassandra-3.10.jar:3.10]
        at org.apache.cassandra.cql3.QueryProcessor.getStatement(QueryProcessor.java:557) ~[apache-cassandra-3.10.jar:3.10]
        at org.apache.cassandra.cql3.QueryProcessor.prepare(QueryProcessor.java:412) ~[apache-cassandra-3.10.jar:3.10]
        at org.apache.cassandra.cql3.QueryProcessor.preloadPreparedStatement(QueryProcessor.java:154) ~[apache-cassandra-3.10.jar:3.10]
        at org.apache.cassandra.service.CassandraDaemon.setup(CassandraDaemon.java:358) [apache-cassandra-3.10.jar:3.10]
        at org.apache.cassandra.service.CassandraDaemon.activate(CassandraDaemon.java:601) [apache-cassandra-3.10.jar:3.10]
        at org.apache.cassandra.service.CassandraDaemon.main(CassandraDaemon.java:735) [apache-cassandra-3.10.jar:3.10]

共有1个答案

方季同
2023-03-14

我想出来了。卡桑德拉将准备好的语句写入系统。prepared_statements密钥空间。不太确定他们是什么时候推出这个功能的。它似乎将所有准备好的语句保留在该表中,并在重新启动时尝试读取它们。我的实例中有数百万行,包括以前删除的键区中的行。

截断表格系统。preparedstatements为我解决了这个问题,启动时间从几小时到几秒。

截断表格:

truncate system.prepared_statements;
 类似资料:
  • 我有以下疑问: 我得到以下MySQL错误: 下面是我的表架构:

  • 我想知道使用比有什么好处? 最简单的方法是: 如您所见,我可以将数据绑定到< code>preparedStatement而无需< code>boundStatements。< code>boundStatement在哪里有用?

  • 我的应用程序有很多使用语句编写的JDBC查询,因此容易受到SQL注入的影响。不幸的是,这个应用程序是大约10年前开发的,可能开发人员不知道准备语句。 我知道解决这个问题的最好方法是使用PreparedStatement,但是在整个应用程序中转换它是非常繁琐的。此外,为SQL注入编写任何类型的模式匹配可能非常棘手,因为像Select、insert、union等关键字都是英语单词,它们也可能出现在用户

  • 是否可以使用 Python 卡桑德拉驱动程序的预准备语句将时间戳值插入到卡桑德拉键空间中?当我尝试这样做时,我收到以下错误消息: 预期:<code> 我看到这个问题以前已经讨论过了。但不确定是否已经解决了。怎么做?使用简单的语句做同样的事情效率低下。

  • 我已经用这个链接备份了我在卡桑德拉的密钥空间cassandra-backup.sh 为了恢复,我写了一个脚本,从包含快照的备份文件夹中复制内容,并粘贴到 /var/lib/cassandra/data/mykeypsace/下的相应目录中,但是当我看到mykeyspace的表内容时,没有恢复任何内容。例如,备份文件夹:path/mykeyspace/tableOne/snapshot/all-co

  • 我在使用DataStax php驱动程序1.0.0-rc和Cassandra 2.2.3的Prepared Statements时遇到了一个奇怪的错误。我在这一行遇到了一条异常: 我看到了这个错误: 下面是用于与Cassandra通信的类存根: 如果我将Simple Statemetn与标准select查询一起使用,它会起作用。 有什么建议吗?