【问题标题】:create index on existing collection on a MongoDB replica set (PRIMARY)在 MongoDB 副本集 (PRIMARY) 上的现有集合上创建索引
【发布时间】:2021-01-11 15:25:06
【问题描述】:

我想在 MongoDB 副本集中的现有集合上添加索引。 这个副本集目前只有一个主副本,并且以这种方式配置为能够使用 MongoDB 更改流。
我使用以下命令登录 Mongo shell:
mongo -u <Account>
其中<Account> 是角色为“userAdminAnyDatabase”的帐户。
然后发出命令:

use dbOfInterest 
db.collectionOfInterest.createIndex({fieldOne:-1})

但是在控制台上方发出命令后似乎不再响应(几分钟后我不得不使用 CTRL+C 停止它)。
所考虑的集合是一个包含很少文档的测试集合。
我做错了什么?

【问题讨论】:

  • 您是否尝试过 Compass 创建该索引?
  • 您使用的是哪个版本的 MongoDB?根据 MongoDB 文档,userAdminAnyDatabase 是一个角色,它在 2.6.4 之前的版本中没有 createIndex 权限。对于任何版本的 MongoDB,具有修改索引权限的角色是:readWriteAnyDatabase、readWrite、dbAdmin。也许你可以试试其中一种。
  • 另一个建议。通过添加 --verbose 来启动 MongoDB 终端,以增加连接过程中 shell 输出的详细程度。例如:mongo -u --verbose
  • 我在 Compass 中试过,结果是一样的; GUI 停止响应。杀死 Compass GUI 并重新启动它后,我发现创建了索引,但不确定它是否有效/完整。 @MauriRamone,我使用 mongo v4.4.3,使用的帐户具有以下角色:“userAdminAnyDatabase”、“readWriteAnyDatabase”、“clusterManager”。

标签: mongodb mongodb-indexes mongodb-replica-set


【解决方案1】:

终于解决了!!
该问题确实与“具有身份验证的副本集节点可以连接到自身”(更多here)有关。 我不得不修改我的mongod(文件/etc/mongod.conf)配置如下:

# mongod.conf
# for documentation of all options, see:
#   http://docs.mongodb.org/manual/reference/configuration-options/

# Where and how to store data.
storage:
  dbPath: /var/lib/mongodb
  journal:
    enabled: true
#  engine:
#  mmapv1:
#  wiredTiger:

# where to write logging data.
systemLog:
  destination: file
  logAppend: true
  path: /var/log/mongodb/mongod.log

# network interfaces
net:
  port: 27017
  bindIp: 127.0.0.1


# how the process runs
processManagement:
  timeZoneInfo: /usr/share/zoneinfo

security:
  keyFile: /home/user1/Desktop/mongo.keyfile
  authorization: enabled
#operationProfiling:

replication:
  replSetName:  AirHeritage

#sharding:

## Enterprise-Only Options:

#auditLog:

#snmp:

在 YAML mongod.conf 文件中注意 keyFile 部分(注意空格)。 为了正确生成这个mongo.keyfile,我使用了:

openssl rand -base64 756 > <path-to-keyfile>
chmod 400 <path-to-keyfile>

然后做:

sudo chown mongodb:mongodb /home/user1/Desktop/mongo.keyfile

检查结果是否为:

ls -al /home/user1/Desktop/mongo.keyfile                                                           
-r-------- 1 mongodb mongodb 1024 gen 13 09:19 /home/user1/Desktop/mongo.keyfile

然后停止并重新启动mongod 使用:

sudo systemctl stop mongod 
sudo systemctl start mongod 

检查状态:

 sudo systemctl status mongod
● mongod.service - MongoDB Database Server
     Loaded: loaded (/lib/systemd/system/mongod.service; enabled; vendor preset: enabled)
     Active: active (running) since Wed 2021-01-13 09:25:59 CET; 44min ago
       Docs: https://docs.mongodb.org/manual
   Main PID: 10156 (mongod)
     Memory: 348.6M
     CGroup: /system.slice/mongod.service
             └─10156 /usr/bin/mongod --config /etc/mongod.conf

gen 13 09:25:59 eanx-XPS-13-9350 systemd[1]: Started MongoDB Database Server.

然后以 root 身份登录 mongo 控制台(不确定是否需要 root,应该足以满足 ClusterAdmin 角色):

mongo -u root
use dbOfInterest
db.collectionOfInterest.createIndex({field:1})

之前已经完成了所有这些,索引创建应该可以在不挂起控制台的情况下工作,结果如下:

 db.collectionOfInterest.createIndex({'field':1})
{
        "createdCollectionAutomatically" : false,
        "numIndexesBefore" : 1,
        "numIndexesAfter" : 2,
        "commitQuorum" : "votingMembers",
        "ok" : 1,
        "$clusterTime" : {
                "clusterTime" : Timestamp(1610526522, 5),
                "signature" : {
                        "hash" : BinData(0,"qSqkVswHQA/IzWGYCd8HwNhXoQk="),
                        "keyId" : NumberLong("6877458498892857349")
                }
        },
        "operationTime" : Timestamp(1610526522, 5)
}

要检查 MongoDB 日志,请使用:

sudo tail /var/log/mongodb/mongod.log | jq

(如果您的系统中没有安装,请使用sudo apt install jq,jq 对漂亮的打印 json 文件非常有用)

最后检查集合上的索引:

 db.collectionOfInterest.getIndexes()
[
        {
                "v" : 2,
                "key" : {
                        "_id" : 1
                },
                "name" : "_id_"
        },
        {
                "v" : 2,
                "key" : {
                        "field" : 1
                },
                "name" : "field.name_1"
        }

请注意,报告了两个关键字段:“_id”(默认在集合创建时)和“字段”! 希望这可以帮助其他有类似问题的人。 只将mongo.keyfile移动到更合适的位置(有人可以建议在哪里?)

【讨论】:

    【解决方案2】:

    您所做的是创建索引“前台”并阻止数据库的使用,直到创建准备好。 你需要做“背景”。

    db.collectionOfInterest.createIndex({fieldOne:-1},{background:1})

    【讨论】:

    • 自 MongoDB 4.2 起,backgrounddeprecated,如果指定则被忽略。
    猜你喜欢
    • 2014-02-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多