我需要你的帮助,我有一个大约 7 年历史的 Django 应用程序,现在性能已经下降了。每次网站关闭并重新启动时,问题都出在 mysql 服务器上
通常我只需要重新启动 mysql 服务器它就会恢复正常。我已经这样做了 2 年了,我准备一劳永逸地解决这个问题,需要你的帮助
表格django_session
中有3,512,729,600
数据长度和24,152,301
我猜这就是问题的根源,也是为什么网站有时会死机,因为 mysql 无法处理查询,而且多次超时导致应用程序终止。如果是其他原因,请告诉我。
无论如何,我尝试删除django_session
表格,但没有成功,我收到以下错误
查询错误(1451):无法删除或更新父行:外键约束失败(
font_database
。fonts_fontfile
,CONSTRAINTsession_id_refs_session_key_37e5d4124e1e319f
FOREIGN KEY(session_id
)REFERENCESdjango_session
(session_key
))
我该怎么办?需要紧急帮助
MySQL版本是5.7.23
如果您需要更多信息,请询问我,我会尝试将其添加到这个问题中。
谢谢
更新:
刚刚注意到问题是 MySQL 服务器上的总连接数最大为 152
mysql> show status where `variable_name` = 'Threads_connected';
+-------------------+-------+
| Variable_name | Value |
+-------------------+-------+
| Threads_connected | 152 |
+-------------------+-------+
1 row in set (0.74 sec)
此外,当我检查连接时,它们都来自 django_sessions,这就是为什么当我重新启动服务器时它工作正常,但随后又回到同样的问题,因为会话表太高,行太多
mysql> show processlist;
+------+--------------------+-----------+--------------------+---------+------+--------------+----------------------------------------------------------------------------------------------------+
| Id | User | Host | db | Command | Time | State | Info |
+------+--------------------+-----------+--------------------+---------+------+--------------+----------------------------------------------------------------------------------------------------+
| 3709 | font_database | localhost | font_database | Query | 3164 | Sending data | SELECT COUNT(*) FROM `django_session` WHERE `django_session`.`last_login` >= '2019-02-23 13:00:37' |
| 3710 | font_database | localhost | font_database | Query | 3162 | Sending data | SELECT COUNT(*) FROM `django_session` WHERE `django_session`.`last_login` >= '2019-02-23 13:00:39' |
| 3711 | font_database | localhost | font_database | Query | 3161 | Sending data | SELECT COUNT(*) FROM `django_session` WHERE `django_session`.`last_login` >= '2019-02-23 13:00:41' |
| 3714 | font_database | localhost | font_database | Query | 3133 | Sending data | SELECT COUNT(*) FROM `django_session` WHERE `django_session`.`last_login` >= '2019-02-23 13:01:09' |
| 3716 | font_database | localhost | font_database | Query | 3131 | Sending data | SELECT COUNT(*) FROM `django_session` WHERE `django_session`.`last_login` >= '2019-02-23 13:01:11' |
| 3717 | font_database | localhost | font_database | Query | 3129 | Sending data | SELECT COUNT(*) FROM `django_session` WHERE `django_session`.`last_login` >= '2019-02-23 13:01:13' |
...
...
till maxed to 152 connections
再次强调,如果您需要任何其他信息,请询问,我会提供。我相信这些都可以帮助您了解问题所在
答案1
这 7 年内您的过期会话过多。您可以尝试
manage.py clearsessions
https://docs.djangoproject.com/en/2.2/topics/http/sessions/#clearing-the-session-store
Django 不提供自动清除过期会话的功能。因此,您需要定期清除过期会话。Django 为此提供了一个清理管理命令:clearsessions。建议定期调用此命令,例如作为每日 cron 作业。