web-dev-qa-db-ja.com

django_sessionテーブルがMySQLサーバーとDjango app

私はあなたの助けが必要です私はDjango約7年前で、現在劣化しているアプリを持っています..ウェブサイトがダウンしてバックアップするたびに、問題はmysqlサーバーにあります

通常、私はmysqlサーバーを再起動する必要があり、それが戻ってきます..私はこれを2年間行っており、問題を完全に修正する準備ができており、これを行うためにあなたの助けが必要です

これがデータベーステーブルのスクリーンショットです enter image description here

Django_sessionテーブルには3,512,729,600データ長と24,152,301行がありますこれが問題の原因であり、mysqlがクエリを処理できず、アプリを強制終了するタイムアウトがいくつか発生したときにWebサイトが停止することがある理由です。それが何か他のものであるならば、私に教えてください。

とにかくDjango_sessionテーブルを削除しようとしましたが、運が悪ければ次のエラーが発生します

クエリのエラー(1451):親行を削除または更新できません:外部キー制約が失敗します(font_database .fonts_fontfile、CONSTRAINT session_id_refs_session_key_37e5d4124e1e319f FOREIGN 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

再度、追加情報が必要な場合は、質問してください。提供します。これは私が問題が何であるかについての考えを与えるのを助けることができると私が信じるすべてです

2
uberrebu

この7年間、期限切れのセッションが多すぎます。 manage.py clearsessionshttps://docs.djangoproject.com/en/2.2/topics/http/sessions/#clearing-the-session-store を試すことができます

Djangoは、期限切れのセッションの自動パージを提供していません。したがって、期限切れのセッションを定期的に削除するのはあなたの仕事です。 Djangoは、この目的のためにクリーンアップ管理コマンドを提供します:clearsessions。このコマンドは、たとえば毎日のcronジョブとして定期的に呼び出すことをお勧めします。