我用MySQL作为DB后端运行django site。最后,我在django_session表中得到了300万行。它们中的大多数都已过期,因此我想删除它们。但是如果我手动运行delete from django_session where expire_date < "2011-04-18",整个网站似乎都挂了--它不能通过浏览器访问。
为什么这样的阻塞是可能的?如何避免呢?
发布于 2011-04-18 21:07:42
如果您的表为MyISAM,则DELETE操作将锁定该表,并且并发查询无法访问该表。
如果有许多记录要删除,则表被锁定的时间太长。
将DELETE语句拆分为几个较短的批处理。
发布于 2011-04-18 21:07:34
我不是MySQL专家,但我猜MySQL为删除锁定了表,这可能与MySQL事务/后端相关。当正在进行删除操作时,MySQL会阻止其他连接对表的访问。MyISAM和InnoDB后端行为可能不同。我建议您学习与此相关的MySQL手册:这个问题并不局限于Django域,而是一般情况下如何在不阻塞对表的访问的情况下删除MySQL行。
为了将来的参考,我建议你设置一个会话清理器任务,它将清除来自cron的会话,比如说一天一次,这样你就不会得到这么大的表。
发布于 2011-04-18 21:06:00
您可以尝试示例清理命令- http://docs.djangoproject.com/en/dev/topics/http/sessions/?from=olddocs#clearing-the-session-table -我想它会删除所有过期的会话。
https://stackoverflow.com/questions/5703308
复制相似问题