我的MySql DB中有一个名为“user_action”的表。我希望每天删除此表中早于30天的旧记录(根据“action_date”datetime列),我想使用crontab来执行此操作。
有什么想法吗?
答案 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。