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 kill
per 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@localhost
possono accedere solo . Dopotutto, se tutti e sua nonna avessero il privilegio SUPER, ciò non impedirebbe root@localhost
di 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.