2016-06-28 68 views
4

我有一个MongoDB的副本集3名成员(版本2.4),其中对“管理”数据库管理员用户不具有“userAdminAnyDatabase”的作用。锁定之外的MongoDB副本集

此角色是管理所有数据库上的用户所必需的。

我目前拥有的角色:“readWriteAnyDatabase”,“dbAdminAnyDatabase”,“clusterAdmin”]

我试图更新为自己的角色或创建新的用户,但是我没有权限访问db.system管理数据库中的用户。

我试着设置noauth = true,但没有帮助。当删除密钥文件时,数据库无法与其他成员同步(显然),并陷入RECOVERY状态。

我发现了一个similar question是指一个独立的数据库(没有副本集),所以它并没有真正在这种情况下帮助。

什么是在系统停机时间最短的情况下添加此角色的最佳方式?

回答

1

我会用mongodumpmongorestore备份数据,然后重新与正确的权限节点和恢复数据。

但是这种做法应该work

如果你已经把自己锁了,那么你需要做到以下几点:

  1. 停止你的MongoDB实例
  2. 取出--auth和/或从您的MongoDB的配置 --keyfile选项来禁用认证
  3. 没有认证
  4. 启动实例
  5. 编辑用户根据需要
  6. 重新启动身份验证的情况下启用
+0

谢谢,就像我在问题中所写的,禁用副本集中主节点的身份验证不允许它连接到群集。此外,mongodump和恢复将导致非常长的停机时间。 – odedfos

1

当您使用蒙戈2.4,这意味着你有MMAP作为存储引擎。

我的建议是:

  1. 创建类似副本的每个主机上,但不同的端口,并设置数据库目录上同媒体当前的设置。
  2. 配置所有auth的东西一样运行那些
  3. 停止旧副本集成员
  4. MOVE数据库文件到新的目录新副本不含地方
  5. 更改端口设置
  6. 启动

由于文件移动到其他目录只是一个指针昌这需要几秒钟的时间。

请在实施前测试。

欢迎任何评论!

+0

如何在没有操作日志的情况下移动数据库文件(不包括本地)影响新的副本集?它会知道如何同步?另外,如果由于复制滞后导致所有成员之间的数据不准确会怎样?顺便说一句,我的存储引擎是tokumx – odedfos

+0

没有使用tokmux的经验......你需要恢复首先是主人的那个 – profesor79

+0

只是想... oplog需要转移 - 但仍然考虑存储引擎和方式我们可以重申一下...... – profesor79