it-swarm.it

Il client scade, mentre la query MySQL rimane in esecuzione?

Abbiamo riscontrato un problema in cui una query di sola lettura, eseguita attraverso il workbench di MySQL, è scaduta dal punto di vista dell'interfaccia utente di un utente e è rimasta in esecuzione sul server (e apparentemente consumando sempre più risorse) fino a quando non si è verificata un'interruzione.

Domande

  • Esiste un modo standard per affrontare questo tipo di problema in MySQL?
  • C'è una causa fondamentale che dobbiamo evitare?
9
asthasr

È necessario esaminare quali valori predefiniti sono presenti per i timeout:

mysql> show variables like '%timeout';
+----------------------------+-------+
| Variable_name              | Value |
+----------------------------+-------+
| connect_timeout            | 10    |
| delayed_insert_timeout     | 300   |
| innodb_lock_wait_timeout   | 50    |
| innodb_rollback_on_timeout | OFF   |
| interactive_timeout        | 60    |
| net_read_timeout           | 30    |
| net_write_timeout          | 60    |
| slave_net_timeout          | 3600  |
| table_lock_wait_timeout    | 50    |
| wait_timeout               | 60    |
+----------------------------+-------+
10 rows in set (0.00 sec)

Di solito, cerco diverse variabili di timeout. Questo è di fondamentale importanza se si utilizza MySQL in remoto da MySQL Workbench, client mysql o PHP su un server di app che contatta MySQL su un server DB.

Ecco cosa dice la documentazione MySQL con queste impostazioni:

  • wait_timeout (Predefinito 28800 [8 ore]): il numero di secondi in cui il server attende l'attività su una connessione non interattiva prima di chiuderla. Questo timeout si applica solo alle connessioni file socket TCP/IP e Unix, non alle connessioni effettuate utilizzando named pipe o memoria condivisa. All'avvio del thread, il valore wait_timeout della sessione viene inizializzato dal valore wait_timeout globale o dal valore interactive_timeout globale, a seconda del tipo di client (come definito dall'opzione di connessione CLIENT_INTERACTIVE a mysql_real_connect ()). Vedi anche interactive_timeout.
  • interactive_timeout (Predefinito 28800 [8 ore]): il numero di secondi in cui il server attende l'attività su una connessione interattiva prima di chiuderla. Un client interattivo è definito come client che utilizza l'opzione CLIENT_INTERACTIVE per mysql_real_connect (). Vedi anche wait_timeout.
  • net_read_timeout (Default 30): il numero di secondi di attesa per ulteriori dati da una connessione prima di interrompere la lettura. Quando il server legge dal client, net_read_timeout è il valore di timeout che controlla quando interrompere. Quando il server sta scrivendo sul client, net_write_timeout è il valore di timeout che controlla quando interrompere. Vedi anche slave_net_timeout.
  • net_write_timeout (Default 60): il numero di secondi di attesa per la scrittura di un blocco su una connessione prima di interrompere la scrittura. Vedi anche net_read_timeout.

Assicurati che questi timeout siano impostati su un livello sufficientemente elevato da consentire l'esecuzione di query che possono essere eseguite per un tempo molto lungo, che possono includere:

  • Massa UPDATEs
  • Massa DELETEs
  • ENABLE KEYS su un MyISAM di grandi dimensioni

Per gestire le query che continuano a funzionare dopo aver perso il contatto con esso, è necessario eseguire [~ # ~] kill [~ # ~] rispetto all'ID processo della query di lunga durata. Anche con il comando KILL, dovrai attendere qualsiasi query che si trova nel mezzo di passaggi intensivi del disco o che siano in corso mutex interni.

11
RolandoMySQLDBA