我有一个每隔几分钟执行一次MySQL查询的cronjob,总结了MyISAM表中的大量行。但是,如果此表被锁定几分钟,那么这些摘要查询将堆积起来,这样即使表最终再次可用,它们也会长时间阻止它。
这些查询都不是必不可少的,所以我很高兴他们不时失败。因此,如果表被阻止超过一秒或两秒,这些查询就会失败,我更愿意这样做。
有没有办法向MySQL提交一个查询,如果等待表锁定的时间超过几秒钟会自动被杀死?我能以某种方式将查询标记为不重要吗?
答案 0 :(得分:0)
您可以使用以下命令查看打开的表来检查表是否已锁定:
show open tables;
如果您看到表被锁定,则可以在创建之前取消查询。文档here。
5.7看起来也会正确实现SELECT超时:http://mysqlserverteam.com/server-side-select-statement-timeouts/
答案 1 :(得分:0)
看一下pt-kill
(Percona Toolkit)。您可以在cron查询中添加可识别的注释,以便在需要时帮助定位查询。值得使用--sentinel
标志,以便安全地让pt-kill
退出。
此外,如果您向cron作业添加锁定,则可以防止堆积。
答案 2 :(得分:0)
更好的方法是运行其中一个查询吗?这将阻止堆积的发生。制作某种semafore(甚至是文件类型标志)以查看是否有一些查询已经在等待,如果有,请不要启动另一个查询。
正如你所说,如果有些人没有运行,那就不好了,这可能更容易实现。