Primeiro, você precisa executar esta consulta:
SELECT user,host FROM mysql.user
WHERE super_priv='Y' AND
CONCAT(user,'@',host) <> 'root@localhost';
Isso listará todos os usuários que possuem privilégios SUPER . A maioria dos usuários que processa o banco de dados relacionado ao aplicativo não precisa desse privilégio. De acordo com a documentação do MySQL , aqueles com privilégio SUPER podem fazer o seguinte:
- Execute CHANGE MASTER TO para controlar as coordenadas de replicação
- MATAR ou
mysqladmin kill
matar tópicos pertencentes a outras contas
- PURGE LOGS BINÁRIOS para excluir sistematicamente logs binários
- Faça alterações na configuração usando SET GLOBAL para modificar variáveis globais do sistema
- Comando debug mysqladmin
- ativar ou desativar o log
- executando atualizações mesmo se a variável de sistema * read_only * estiver ativada
- iniciando e parando a replicação em servidores escravos
- especificação de qualquer conta no atributo DEFINER de programas e visualizações armazenados
- AQUI É O MAIS IMPORTANTE PARA O SEU PROBLEMA:: Permite conectar (uma vez), mesmo que o limite de conexão controlado pela variável de sistema max_connections seja atingido.
Você precisará fazer login como root @ localhost e revogar o privilégio SUPER da seguinte maneira:
UPDATE mysql.user SET super_priv='N'
WHERE super_priv='Y' AND
CONCAT(user,'@',host) <> 'root@localhost';
FLUSH PRIVILEGES;
Depois que você fizer isso, sempre que todos os usuários inundarem as conexões mysql, somente root@localhost
poderão fazer login. Afinal, se todos e sua avó tivessem privilégios SUPER, isso impediria root@localhost
de se conectar à frente de todos os outros. Se max_connections estiver em 200 e você precisar aumentá-lo para 300 sem precisar reiniciar o mysqld, você poderá aumentar dinamicamente as max_connections com este comando:
mysql> SET GLOBAL max_connections = 300;
Isso permitirá mais conexões efetivas imediatamente, mas não apenas aumente arbitrariamente o número por capricho. Você precisa garantir que o mysql tenha RAM suficiente para acomodar o aumento.
CAVEAT: Se você alterar max_connections dinamicamente para 300, coloque-o em /etc/my.cnf
[mysqld]
max_connections=300
Você pode executar o mysqltuner.pl no seu servidor de banco de dados MySQL. Se você não o tiver, execute o seguinte:
cd
wget mysqltuner.pl
perl mysqltuner.pl
A terceira linha em Métricas de desempenho tem este
-------- Performance Metrics -------------------------------------------------
[--] Up for: 8d 20h 46m 22s (8M q [10.711 qps], 129K conn, TX: 90B, RX: 19B)
[--] Reads / Writes: 4% / 96%
[--] Total buffers: 2.1G global + 5.4M per thread (2000 max threads)
[OK] Maximum possible memory usage: 12.6G (80% of installed RAM)
Veja os 5,4M por thread? Isso é multiplicado por max_connections. Neste exemplo, isso seria no máximo cerca de 10,8G de RAM. Portanto, sempre que aumentar o max_connections, você deve executar o mysqltuner.pl e verificar se está pressionando o sistema operacional por muita memória.
De qualquer forma, limitar quem possui privilégios SUPER oferece a esses usuários a oportunidade de mitigar a inundação do mysqld com o DB Connections.