Come impostare un timeout di connessione in base all'accesso dell'utente in MySQL

StackOverflow https://stackoverflow.com/questions/243644

  •  04-07-2019
  •  | 
  •  

Domanda

Al momento ho più di 100 connessioni in stato di sospensione.

Alcune connessioni devono rimanere nello stato di sospensione (e non chiudersi) perché sono connessioni permanenti, ma altre (con un nome utente diverso) provengono da alcuni script php e voglio che scadano molto velocemente.

È possibile impostare un wait_timeout per utente? e se sì, come?

È stato utile?

Soluzione

Non esiste una configurazione di timeout per utente, ma è possibile impostare dinamicamente il valore wait_timeout . Cioè, dopo aver effettuato una connessione come un determinato utente, è possibile emettere un'istruzione per modificare il valore di timeout in quello che si desidera che sia per la sessione dell'utente.

Prova il seguente esperimento nel client della riga di comando mysql:

mysql> SHOW VARIABLES LIKE 'wait_timeout';

... mostra 28800 (ovvero 8 ore), che è il wait_timout predefinito.

mysql> SET SESSION wait_timeout = 60;
mysql> SHOW VARIABLES LIKE 'wait_timeout';

... mostra 60.

Quindi puoi chiudere la sessione, riconnetterti e di nuovo il wait_timeout predefinito è 28800. Quindi è limitato all'ambito della sessione corrente.

Puoi anche aprire una seconda finestra e avviare una sessione client mysql separata, per dimostrare che la modifica del wait_timeout in una sessione non influisce sulle altre sessioni simultanee.

Altri suggerimenti

Dovresti impostare le seguenti variabili nel tuo my.conf :

[mysqld]
interactive_timeout=180
wait_timeout=180

wait_timeout è un timeout per connessioni automatizzate ( secondo me più di 30 su un server web è troppo ).
interactive_timeout è un timeout di interazione della console per la sessione inattiva.

Un'altra possibilità: MySQL supporta due diverse variabili di timeout, wait_timeout per client non interattivi e interactive_timeout per client interattivi.

La differenza tra client interattivi e non interattivi sembra essere semplicemente se durante la connessione hai specificato l'opzione CLIENT_INTERACTIVE .

Non so se questo ti aiuta, perché devi in ??qualche modo far passare mysql_real_connect () nel parametro client_flag . Non sono sicuro della lingua o dell'interfaccia che stai utilizzando, quindi non so se ti permetta di specificare questo flag di connessione.

Tuttavia, se riesci a passare il flag client e hai bisogno solo di due diversi tipi di utenti, puoi configurare wait_timeout e interactive_timeout in modo diverso nella configurazione del server MySQL, e quindi utilizzare quello con il valore più breve quando si desidera che una determinata sessione scada prontamente.

Se si utilizza Connector / J , puoi utilizzare sessionVariables nell'URL JDBC del client in questo modo: jdbc: mysql: // nome host: 3306 / schema? sessionVariables = wait_timeout = 600

Altri connettori per altre lingue probabilmente consentiranno lo stesso.

init_connect verrà eseguito ogni volta che un utente accede, quindi possiamo scrivere una minuscola istruzione e impostare il valore in base all'utente. Si noti che init_connect non verrà eseguito per il superutente.

mysql > SET GLOBAL init_connect = " SET @@ wait_timeout = CASE QUANDO CURRENT_USER () COME 'app1 @%' THEN '30' ELSE @@ wait_timeout END " ;;

Ho controllato la tabella mysql.user e non sembra che ci sia un'impostazione lì:

+-----------------------+-----------------------------------+------+-----+---------+-------+
| Field                 | Type                              | Null | Key | Default | Extra |
+-----------------------+-----------------------------------+------+-----+---------+-------+
| Host                  | char(60)                          | NO   | PRI |         |       |
| User                  | char(16)                          | NO   | PRI |         |       |
| Password              | char(41)                          | NO   |     |         |       |
| Select_priv           | enum('N','Y')                     | NO   |     | N       |       |
| Insert_priv           | enum('N','Y')                     | NO   |     | N       |       |
| Update_priv           | enum('N','Y')                     | NO   |     | N       |       |
| Delete_priv           | enum('N','Y')                     | NO   |     | N       |       |
| Create_priv           | enum('N','Y')                     | NO   |     | N       |       |
| Drop_priv             | enum('N','Y')                     | NO   |     | N       |       |
| Reload_priv           | enum('N','Y')                     | NO   |     | N       |       |
| Shutdown_priv         | enum('N','Y')                     | NO   |     | N       |       |
| Process_priv          | enum('N','Y')                     | NO   |     | N       |       |
| File_priv             | enum('N','Y')                     | NO   |     | N       |       |
| Grant_priv            | enum('N','Y')                     | NO   |     | N       |       |
| References_priv       | enum('N','Y')                     | NO   |     | N       |       |
| Index_priv            | enum('N','Y')                     | NO   |     | N       |       |
| Alter_priv            | enum('N','Y')                     | NO   |     | N       |       |
| Show_db_priv          | enum('N','Y')                     | NO   |     | N       |       |
| Super_priv            | enum('N','Y')                     | NO   |     | N       |       |
| Create_tmp_table_priv | enum('N','Y')                     | NO   |     | N       |       |
| Lock_tables_priv      | enum('N','Y')                     | NO   |     | N       |       |
| Execute_priv          | enum('N','Y')                     | NO   |     | N       |       |
| Repl_slave_priv       | enum('N','Y')                     | NO   |     | N       |       |
| Repl_client_priv      | enum('N','Y')                     | NO   |     | N       |       |
| Create_view_priv      | enum('N','Y')                     | NO   |     | N       |       |
| Show_view_priv        | enum('N','Y')                     | NO   |     | N       |       |
| Create_routine_priv   | enum('N','Y')                     | NO   |     | N       |       |
| Alter_routine_priv    | enum('N','Y')                     | NO   |     | N       |       |
| Create_user_priv      | enum('N','Y')                     | NO   |     | N       |       |
| ssl_type              | enum('','ANY','X509','SPECIFIED') | NO   |     |         |       |
| ssl_cipher            | blob                              | NO   |     |         |       |
| x509_issuer           | blob                              | NO   |     |         |       |
| x509_subject          | blob                              | NO   |     |         |       |
| max_questions         | int(11) unsigned                  | NO   |     | 0       |       |
| max_updates           | int(11) unsigned                  | NO   |     | 0       |       |
| max_connections       | int(11) unsigned                  | NO   |     | 0       |       |
| max_user_connections  | int(11) unsigned                  | NO   |     | 0       |       |
+-----------------------+-----------------------------------+------+-----+---------+-------+
37 rows in set (0.00 sec)

A seconda che tu stia usando MySQLi o PDO, le tue connessioni MySQL PHP dovrebbero riagganciare quando la richiesta lo fa o essere condivise in un pool per il processo Apache.

Ad esempio, con PDO, per disattivare le connessioni permanenti (penso che sia l'impostazione predefinita), connettiti al tuo DB con:

$ pdo = nuovo PDO ($ dsn, $ user, $ pass, Array (PDO :: ATTR_PERSISTENT = > false));

Se vuoi che i tuoi script utilizzino connessioni permanenti, ma hai troppe connessioni aperte al tuo database in modalità sleep, dovresti pensare a configurare i tuoi MaxServers , MaxSpareServers , MinSpareServers e StartServers in modo che non così tanti restino in giro quando non sono necessari.

http://www.percona.com/doc/ Percona-toolkit / 2.1 / PT-kill.html

È possibile terminare le connessioni per utente con pt-kill. È possibile pianificare questo o impostare un processo in background per gestirlo.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top