ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

ScyllaDB cqlsh 查询结果出现 --More-- 分页提示的排查与处理指南

ScyllaDB cqlsh 查询结果出现 --More-- 分页提示的排查与处理指南 ScyllaDB cqlsh 查询结果出现 --More-- 分页提示的排查与处理指南【免费下载链接】scylladbNoSQL data store using the Seastar framework, compatible with Apache Cassandra and Amazon DynamoDB项目地址: https://gitcode.com/GitHub_Trending/sc/scylladb导读本文面向 ScyllaDB 数据库管理员针对使用 cqlsh 执行SELECT查询时结果集末尾出现--More--提示、甚至出现空白页或部分行被丢弃的现象系统讲解分页paging机制的产生原因、--More--的真实含义、关闭分页的实操方法以及如何借助 tracing 定位问题根因。读完本文后你将能够判断查询结果不完整到底是服务端丢数据还是客户端分页交互造成的正常现象并掌握在脚本与交互式会话中分别获取完整结果集的方法。现象查询结果末尾出现--More--在 cqlsh 中执行类似下面的查询SELECT * FROM keyspace.table limit 100;结果只显示了少量行甚至只有一行并在末尾出现--More----More--是 cqlsh 客户端的分页提示符page delimiter它的含义是当前只展示了第一批page结果服务端还有更多数据可以继续读取。此时按下Enter 键cqlsh 会继续向后翻页并显示下一批行直到全部数据读取完毕、提示符消失为止。这属于 cqlsh 的默认行为而不是查询被截断或数据丢失。需要注意的是--More--提示符左侧显示的是当前页内容按下 Enter 后新的数据会继续追加打印在非交互式管道场景如把输出重定向到文件中这个提示符同样可能出现从而把看似不完整的结果写入文件。与官方文档的对应关系ScyllaDB 官方文档库中收录了两篇描述同一现象的知识库文章docs/kb/cqlsh-results.rst本文主体来源—— 标题为 When CQLSh query returns partial results with followed by Moredocs/kb/cqlsh-more.rst —— 标题为 CQL Query Does Not Display Entire Result Set内容互为印证并指向同一解决方案。两篇文章的受众均为ScyllaDB administrators说明该问题在运维排障场景中较为常见。根因cqlsh 默认分页与内部页大小机制--More--的出现根源在于 cqlsh 默认开启了分页paging且默认页大小为100 行。分页机制的工作方式如下cqlsh 向 ScyllaDB 发送查询时会在请求选项中携带页大小page size参数ScyllaDB 按照该页大小在服务端内部一次性取回一批结果即内部页大小并返回对应的分页状态paging statecqlsh 收到第一批结果后打印出来并在末尾显示--More--等待用户按 Enter 继续用户按 Enter 后cqlsh 携带上次返回的分页状态继续请求下一批直到取完。关键点在于查询使用分页时ScyllaDB 会按内部页大小取数但返回给客户端的内容可能与页边界并不对齐。这会导致两种用户不希望看到的输出部分结果被丢弃某些行虽然被服务端取回但在分页切换过程中没有呈现在最终输出里表现为结果变少出现空白页翻页时输出中出现空白段用户需要反复按 Enter 穿过空页体验上像是卡顿或无休止的--More--。无论哪种情况都容易让管理员误以为查询结果缺失实际上这是客户端分页交互与内部页边界共同作用的结果。源码佐证页大小与分页状态在协议层的传递在 ScyllaDB 的 CQL 传输层实现中页大小与分页状态是查询请求query options的标准字段。见 transport/request.hhlw_shared_ptrconst service::pager::paging_state paging_state; int32_t page_size -1; if (flags.containsoptions_flag::PAGE_SIZE()) { ... page_size v.assume_value(); } if (flags.containsoptions_flag::PAGING_STATE()) { ... paging_state service::pager::paging_state::deserialize(bv.assume_value()); }其中page_size -1表示未显式指定页大小沿用默认而分页状态paging_state则负责记录上一次取到哪个位置供后续翻页请求继续读取。分页相关的解析与默认值定义还可以在 cql3/query_options.hh 与 cql3/query_options.cc 中进一步查看。这印证了分页是协议层面的第一等公民能力任何 CQL 客户端包括 cqlsh只要开启分页都会按上述取一页 → 等下一页的模式工作。解决方案一在查询中关闭分页PAGING OFF如果希望一次查询就把全部结果作为单一结果集返回、不出现--More--分页提示可以在 cqlsh 会话中关闭分页PAGING OFF关闭后再执行同样的查询SELECT * FROM keyspace.table limit 100;结果将一次性完整打印不再出现--More--提示符。同样地也可以用PAGING ON重新开启分页或用PAGING page size in rows把页大小调整为指定行数例如PAGING 500。提示PAGING是 cqlsh 的内置命令而非 CQL 语句因此必须直接在 cqlsh 提示符下输入不能写进.cql脚本的查询语句中。官方命令参考cqlsh 官方文档docs/cql/cqlsh.rst对PAGING命令的说明如下作用为读取查询启用分页、禁用分页或设置页大小行数启用分页时每次只取一页数据并出现提示符以便获取下一页通用建议在交互式会话中通常建议保持分页开启以免一次性抓取并打印大量数据造成内存与屏幕刷屏压力用法PAGING ON PAGING OFF PAGING page size in rows因此是否需要关闭分页取决于场景场景建议交互式排查、结果量可能很大保持PAGING ON按 Enter 翻页避免一次性拉取过多数据需要把完整结果一次性输出到屏幕或脚本执行PAGING OFF后再查询需要控制每次取数规模用PAGING rows调整页大小配合 LIMIT 控制返回行数原文档强调keep the limit to 100 as well即关闭分页后仍然建议保留LIMIT子句如LIMIT 100。LIMIT限制的是查询返回的总行数与分页机制相互独立LIMIT限制最终返回的行数上限见 docs/cql/dml/select.rst 的 Limiting results 小节分页页大小限制的是每次传输的行数。两者可以同时使用LIMIT 100保证结果最多 100 行PAGING OFF保证这 100 行一次取回、不出现--More--。这样既获得了完整、干净的输出又避免了无限制查询拖垮节点或占用过多网络/内存资源。另外若问题仅出现在单个分区内返回行数过多还可以考虑PER PARTITION LIMIT子句它按分区限制返回行数与全局LIMIT可叠加使用语法与示例见 docs/cql/dml/select.rst。这与本文主题结果行数与预期不符属于同类的排查思路。解决方案二开启 TRACING 定位分页取数过程原文档建议打开 tracingTRACING ON并同时保留LIMIT 100。这是排查结果到底丢没丢的最直接手段。TRACING ON SELECT * FROM keyspace.table limit 100;开启后查询执行完毕 cqlsh 会打印完整的追踪事件trace包括请求被路由到哪些副本节点每个阶段读取了哪些分区partitions、扫描了多少行服务端实际返回的行数、是否触发多页读取每条消息的耗时µs帮助定位慢查询瓶颈。通过对比 trace 中服务端实际扫描/返回的行数与cqlsh 屏幕上打印的行数即可确认若 trace 显示行数 屏幕打印行数说明没有丢数据之前的缺失只是分页提示符造成的视觉误解若 trace 显示行数 屏幕打印行数则可进一步结合分页边界分析是否出现了原文档所述内部取回但未展示或空白页现象。与PAGING类似TRACING也是 cqlsh 内置命令用法为TRACING ON/TRACING OFF见 docs/cql/cqlsh.rst。建议排查结束后及时TRACING OFF避免后续每个查询都产生额外追踪开销。实战排查步骤总结将上述内容整理为可直接照做的排查流程确认现象执行SELECT ... LIMIT 100观察是否出现--More--记录按 Enter 后能否继续出数据理解行为明确--More--只是分页提示符不代表数据丢失内部页大小默认 100与返回边界可能不一致导致出现空页或部分行未展示决定取数方式需要完整结果一次性输出 →PAGING OFF后重跑查询需要控制传输规模 →PAGING rows调整页大小交互式浏览 → 保持PAGING ON按 Enter 翻页始终带上 LIMIT关闭分页时保留LIMIT如LIMIT 100防止全表扫描开启 tracing 验证TRACING ON重跑查询比对 trace 中的行数与屏幕输出确认服务端是否有返回差异结束后TRACING OFF按需调整若确认是单分区行数过多导致页边界异常可评估使用PER PARTITION LIMIT等语句约束结果规模。小结--More--是 cqlsh 分页机制的正常表现并非 ScyllaDB 查询丢数据。理解内部页大小取数 客户端按页展示的协作方式后管理员可以通过PAGING OFF一次性获取完整结果通过PAGING rows精细控制页大小并通过TRACING ONLIMIT组合验证服务端真实返回情况。本问题的原始描述与处置建议收录于 docs/kb/cqlsh-results.rst配套说明可见 docs/kb/cqlsh-more.rst协议层的分页参数实现可参考 transport/request.hhcqlsh 命令参考见 docs/cql/cqlsh.rst。【免费下载链接】scylladbNoSQL data store using the Seastar framework, compatible with Apache Cassandra and Amazon DynamoDB项目地址: https://gitcode.com/GitHub_Trending/sc/scylladb创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表