只清除单个表的Rake任务



有没有一个Rake命令可以让我运行,它只会删除一个表的所有字段,而不是删除整个数据库并重新创建它。我有一个表增长非常快,其中的大多数数据不需要持续一周以上。

尝试截断表:

ActiveRecord::Base.connection.execute("TRUNCATE TABLE table_name")

来自MySQL的文档:

从逻辑上讲,TRUNCATE TABLE类似于DELETE语句删除所有行或DROP TABLE和CREATE TABLE的序列声明。

这似乎是你想要实现的。

如果需要在不删除当前数据的情况下从表中删除旧记录,则需要小心不要发出可能锁定表中大部分记录的SQL语句。(听起来这个表经常被写入,所以长时间锁定它是不可接受的。)

至少使用mysql+innodb,您可以很容易地锁定更多的行,而不仅仅是实际删除的行。看见http://mitchdickinson.com/mysql-innodb-row-locking-in-delete/了解更多信息。

以下是一个过程,它应该保持表的可用性,并允许您删除旧行:

  1. 根据created_at时间,只选择要删除的一组记录的ID
  2. 为这些记录发布DELETE
  3. 只要SELECT返回记录,就重复此过程

这会让你了解这个过程。。。

max_age = 7.days.ago
batch_size = 1000
loop do
  ids = Model.select(:id).
    where('created_at < ?', max_age).
    limit(batch_size).
    map(&:id)
  Model.where(id: ids).delete_all
  break if ids.size < batch_size
end

由于SELECTDELETE是独立的语句,因此不会锁定任何实际未被删除的记录。这个过程所花费的总时间肯定会比简单的TRUNCATE TABLE更长,但好处是您可以保留最近的记录。TRUNCATE将删除所有内容。

最新更新