Mongodb IndexBuildRetry继续重新启动服务器(noIndexBuild重试)



我有一个mongo数据库,因为唯一的索引问题而拒绝重新启动。由于DB没有启动,它被困在这个重新启动循环中,我无法连接到它来删除索引(或清除有缺陷的数据(。

我很乐意解决唯一键/索引问题,但不可能使用db.coll.dropIndexes()这样的命令。解决这个问题的最佳方法是什么?

选项1-从docker文件系统中删除索引

是否有其他方法可以直接从文件系统中删除索引?(我可以连接到docker几秒钟来运行命令(。

选项2-使用dokku设置noIndexBuildRetry标志

我使用的是Dokku,它似乎没有提供一种将建议的--noIndexBuildRetry标志传递给mongod进程的简单方法。

这篇文章提到了/etc/init.d/mongod配置文件,但我的docker映像中不存在它。如何在Dokku基础设施中设置此标记?

选项3

更新到mongo 4.x。它似乎可以以不同的方式处理索引,并且可以对我的重复密钥更宽容(并且不会阻止服务器启动(。

Mongo服务器日志:

2020-12-16T14:12:00.159+0000 E INDEX    [initandlisten] Index rebuilding did not complete: DuplicateKey: E11000 duplicate key error collection: db1.Events index: ns_1_hash_1 dup key: { : "userhash", : null }
2020-12-16T14:12:00.159+0000 I INDEX    [initandlisten] note: restart the server with --noIndexBuildRetry to skip index rebuilds
2020-12-16T14:12:00.160+0000 F -        [initandlisten] Fatal Assertion 26100 at src/mongo/db/index_rebuilder.cpp 136

使用docker run在容器中运行shell(例如bash(,而不是使用默认入口点,我认为它会启动mongod/mongos的一些组合。进入shell后,使用您喜欢的任何选项手动启动数据库。

可以使用MONGO_CONFIG_OPTIONS文件在dokku-mongo中自定义mongod标志。到目前为止,您需要在编辑此文件后重新启动容器(而不仅仅是服务(。

如果使用centos,则必须检查mongodb的systemd-conf。在这种情况下,您必须更改";OPTIONS";。在该行中添加"--noIndexBuildRetry"在下面的末尾,

Environment="OPTIONS=-f/etc/mongod.conf--noIndexBuildRetry">

然后通过重新加载您的系统ctl

sytemctl守护进程重新加载

然后重新启动您的mongodb,

systemctl重启mongodb

最新更新