Como resolver muitas conexões e erro fatal no mysql executando no vps

9

Estou executando um aplicativo PHPlist no meu servidor linode, executando simultaneamente 12 scripts PHP, cada um dos quais abre uma conexão MySQL. Agora, quando eu acesso o PHPlist, ele geralmente mostra este erro:

Erro fatal: Desculpe, o servidor está muito ocupado no momento. Tente novamente mais tarde.

Quando estou tentando acessar o phpMyAdmin, ele mostra um erro # 1040. A saída dos meus scripts PHP que executam crontarefas mostra:

Aviso do PHP: mysqli_connect (): (HY000 / 1040): Muitas conexões

Estou usando a pilha LAMP no servidor com phpMyAdmin; a topsaída no terminal é exibida mysqldusando 100-130% da CPU. Quando estou tentando solucionar esse problema, recebi algumas dicas:

  • Aumentar a variável max_connection: estou usando 200 (100 por padrão)
  • Cache da tabela aberta: 512 (400 por padrão)

Existem muitas variáveis ​​a serem definidas, mas não consigo determinar quais são específicas. Estou recebendo algumas referências: muitas conexões e http://dev.mysql.com/doc/refman/5.5/en/table-cache. html

Mas, de acordo com meu uso, como aumentar a memória e qual é a memória máxima difícil para mim.

No meu servidor, estou usando cerca de 12 scripts PHP, o aplicativo PHPlist para enviar emails e um banco de dados importante para registros de usuários.

Por favor, ajude-me a resolver este problema.

Shashank
fonte

Respostas:

12

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 killmatar 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@localhostpoderão fazer login. Afinal, se todos e sua avó tivessem privilégios SUPER, isso impediria root@localhostde 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.

RolandoMySQLDBA
fonte
Eu recebo este erro ao tentar o perl mysqltuner.pl "Tentou usar credenciais de login da conta de manutenção da Debian, mas elas falharam."
Shashank
Eu estou tentando isso no meu servidor ubuntu local, ele mostra o uso máximo de memória, mas no meu VPS, mostra falha e eu não consigo entrar no phpmyadmin mas o login com sucesso no mysql terminais
Shashank
Este cmd wget mysqltuner.plbaixou index.html, mas era um arquivo perl, então eu o renomei para mysqltuner.pl e o próximo cmd perl mysqltuner.plfuncionou.
MotsManish
2
  1. A variável global max_connectionsdetermina o número máximo de conexões simultâneas com o MySQL. Verifique se você tem um valor alto para essa variável. Você pode aumentar esse valor para 300 ou 400 e tentar reiniciar o MySQL após essas configurações.
  2. Projete seu aplicativo de forma que uma conexão MySQL seja mantida aberta por um período muito curto.
  3. Você também deve verificar se o código do cliente não está usando conexões persistentes (como mysql_pconnect ()) incorretamente.

Também execute o Flush status;comando no servidor MySQl para reduzir esse valor.

Espero que essas sugestões ajudem.

Mahesh Patil
fonte
0

Verifique se o seu disco está cheio, isso pode causar o mesmo erro:

df -h

mostrará o espaço restante em cada partição, você provavelmente precisará verificar a partição raiz /(ou / var / caso tenha uma partição extra para isso):

df -h /
rubo77
fonte