Couchbase N1QL查询始终返回空,重建主索引失败求排查原因
这种突然失效的情况确实挺闹心的,尤其是已经重装过一次还复发,得揪根儿解决才行。结合你说的小型测试Bucket(文档不足500)的情况,咱们可以从这几个方向一步步排查:
先查Query Service的健康状态与日志
首先确认Couchbase的Query Service是不是正常运行着——在控制台的Services页面看看它的状态是不是Active,有没有异常重启的记录。然后去日志目录翻query.log(默认路径:Linux是/opt/couchbase/var/lib/couchbase/logs,Windows是C:\Program Files\Couchbase\Server\var\lib\couchbase\logs),重点找报错信息,比如索引加载失败、资源锁死或者权限相关的提示,这些往往是问题的突破口。验证索引的有效性
你的查询用到了order by date desc,肯定依赖对应的索引对吧?先跑这条语句看看索引状态:SELECT * FROM system:indexes WHERE keyspace_id = 'MYBUCKET'确认索引是不是处于
online状态,有没有deferred或者failed的标记。如果索引状态异常,试试重建索引(把date_idx换成你实际的索引名):DROP INDEX MYBUCKET.date_idx; CREATE INDEX date_idx ON MYBUCKET(date);另外可以先跑个不带索引的简单查询验证:
SELECT * FROM MYBUCKET LIMIT 10,如果这个能返回结果,那大概率是索引相关的问题。检查Bucket一致性与文档本身
看看Bucket的一致性级别是不是被误改成了Eventual?有时候一致性设置不合适会导致查询无法及时获取数据,你可以在Bucket的Settings页面临时改成Request Plus再执行查询试试。同时去控制台的Documents页面手动找一条符合someBool == false条件的文档,确认它确实存在,而且date字段的格式是正确的(比如是ISO标准日期或时间戳,不是格式错误的字符串)。重置Query Service的缓存或会话
有时候Query Service的内部缓存可能出现异常,不用重装整个Couchbase,先试试单独重启Query Service(控制台Services页面找到Query Service点击Restart)。如果重启没用,执行FLUSH QUERY CACHE;清空查询缓存后再试一次查询。确认用户权限是否正常
虽然之前一切正常,但也有可能用户权限被误修改了——去Security页面的Users里,确认你用来执行查询的账号有没有Query Select和Query Delete的权限,缺少权限也会导致查询无结果或者删除操作失效。
如果这些步骤都试过还是没找到原因,你可以把query.log里的错误片段或者执行查询时的具体报错信息贴出来,这样能更精准地定位问题。
内容的提问来源于stack exchange,提问作者MiDaa

