【问题标题】:MongoDB dump from 3.2, restore with 3.4, error index safe = nullMongoDB 从 3.2 转储,使用 3.4 恢复,错误索引安全 = null
【发布时间】:2016-12-08 09:54:39
【问题描述】:

我收到以下错误(转储 MongoDB 3.2)(恢复 MongoDB 3.4):

Failed: ngivr-dev.ledgerhelpers: error creating indexes for ngivr-dev.ledgerhelpers: **createIndex error:** **The field 'safe' is not valid for an index specification.** Specification: **{ unique: true, name: "ledgerId_1", safe: null, ns: "ngivr-dev.ledgerhelpers", background: true, key: { ledgerId: 1 } }**

看起来安全索引为空。但是我如何将它与 MongoDB 3.4 一起使用? 3.2还可以。

【问题讨论】:

    标签: mongodb mongodump mongorestore


    【解决方案1】:

    safe=true 不是索引规范。

    在 MongoDB 的 3.4 以下版本中,可以添加额外的索引规范。这些是由特定驱动程序使用的。

    在 3.4 中,mongodb 增加了对索引规范的验证:

    Ensuring that the specified index options are valid. Previous versions ignored invalid options.

    这就是您出现此错误的原因。 恐怕您需要确保您的 3.2 版本中的索引没有无效的索引规范,然后执行 mongodump。

    正如 kz_sergey 在他的回答中所说,您可以使用 --noIndexRestore mongorestore,这应该可以正常工作。

    【讨论】:

    • --noIndexRestore 选项应该用在mongorestore 命令中,而不是mongodump 命令中。
    • 你完全正确:我正在使用 mLab 托管我的 mongodb,需要时更新版本(从 2.x 到 3.2),我忽略了一些旧索引(在 2 中创建) .x) 包含属性safe: null。对我来说,正是这个旧规范造成了导入问题。在没有解决问题的情况下重新创建了这些索引。坦克!
    • 从 3.4 mmapv1 到 WiredTiger 时,我也遇到了 index safe = null 的错误
    【解决方案2】:

    为什么要恢复索引? --noIndexRestore 并再次创建它们。

    【讨论】:

    • 手动从头开始?这将需要大量的时间
    • 但是在没有索引的情况下恢复集合要快得多。也许我的方式更快,你可以检查一下。
    • 当然它更快,但是如果 db 具有或多或少的体面大小,没有索引的应用程序将无法工作。这就是大惊小怪的全部内容
    • 一开始只会更快——然后你必须加回人力和计算机时间才能在额外的步骤中加回索引。
    • 是否存在需要优化数据库恢复性能的用例?
    【解决方案3】:

    本着 Aymeric 评论的精神,您可以使用此 awk 单行代码替换 .metadata.json 文件中的“安全”属性。

    awk -i inplace '{gsub(",\"safe\":null", ""); print}' *.metadata.json

    在您的 MongoDB 导出目录中运行它。这种方法允许您保留索引,但删除“安全”选项。

    【讨论】:

      【解决方案4】:
      find . -type f -name "*.metadata.json" -exec sed -i 's/,"safe":null//g' {} \;
      

      这行得通,您将保留索引!它找到当前位置 (.) 中的所有文件,然后根据以下正则表达式使用相同的进程 (exec) 替换文件 (sed -i),这基本上是说所有出现的“安全”:null,什么都没有。

      替换“。”参数与存储 mongodb 导出的目录的路径。

      【讨论】:

      • 一些解释会很好。
      • 虽然此代码可以回答问题,但提供有关 如何为什么 解决问题的附加上下文将提高​​答案的长期价值。
      • 这行得通,您将保留您的索引!它的作用/含义:找到当前位置(。)中的所有文件,然后根据以下正则表达式使用相同的进程(exec)替换文件(sed -i),这基本上是说所有出现的“安全”:null没有。我知道它不是正则表达式的完美解释!
      【解决方案5】:

      由于我想保留所有索引,而上述方法都不适用于我的情况,我刚刚编辑了所有 *.metadata.json 文件并手动删除了所有出现的 "safe":true

      上下文:我正在使用一个无法升级到 4.x 或更高版本的旧数据库 - 它最初在 3.2 上运行,但没有 mongo 版本在带有 Apple Silicon 的新 Mac 上运行,所以我不得不使用 3.4 (可用的第一个版本)并从旧 Mac 转储并从新 Mac 恢复。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2019-06-27
        • 2017-07-09
        • 2014-04-16
        • 2014-04-25
        • 1970-01-01
        • 2017-01-06
        • 1970-01-01
        相关资源
        最近更新 更多