如何将mySQL查询作为cron作业运行?

58

我想清除SQL数据库中一周前的所有条目,并且希望每晚都进行此操作。因此,我将设置一个cron作业。如何在不手动输入密码的情况下查询mySQL?

PHP中的查询如下:

mysql_query("DELETE FROM tbl_message WHERE DATEDIFF( NOW( ) ,  timestamp ) >=7");

有没有一种方法可以将它作为Shell脚本运行?如果不能,有没有办法让cron运行PHP文件?

4个回答

167

个人认为使用MySQL事件调度程序比cron更容易。

启用它的方法:

SET GLOBAL event_scheduler = ON;

并创建这样的事件:

CREATE EVENT name_of_event
ON SCHEDULE EVERY 1 DAY
STARTS '2014-01-18 00:00:00'
DO
DELETE FROM tbl_message WHERE DATEDIFF( NOW( ) ,  timestamp ) >=7;

就是这样了。

这里阅读有关语法的更多信息,这里提供了更一般的信息。


3
这应该是“答案”! - Chris F
那就是我需要的。最棒的!✨ - Rizki Noor Hidayat Wijaya
值得一提的是,并非所有命令都可以通过上述方式执行。例如,LOAD DATE 和其他一些命令不适用。 - Andreikin Yura

61

尝试创建一个像下面这样的shell脚本:

#!/bin/bash

mysql --user=[username] --password=[password] --database=[db name] --execute="DELETE FROM tbl_message WHERE DATEDIFF( NOW( ) ,  timestamp ) >=7"

然后您可以将此添加到cron中。


2
这个答案和我的一样好。只是取决于你是否想通过php来完成它。 - miyasudokoro
5
这也取决于您是否希望将数据库凭据传播到比必要的地方更多的地方。 event_scheduler 选项在这方面是一个改进,因为它既包含在数据库中,而且其安装可以完全受版本控制作为迁移脚本。 - kungphu
那么你是在向其他Windows用户公开你的MySQL密码? - tatskie
2
这是一个糟糕的答案。你应该使用下面的答案来使用MySQL事件调度程序。 - Andy Day
我喜欢fancyPants的答案。 - Chris F
你好,这个对我不起作用,请问有人可以帮我吗? - Mau España

9

这取决于您的系统中运行cron的方式,但要从cron运行php脚本,您只需要调用php安装位置并跟随脚本位置即可。以下是每小时运行crontab的示例:

# crontab -e
00 * * * * /usr/local/bin/php /home/path/script.php

在我的系统上,我甚至不需要输入PHP安装的路径:

00 * * * * php /home/path/script.php

另外,除非您正在使用较旧的php安装程序,否则不应使用mysql扩展,因为它已被弃用。请在此处进行比较。


2
这是一个非常方便的页面,因为我需要从一个mySQL表中删除记录,其中到期日期小于今天。
我在一个共享主机上,但是CRON不喜欢AndrewKDay的建议。它还说(我也同意),以这种方式公开密码可能不安全。
然后我尝试在phpMyAdmin中启用Events,但由于在共享主机上,这是不允许的。很抱歉fancyPants。
所以我转而将SQL脚本嵌入到一个PHP文件中。我使用了这里的示例,将其存储在一个安全的子文件夹中,并添加了一个空的index.php以确保安全。然后我能够测试这个PHP文件(和我的SQL脚本)是否可以从浏览器的URL行中正常工作。
到目前为止一切顺利。接下来是CRON。按照上面的例子几乎起作用了。最终我在我的*.php文件的路径之前调用了PHP。否则,CRON不知道该如何处理该文件。
我的计划任务设置为每天运行一次,看起来像这样,出于安全原因进行了修改。
00 * * * * php mywebsiteurl.com/wp-content/themes/ForteChildTheme/php/DeleteExpiredAssessment.php 在最终的 CRON 测试中,我最初设置它每分钟运行一次,并开启了电子邮件警报。这很快确认它按计划运行,并将其改回每天运行一次。
希望这有所帮助。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接