【问题标题】:Document length is not equal to buffer文档长度不等于缓冲区
【发布时间】:2016-02-19 21:57:26
【问题描述】:

我在尝试使用 PHP 脚本浏览我的一个集合中的所有文档时遇到了问题。该集合有大约 500k 个文档。该数据库运行 Mongo 2.6.9,在 Ubuntu 14.04 上运行。我正在使用这种语法来搜索集合:

$mongo = new MongoClient("mongodb://192.168.2.2:27017,192.168.2.3:27017/products?replicaSet=preplset");
$products = $mongo->products->content;
$cursor = $products->find();
while($cursor->hasNext() !== false) {
    echo "some information";
}

我收到以下错误消息(堆栈转储):

object(MongoCursorException)#24 (8) {
    ["message":protected]=> string(61) "Document length (74 bytes) is not equal to buffer (219 bytes)"
    ["string":"Exception":private]=> string(0) ""
    ["code":protected]=> int(42)
    ["file":protected]=> string(41) "...script.php"
    ["line":protected]=> int(29)
    ["trace":"Exception":private]=>
    array(1) {
        [0]=> array(6) {
            ["file"]=> string(41) "...value.php"
            ["line"]=> int(29)
            ["function"]=> string(7) "getNext"
            ["class"]=> string(11) "MongoCursor"
            ["type"]=> string(2) "->"
            ["args"]=> array(0) {}
        }
    }
    ["previous":"Exception":private]=> NULL
    ["host":"MongoCursorException":private]=> NULL
}

长度会发生变化。我见过十几种不同的长度。每次我运行这个脚本时,它都会通过不同百分比的集合。有时它会在 4k 个文档之后抛出此异常,有时是 180k。我确信我一直在对集合进行更改,它是一个不断更新的生产数据库

【问题讨论】:

  • 对于临时来说,我很乐意找到一种方法来捕获该异常并进行处理。我在 try/catch 块中有它,但是这个异常会导致我的脚本退出。

标签: php mongodb buffer document


【解决方案1】:

对于将来可能遇到此问题的任何人,我将发布我确定的问题原因以及我为解决该问题所采取的步骤。

首先,最后一次重启我的 mongodb 服务器解决了我的问题。如果您正在运行一个功能复制集,这可能值得首先尝试(在我在下面概述的所有工作之前)。

问题是由在我们复制集的 PRIMARY 节点上创建索引的人造成的,而没有明确指出要“在后台”创建索引(这是有问题的)。然后我使用“背景”选项集创建了各种索引(不是问题的一部分)。当我开始收到此错误消息时,我删除了所有索引,但它们仍保留在内存中(甚至可能在 PRIMARY 上的文件锁定中 -- 未验证)。

为了解决这个问题,我让每个成员(一个接一个)下线,然后在另一个(随机)端口上让他们上线(这样他们就不会与集合通信):

sudo mongod --port 44444 --dbpath /path/to/mongodb/files/ #default is /data/db

(需要路径,因为我的位置不是默认位置)

每台服务器单独加载后,我删除了所有索引,只重新创建了我真正想要的索引(然后重新索引以确保它们干净):

db.collection.dropIndexes() #this drops all indexes except _id index
db.collection.createIndex( { *indexfield*: 1 } ) #1 or -1 for ASC or DESC
db.collection.reIndex() #probably not necessary

然后我退出了mongodb服务并在正常情况下重新启动它,使其再次成为副本集的一部分。

这些步骤应该足以解决问题,但我发现每个节点(特别是 PRIMARY)的完全重新启动对于我的错误消息最终消失是必要的。这可能值得一开始尝试。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-05-17
    • 1970-01-01
    • 1970-01-01
    • 2014-04-20
    • 2014-07-08
    • 2010-09-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多