Perché MySQL produce così tanti file MYD temporanei?


9

Su un server Debian Linux, che ospita molti siti Web PHP / MySQL (gallerie fotografiche), a volte ho "molti" file come /tmp/#sql_6405_58.MYD.

Ad esempio oggi:

[2012-12-15 15:18:11] /tmp/#sql_6405_6.MYD : 88MB
[2012-12-15 15:18:11] /tmp/#sql_6405_3.MYD : 22MB
[2012-12-15 15:18:11] /tmp/#sql_6405_4.MYD : 138MB
[2012-12-15 15:18:11] /tmp/#sql_6405_10.MYD : 88MB
...
[2012-12-15 15:18:11] /tmp/#sql_6405_9.MYD : 15MB
[2012-12-15 15:18:11] /tmp/#sql_6405_65.MYD : 49MB
[2012-12-15 15:18:11] /tmp/#sql_6405_44.MYD : 69MB

(59 file contemporaneamente, per più di 6 GB ... sì, controllo i file di grandi dimensioni in / tmp)

Sfortunatamente, si /tmptrova sulla stessa partizione /e interrompe temporaneamente il server Web, perché /suppongo sia pieno. Quindi i file scompaiono e il server torna alla normalità.

Tutti i nomi dei file seguono il #sql_6405_*.MYDmodello. Vorrei capire quale operazione MySQL implica così tanti file temporanei. Ho circa 2000 database su questo server. È possibile sapere quale database è interessato?


1
Immagino che siano dati temporanei per operazioni di grandi dimensioni che utilizzano filesorte 6405 è il PID di mysql per mantenere separati i file temporanei da diverse istanze del server.

Devo chiedere a un amministratore di spostare la mia domanda?

Risposte:


14

Ci sono alcune opzioni che possono far materializzare le tabelle temporanee come tabelle MyISAM o che possono essere configurate per ritardarlo. Tenete a mente che per le tabelle temporanee basate su disco, non ci sono .frmi file, ma solo .MYDe .MYIfile (ovviamente. Il file .MYI non viene mai utilizzato in quanto è indice di una possibile tabella temporanea interna).

Ecco le opzioni:

Si dovrebbe anche considerare la documentazione di MySQL sull'uso della tabella delle temp interne

Le situazioni in cui vengono create le tabelle temporanee in memoria

  • Se è presente una clausola ORDER BY e una diversa clausola GROUP BY o se ORDER BY o GROUP BY contiene colonne di tabelle diverse dalla prima tabella nella coda di join, viene creata una tabella temporanea.
  • DISTINCT combinato con ORDER BY può richiedere una tabella temporanea.
  • Se si utilizza l'opzione SQL_SMALL_RESULT, MySQL utilizza una tabella temporanea in memoria, a meno che la query non contenga anche elementi (descritti più avanti) che richiedono l'archiviazione su disco.

Quando una tabella temporanea in memoria ha superato il minimo di (tmp_table_size o max_heap_table_size), mysqld effettua le seguenti operazioni:

  • Sospende la query
  • Copia il contenuto della tabella in memoria in una tabella temporanea MyISAM
  • Elimina la tabella in memoria
  • Continua la query, inviando i dati temporanei nella tabella temporanea MyISAM

Le situazioni in cui le tabelle temporanee in memoria vengono ignorate a favore del disco lo sono

  • Presenza di una colonna BLOB o TEXT nella tabella
  • Presenza di qualsiasi colonna in una clausola GROUP BY o DISTINCT maggiore di 512 byte
  • Presenza di qualsiasi colonna superiore a 512 byte nell'elenco SELEZIONA, se viene utilizzato UNION o UNION ALL

È necessaria una certa due diligence per ridurre la creazione della tabella temporanea sul disco

  • Impostazione join_buffer_size più grande
  • Impostazione di sort_buffer_size più grande
  • Impostazione di tmp_table_size e max_heap_table_size più grandi
  • Ottimizzazione delle query per ridurre al minimo o addirittura impedire le tabelle temporanee
  • Creazione di indici per creare viste preordinate di dati da singole tabelle
  • Installazione di RAM aggiuntiva per ospitare grandi tabelle temporanee in memoria

Se dopo tale due diligence, ci sono ancora delle tabelle temporanee che si formano sul disco, ecco una mossa disperata: mappare la creazione della tabella temporanea basata su disco sulla memoria.

Ecco un modo semplice e veloce per configurare un disco RAM da 16 GB usando tmpdir

STEP01) Crea cartella disco RAM

mkdir /var/mysql_tmpfs

STEP02) Aggiungi questo a my.cnf

[mysqld]
tmpdir=/var/mysql_tmpfs

PASSAGGIO03) Aggiungi questo a / etc / fstab

echo "none /var/mysql_tmpfs tmpfs defaults,size=16g 1 2" >> /etc/fstab

STEP04) Ricarica / etc / fstab

mount -a

scritta STEP05) service mysql restart

Successivamente, tutte le tabelle temporanee che diventano MyISAM vengono scritte sul disco RAM. Ciò dovrebbe accelerare la creazione di tabelle temporanee basate su disco.

Provaci !!!


1

Si tratta di query che si stanno spostando sul disco perché i risultati sono troppo grandi per la memoria.

Al termine della query, lo spazio si cancella.

Non c'è modo di abbinare definitivamente questi file temporanei alle query, ma è possibile ottenere indizi per fare una buona ipotesi da SHOW FULL PROCESSLIST; o MOSTRA STATO INNODB; o cercando nel registro degli errori se le query falliscono.


1

Ogni volta che usiamo le istruzioni alter sulla tabella Crea i file temporay # sql_6405_3.MYD e una volta fatto genera l'output e scompare.

Le tabelle modificate consentono a MySQL di copiare interi dati in file temporanei # sql.xxx.MYD e apportare modifiche ai file temporanei creati, quindi rilasciare i file di dati originali tablename.MYD e rinominare i file temporali in nome tabella.

Inoltre, per alcune query di ordinamento, crea file temporanei.

Come ho rintracciato. Questa cosa succede.


0

Penso che potresti trovare le query in questione nel log delle query lente, poiché le query che creano tabelle temporanee di grandi dimensioni di solito vengono eseguite a lungo, questo è ciò che mi ha aiutato oggi su un server in cui ho trovato la /tmppartizione piena a causa di un simile grande file temporaneo MySQL, era un file 4G, ho trovato la query nel registro delle query lente e ho segnalato la query agli sviluppatori e hanno trovato il danneggiamento della query e lo ripareranno, sembra laghi per un limite di istruzioni MySQL quindi ha funzionato per molto tempo e ha scritto un file temporaneo 4G e compilato la /tmppartizione.

E c'è un altro modo in cui potresti trovare ciò che ha causato questo grande file temporaneo, è binario, quindi non puoi leggerlo direttamente ma ho scoperto che puoi grep il testo contenente su di esso usando il comando stringhe Linux come questo,

strings name-of-mysql-temp-file

Mi sono assicurato dalle parole di testo che cosa eseguiva la query MySQL e l'ho creato.

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.