我有一个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