Eu preciso de sua ajuda eu tenho um aplicativo Django que tem cerca de 7 anos e está degradando agora .. toda vez que o site cai e faz backup e o problema é com o servidor mysql
Normalmente eu preciso apenas reiniciar o servidor mysql e ele volta .. eu tenho feito isso por 2 anos e estou pronto para corrigir o problema de uma vez por todas e preciso de sua ajuda para fazer isso
Aqui está a captura de tela das tabelas do banco de dados
As django_session
tabelas têm 3,512,729,600
comprimento de dados e 24,152,301
linhas, suponho que é de onde vem o problema e por que o site morre às vezes quando o mysql não consegue lidar com a consulta e vários tempos limite que matam o aplicativo. Se for outra coisa, por favor, me esclareça.
De qualquer forma, tentei excluir a django_session
tabela, mas sem sorte, recebo os seguintes erros
Erro na consulta (1451): Não é possível excluir ou atualizar uma linha pai: uma restrição de chave estrangeira falha (
font_database
.fonts_fontfile
, CONSTRAINTsession_id_refs_session_key_37e5d4124e1e319f
FOREIGN KEY (session_id
) REFERENCESdjango_session
(session_key
))
O que eu faço aqui? Precisa de ajuda séria aqui
A versão do MySQL é 5.7.23
Se precisar de mais informações, pergunte-me e tentarei adicioná-las a esta pergunta.
Obrigado
ATUALIZAR:
Acabei de notar que o problema é que o número total de conexões no servidor MySQL está no máximo em 152
mysql> show status where `variable_name` = 'Threads_connected';
+-------------------+-------+
| Variable_name | Value |
+-------------------+-------+
| Threads_connected | 152 |
+-------------------+-------+
1 row in set (0.74 sec)
Além disso, quando eu verifico as conexões, elas são todas do django_sessions, e é por isso que quando reinicio o servidor, ele funciona bem, mas volta ao mesmo problema, pois a tabela de sessões é muito alta e muitas linhas
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
Novamente, se você precisar de alguma informação adicional, pergunte e eu a fornecerei. Isso é tudo que eu acredito que pode ajudar a dar idéia de qual é o problema
ATUALIZAÇÃO: (a partir do pedido nos comentários)
EXPLAIN SELECT COUNT(*) FROM django_session WHERE django_session.last_login >= '2019-02-23 13:00:37'
id select_type table partitions type possible_keys key key_len ref rows filtered Extra
1 SIMPLE django_session NULL ALL NULL NULL NULL NULL 24200442 33.33 Using where
SHOW CREATE TABLE django_session
Table Create Table
django_session CREATE TABLE `django_session` (
`session_key` varchar(40) NOT NULL,
`session_data` longtext NOT NULL,
`expire_date` datetime NOT NULL,
`created` datetime NOT NULL,
`last_login` datetime NOT NULL,
PRIMARY KEY (`session_key`),
KEY `django_session_c25c2c28` (`expire_date`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8
UPDATE v2: (depois de executar ALTER TABLE django_session ADD KEY (last_login)
)
EXPLAIN SELECT COUNT(*) FROM django_session WHERE django_session.last_login >= '2019-03-04 13:00:37'
id select_type table partitions type possible_keys key key_len ref rows filtered Extra
1 SIMPLE django_session NULL range last_login last_login 5 NULL 1 100.00 Using where; Using index
O problema é que
SELECT COUNT(*) FROM django_session WHERE django_session.last_login >= '2019-02-23 13:00:37'
é uma consulta lenta. Sua lista de processos está mostrando isso levando 3133 segundos até agora e não foi concluído.Se houvesse um índice na
last_login
coluna em django_session, isso provavelmente seria mais rápido.Você também deve verificar o que esta consulta está fornecendo no django. Parece um número sem sentido.
Eu suspeito que 2 milhões de linhas provavelmente cobrem dados antigos e provavelmente podem ser excluídos. Tente o método de limpeza nesta resposta .
Recomendamos limpar pelo menos algumas linhas antes de adicionar um índice.