使用crontab从DB中删除旧记录

时间:2011-03-21 09:20:17

标签: linux crontab

我的MySql DB中有一个名为“user_action”的表。我希望每天删除此表中早于30天的旧记录(根据“action_date”datetime列),我想使用crontab来执行此操作。

有什么想法吗?

4 个答案:

答案 0 :(得分:5)

创建/usr/local/bin/clear-out-old-records.sh并使其可执行:

#!/bin/bash
SQL="DELETE FROM user_action WHERE action_date < DATE_SUB(CURDATE(),INTERVAL 30 DAY)"

MYSQL_USER="<your-user>"
MYSQL_PASS="<your-password>"
MYSQL_DB="<your-db>"

echo $SQL | /usr/bin/mysql --user=$MYSQL_USER --password=$MYSQL_PASS $MYSQL_DB

...然后将/usr/local/bin/clear-out-old-records.sh放入crontab。

答案 1 :(得分:2)

要进行身份验证,请在用户的主目录中创建一个.my.cnf文件:

[client]
user=username
password=password

然后创建一个名为crontab的文件。我强烈建议您不要直接编辑contab,但总是通过这个文件;否则很容易意外覆盖crontab的内容。

MAILTO="email@foo.com"

# 1. minute (0-59)
# |   2. hour (0-23)
# |   |   3. day of month (1-31)
# |   |   |   4. month (1-12)
# |   |   |   |   5. day of week (0-7: 0 or 7 is Sun, or use names)
# |   |   |   |   |   6. commandline
# |   |   |   |   |   |
#min hr  dom mon dow command
  0   3   *   *   *  mysql DATABASE -e "DELETE FROM user_action WHERE action_date < subdate(now(), interval 30 day)" >/dev/null

将DATABASE替换为您的数据库名称。

这意味着清理将在每晚凌晨3:00(每月的每一天,每周的每一天等)运行。错误将发送到您的电子邮箱。 >/dev/null是隐藏MySQL通常不感兴趣的非错误输出所必需的。

运行此命令以更新系统的crontab副本:

crontab ./crontab

答案 2 :(得分:0)

使用您喜欢的语言执行以下查询的脚本:

伪代码:

"DELETE FROM user_action WHERE created_at < #{(Date.now - 30.days)}" 

然后将其添加到cron以便每天执行。

答案 3 :(得分:0)

编写一个SQL(首选存储过程)来执行该操作并通过crontab执行该SQL。