MongoDB - 保护.remove()整个数据库?

时间:2013-07-27 01:54:21

标签: mongodb database

我正在使用MongoDB作为我的数据库,作为首次使用后端的开发人员,我可以轻松删除整个数据库/集合,这让我很烦恼。

只需输入db.collection.remove()即可删除该集合中的所有记录!

我知道一个有效的备份策略应该会导致这个问题没有问题,但我偶尔在某些集合上运行.remove(),我不想输入错误的集合意外命名和(a)必须进行备份恢复,以及(b)丢失我在备份和恢复之间收集的任何数据,尤其是当我的应用程序收集大量用户数据时。

是否有任何'保护'我可以设置我的数据库使用,即使它只是一个警告/确认说

"Yo, are you sure you want to remove everything from <collectionname>?选择:Yes/No"

2 个答案:

答案 0 :(得分:3)

用户角色无法解决您的问题。如果您的帐户有权删除一个用户,则可能会意外删除所有用户。如果您的帐户有权更新一个用户的属性,则可能会意外更新所有用户。

然而,有一个简单的解决办法。

第0步:备份数据库。并定期测试备份。如果备份没有运行或出错,请确保收到警报。副本集不是备份。我知道这很明显,但是evidentally it's not obvious to everybody.

第1步:为您的数据库编写web admin GUI界面。这只需要一两天 - 而且应该很简单,秘书或实习生可以使用它而不用担心你的数据。 (如果您认为这需要很长时间,请找一个更多花俏的框架。您的管理控制台甚至不需要使用与您的应用程序相同的语言编写。)

第2步:数据迁移(数据库的维护转换)应始终从检查到源代码管理的脚本运行,并事先在非prod上进行测试。该脚本可以像mongo -e "foo.update(blah)"一样简单,但您应该将其作为脚本运行,以避免出现剪切错误。理想情况下,您甚至可以获得所有迁移的清单。 (检查您是否有最近的备份。请事先检查数据库日志和系统负载。编写一个前后查询,告诉您迁移是否成功...)

第3步:您现在不再需要使用生产的Mongo控制台。所以不要。它是一个有用的开发工具,但只在本地开发数据库上才需要。

上述角色可能对只读查询很有用。但是您已经可以对非主副本集成员执行此操作。

tl; dr:你可以使用cowboy admin techniques走得很远,但最终你会发现它更好(而且工作量不多) )使一切自动化。

答案 1 :(得分:1)

在当前版本中您无法提供此功能。

在用户定义角色可用的未来版本中,您可以定义一个允许insert()和update()但不能删除()或drop()等的角色,因此可以让自己以不同的更高版本登录角色用户,但在当前(2.4)版本中不可用。