django_session 表杀死了我的 MySQL 服务器和 django 应用程序

django_session 表杀死了我的 MySQL 服务器和 django 应用程序

我需要你的帮助,我有一个大约 7 年历史的 Django 应用程序,现在性能已经下降了。每次网站关闭并重新启动时,问题都出在 mysql 服务器上

通常我只需要重新启动 mysql 服务器它就会恢复正常。我已经这样做了 2 年了,我准备一劳永逸地解决这个问题,需要你的帮助

以下是数据库表的屏幕截图 在此处输入图片描述

表格django_session中有3,512,729,600数据长度和24,152,301我猜这就是问题的根源,也是为什么网站有时会死机,因为 mysql 无法处理查询,而且多次超时导致应用程序终止。如果是其他原因,请告诉我。

无论如何,我尝试删除django_session表格,但没有成功,我收到以下错误

查询错误(1451):无法删除或更新父行:外键约束失败(font_databasefonts_fontfile,CONSTRAINT session_id_refs_session_key_37e5d4124e1e319fFOREIGN KEY(session_id)REFERENCES django_sessionsession_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 作业。

相关内容