2

我想从 errbit 重新开始——我们的 mongodb 数据库中有数百万条记录,我们还没有清理它们。我想重新开始,但我不想丢失我的用户帐户。

我尝试运行这些例程(https://mensfeld.pl/2015/01/making-errbit-work-faster-by-keeping-it-clean-and-tidy/):

bundle exec rake errbit:clear_resolved
desc 'Resolves problems that didnt occur for 2 weeks'
task :cleanup => :environment do
  offset = 2.weeks.ago
  Problem.where(:updated_at.lt => offset).map(&:resolve!)
  Notice.where(:updated_at.lt => offset).destroy_all
end

但第二个(删除超过 2 周的问题和通知)似乎永远运行。通过 mongo shell 查询问题和通知集合似乎没有显示任何被删除...我们使用的是 errbit V 0.7.0-dev 和 mongodb 版本 3.2.22。

4

2 回答 2

1

最快的方法是获取一个 mongo 控制台并删除大部分集合。我会说停止你的 errbit 服务器,获取一个 mongo 控制台,连接到你使用的数据库并运行:

> db.errs.drop()
true
> db.problems.drop()
true
> db.backtraces.drop()
true
> db.notices.drop()
true
> db.comments.drop()
于 2019-07-29T16:39:12.917 回答
1
Problem.where(:updated_at.lt => 2.months.ago).destroy_all

由于递归删除 Err、Notice 和 Comment 的 N+1 问题,运行时间过长,而且 mongoid 也不支持嵌套的急切加载,因此更快删除的唯一方法是手动获取这些 id 并直接删除,无需回调:

problem_ids = Problem.where(:updated_at.lt => 2.months.ago).pluck(:id)
err_ids = Err.where(problem_id: {:$in => problem_ids}).pluck(:id)

Notice.where(err_id:{:$in => err_ids}).delete_all
Err.where(id:{:$in => err_ids}).delete_all
Comment.where(problem_id: {:$in => problem_ids}).delete_all
Problem.where(id: {:$in => problem_ids}).delete_all
于 2020-03-03T16:17:16.597 回答