Мне нужна ваша помощь. У меня есть приложение Django, которому около 7 лет, и которое сейчас деградирует .. каждый раз, когда веб-сайт отключается и восстанавливается, проблема связана с сервером mysql
Обычно мне нужно просто перезапустить сервер mysql, и он возвращается ... я делаю это уже 2 года и готов исправить проблему раз и навсегда, и для этого нужна ваша помощь
Вот скриншот таблиц базы данных
В django_session
столы 3,512,729,600
длина данных и 24,152,301
rows Я предполагаю, что именно здесь возникает проблема и почему веб-сайт иногда просто умирает, когда mysql не может обработать запрос и несколько тайм-аутов, которые убивают приложение. Если это что-то еще, просветите меня, пожалуйста.
В любом случае я попытался удалить django_session
таблица, но без везения я получаю следующие ошибки
Ошибка в запросе (1451): невозможно удалить или обновить родительскую строку: ограничение внешнего ключа не выполнено (
font_database
.fonts_fontfile
, ОГРАНИЧЕНИЕsession_id_refs_session_key_37e5d4124e1e319f
ВНЕШНИЙ КЛЮЧ (session_id
) ССЫЛКИdjango_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
Опять же, если вам нужна дополнительная информация, спрашивайте, и я ее предоставлю. Это все, что я считаю, может помочь понять, в чем проблема.
У вас слишком много просроченных сеансов за эти 7 лет. Вы можете попробовать manage.py clearsessions
https://docs.djangoproject.com/en/2.2/topics/http/sessions/#clearing-the-session-store
Django не обеспечивает автоматическую очистку просроченных сеансов. Поэтому ваша задача - регулярно очищать просроченные сеансы. Django предоставляет для этой цели команду управления очисткой: clearsessions. Рекомендуется вызывать эту команду регулярно, например, как ежедневное задание cron.