我有2个集合:A(3.8M docs)和B(1.7M docs)
我有一个PHP脚本,我从shell运行:
循环遍历A中的每条记录
~60%的时间,它在B上执行findOne(使用_id)
做一些基本的数学,创建一个PHP数组
一旦完成了a中所有文档的循环:
4)循环遍历php数组
5)插入集合C
在(1)期间,我一直得到:PHP致命错误:未捕获异常'MongoCursorException',消息'找不到光标'最后处理的项目是#8187 of 3872494.
real 1m25.478s user 0m0.076s sys 0m0.064s
再次运行它,代码没有变化,在项目#19826/3872495处引发了异常
real 3m19.144s user 0m0.120s sys 0m0.072s
再次,#8181/387249
real 1m31.110s user 0m0.036s sys 0m0.048s
是的,我意识到我可以(并且可能应该)捕获异常......但是......为什么它甚至被抛出?特别是在进入数据库的这种不同的经过时间/深度.
如果有帮助,我的设置是3节点副本集(2 + arb).我让二级离线并尝试了主要的运行.相同的结果(处理的结果数量和次数不同,但总是抛出Cursor Not Found异常).
是的,我意识到我可以(并且可能应该)抓住异常......
是的,这绝对是第一件事.异常发生有几十个合理的原因?当主要离线并变得无法访问时,您认为会发生什么?
......为什么甚至被抛出?
有几个潜在的原因,但让我们直接切入你看到的错误代码.
官方PHP文档在这里.
从该页面引用:驱动程序试图从数据库中获取更多结果,但数据库没有查询记录.这通常意味着光标在服务器端超时...
MongoDB PHP驱动程序有两种不同的超时:
连接超时
游标超时
你正在达到游标超时.您可以连接到数据库,但您的查询"时间不多了".
可能的修复:
延长光标超时.或者您可以将其设置为零并使其永久持续.
分批完成这项工作._ids
从A中获取前1000个,处理它们然后标记您已经这样做了.然后获得_ids
比上次运行更大的下一个1000 ,依此类推.
我会建议#2以及处理异常.即使这些不能完全解决问题,它也可以帮助您隔离和缓解问题.