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


9

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?

Risposte:


11

È 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 app PHP su un server di app che contatta MySQL su un server DB.

Ecco cosa dice la documentazione MySQL con queste impostazioni:

  • wait_timeout (impostazione predefinita 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 (impostazione predefinita 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 (impostazione predefinita 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 (impostazione predefinita 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 essere eseguite anche dopo aver perso il contatto, è necessario eseguire KILL sull'ID del 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.


Esiste un modo standard e affidabile per eseguire KILL su processi in esecuzione da molto tempo o di solito viene eseguito tramite un lavoro script / cron bash?
asthasr,

In realtà ho scritto un post nel maggio 2011 su come lanciare uno script usando information_schema per uccidere un mucchio di connessioni DB: dba.stackexchange.com/a/2637/877
RolandoMySQLDBA

"Assicurati che questi timeout siano impostati su un livello sufficientemente elevato da ospitare query che potrebbero essere eseguite per un tempo molto lungo, che può includere: AGGIORNAMENTI di massa ..." esempio: php + mysql devo selezionare tutti i record da una colonna della tabella, quindi recupera righe e quindi fare qualcosa ... quindi aggiornare un altro record con un nuovo valore. Metti il ​​caso in cui questo script richiede circa 5+ minuti. Un SELEZIONA all'inizio e un AGGIORNAMENTO alla fine, recupera le righe e fai ... nel mezzo. Puoi spiegare cosa deve fare wait_timeout in questa situazione? Davvero non è chiaro per me ... qual è un valore sicuro per wait_timeout per liberare risorse
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.