组合使用cbq与cbimport的Couchbase脚本卡在SELECT命令如何解决
问题根因
你当前脚本有两类核心错误直接导致卡住:
- 将
cbq的交互式内部命令直接写在了shell脚本的顶层,shell执行完cbq -u Administrator ...命令后会直接进入cbq的交互式等待模式,不会主动把后续的\REDIRECT、SELECT、\EXIT等命令传递给cbq进程,因此会一直卡住无响应。 - 写在SELECT语句后的
--output="temp.txt"是无效写法,--output是cbq的启动参数,不能加在N1QL语句中,该写法不会生效。
修复方案
你可以通过here document的方式把所有cbq内部命令一次性传给cbq进程,执行完成后自动退出cbq回到shell继续执行后续的cbimport命令。
修改后的可用脚本示例
echo "Hello World" # 调用cbq并传入所有N1QL及cbq内部命令 cbq -u Administrator -p Administrator -e "http://localhost:8093" << EOF \REDIRECT temp.txt; SELECT * FROM \`sample.data\` where id="106"; \REDIRECT OFF; \EXIT; EOF # 执行数据导入 cbimport json -c http://{target-cluster}:8091 -u Administrator -p Administrator -b sample.data -d file://C:\Users\myusername\Desktop\temp.txt -f list -g %docId%;
批量/海量迁移优化建议
- 优先使用Couchbase官方提供的
cbtransfer工具,原生支持跨集群全量/增量数据迁移,无需处理中间文件,性能远高于自定义的导出导入脚本,也不会出现单查询卡住的问题。 - 如果必须使用cbq导出,可给cbq添加
--quiet参数减少冗余日志输出,导出大量数据时给SELECT语句添加分页逻辑,避免单次查询返回数据量过大导致超时或内存溢出。 - 你也可以直接在cbq启动时添加
-o temp.txt参数指定输出文件,无需额外执行\REDIRECT命令,写法更简洁。
内容的提问来源于stack exchange,提问作者sagar verma
相关产品推荐
相关产品推荐

