Come risolvere troppe connessioni ed errori fatali in mysql in esecuzione su vps


9

Sto eseguendo un'applicazione PHPlist sul mio server Linode, eseguendo contemporaneamente 12 script PHP, ognuno dei quali apre una connessione MySQL. Ora quando accedo a PHPlist spesso mostra questo errore:

Errore irreversibile: al momento il server è troppo occupato, riprovare più tardi.

Quando sto provando ad accedere a phpMyAdmin, mi mostra un errore # 1040. L'output dei miei script PHP che eseguono i cronlavori mostra:

Avviso PHP: mysqli_connect (): (HY000 / 1040): troppe connessioni

Sto usando lo stack LAMP sul server con phpMyAdmin; l' topuscita nel terminale mostra l' mysqldutilizzo della CPU 100-130%. Quando sto cercando di risolvere questo problema ho avuto alcuni indizi:

  • Aumenta la variabile max_connection: sto usando 200 (100 per impostazione predefinita)
  • Apri cache tabella: 512 (400 per impostazione predefinita)

Ci sono molte variabili da impostare ma non riesco a determinare quali specifiche, sto ottenendo alcuni riferimenti: troppe connessioni e http://dev.mysql.com/doc/refman/5.5/en/table-cache. html

Ma secondo il mio utilizzo come aumentare la memoria e qual è la memoria massima difficile per me.

Sul mio server sto usando circa 12 script PHP, un'applicazione PHPlist per l'invio di e-mail e un database importante per le registrazioni degli utenti.

Aiutami gentilmente a risolvere questo problema.

Risposte:


12

Innanzitutto è necessario eseguire questa query:

SELECT user,host FROM mysql.user
WHERE super_priv='Y' AND
CONCAT(user,'@',host) <> 'root@localhost';

Questo elencherà tutti gli utenti che hanno il privilegio SUPER . La maggior parte degli utenti che eseguono l'elaborazione di DB relativa all'applicazione non richiedono questo privilegio. Secondo la documentazione MySQL , quelli con privilegio SUPER possono fare quanto segue:

  • Eseguire CHANGE MASTER TO per il controllo delle coordinate di replica
  • KILL o mysqladmin killper uccidere i thread appartenenti ad altri account
  • ELIMINA I LOG BINARI per eliminare sistematicamente i log binari
  • Apportare modifiche alla configurazione utilizzando SET GLOBAL per modificare le variabili di sistema globali
  • comando di debug mysqladmin
  • abilitare o disabilitare la registrazione
  • eseguire aggiornamenti anche se la variabile di sistema * read_only * è abilitata
  • avvio e arresto della replica su server slave
  • specifica di qualsiasi account nell'attributo DEFINER di programmi e viste memorizzati
  • QUI È IL PIÙ IMPORTANTE PER IL TUO PROBLEMA:: consente di connettersi (una volta) anche se viene raggiunto il limite di connessione controllato dalla variabile di sistema max_connections .

Dovrai accedere come root @ localhost e revocare il privilegio SUPER come segue:

UPDATE mysql.user SET super_priv='N'
WHERE super_priv='Y' AND
CONCAT(user,'@',host) <> 'root@localhost';
FLUSH PRIVILEGES;

Una volta fatto questo, ogni volta che tutti gli utenti invadono le connessioni mysql, root@localhostpossono accedere solo . Dopotutto, se tutti e sua nonna avessero il privilegio SUPER, ciò non impedirebbe root@localhostdi collegarsi prima di tutti gli altri. Se max_connections è a 200 e devi aumentarlo a 300 senza dover riavviare mysqld, puoi aumentare dinamicamente max_connections con questo comando:

mysql> SET GLOBAL max_connections = 300;

Ciò consentirà immediatamente più connessioni efficaci, ma non solo aumentare arbitrariamente il numero per capriccio. Devi assicurarti che mysql abbia abbastanza RAM per far fronte all'aumento.

CAVEAT: Se cambi max_connections in modo dinamico su 300, inseriscilo in /etc/my.cnf

[mysqld]
max_connections=300

Puoi eseguire mysqltuner.pl sul tuo server MySQL DB. Se non lo possiedi, esegui quanto segue:

cd
wget mysqltuner.pl
perl mysqltuner.pl

La terza riga in Performance Metrics ha questo

-------- 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)

Vedi i 5.4M per thread? Questo è moltiplicato da max_connections. In questo esempio, sarebbe un massimo di circa 10,8 G di RAM. Pertanto, ogni volta che si esegue il backup di max_connections, è necessario eseguire mysqltuner.pl e verificare se si preme il sistema operativo per troppa memoria.

In ogni caso, limitare chi ha i privilegi SUPER offre a tali utenti l'opportunità di mitigare il flooding mysqld con DB Connections.


ottengo questo errore durante il tentativo di perl mysqltuner.pl "Tentativo di utilizzare le credenziali di accesso dall'account di manutenzione debian, ma non sono riusciti."
Shashank,

Sto provando questo sul mio server Ubuntu locale, mostra il massimo utilizzo di memoria, ma sul mio vps, mostra un errore e non riesco ad accedere in phpmyadmin ma accedo con successo nel terminale mysql
Shashank

Questo cmd ha wget mysqltuner.plscaricato index.html, ma era un file perl, quindi l'ho rinominato in mysqltuner.pl e il cmd successivo ha perl mysqltuner.plfunzionato.
MotsManish

2
  1. La variabile globale max_connectionsdetermina il numero massimo di connessioni simultanee a MySQL. Assicurati di avere un valore elevato per questa variabile. Puoi aumentare questo valore a 300 o 400 e provare a riavviare MySQL dopo queste impostazioni.
  2. Progetta la tua applicazione in modo tale che una connessione MySQL rimanga aperta per un periodo di tempo molto breve.
  3. È inoltre necessario verificare che il codice client non stia utilizzando in modo errato connessioni persistenti (come mysql_pconnect ()).

Eseguire anche il Flush status;comando sul server MySQl per ridurre questo valore.

Spero che questi suggerimenti siano d'aiuto.


0

Controlla se il tuo disco è pieno, questo può causare lo stesso errore:

df -h

ti mostrerà lo spazio rimanente su ogni partizione, probabilmente dovrai controllare la partizione di root /(o / var / nel caso tu abbia una partizione extra per questo):

df -h /
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.