有没有一个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/了解更多信息。
以下是一个过程,它应该保持表的可用性,并允许您删除旧行:
- 根据
created_at
时间,只选择要删除的一组记录的ID - 为这些记录发布
DELETE
- 只要
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
由于SELECT
和DELETE
是独立的语句,因此不会锁定任何实际未被删除的记录。这个过程所花费的总时间肯定会比简单的TRUNCATE TABLE
更长,但好处是您可以保留最近的记录。TRUNCATE
将删除所有内容。