it-swarm-eu.dev

Proč MySQL produkuje tolik dočasných souborů MYD?

Na serveru Debian Linux, hostujícím mnoho webů PHP/MySQL (fotogalerie), někdy mám "mnoho" souborů, jako je /tmp/#sql_6405_58.MYD.

Například dnes:

[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 souborů současně, pro více než 6 GB ... ano, sleduji velké soubory v/tmp)

Bohužel, /tmp je ve stejném oddílu než / a dočasně to přeruší webový server, protože / je plný. Pak soubory zmizí a server je zpět do normálu.

Všechny názvy souborů následují #sql_6405_*.MYD vzor. Chtěl bych pochopit, které operace MySQL zahrnují tolik dočasných souborů. Na tomto serveru mám přibližně 2000 databází. Je možné vědět, která databáze se týká?

9
plegall

Existují některé možnosti, které mohou způsobit vytvoření dočasných tabulek jako tabulek MyISAM nebo mohou být nakonfigurovány tak, aby se zpozdily. Nezapomeňte, že u dočasných tabulek na disku neexistují žádné .frm soubory, ale pouze .MYD a .MYI soubory (samozřejmě. soubor .MYI se nikdy nepoužívá, protože je nemožné indexovat interní dočasnou tabulku).

Zde jsou možnosti:

Měli byste také zvážit dokumentaci MySQL o použití interní tabulky teplot

Jsou situace, kdy jsou vytvářeny dočasné tabulky v paměti

  • Pokud existuje klauzule ORDER BY a jiná klauzule GROUP BY nebo pokud OBJEDNÁVKA BY nebo GROUP BY obsahuje sloupce z tabulek jiných než první tabulka ve frontě spojení, vytvoří se dočasná tabulka.
  • DISTINCT v kombinaci s OBJEDNÁVKEM může vyžadovat dočasnou tabulku.
  • Pokud použijete možnost SQL_SMALL_RESULT, MySQL použije dočasnou tabulku v paměti, pokud dotaz také neobsahuje prvky (popsané později), které vyžadují uložení na disku.

Když dočasná tabulka v paměti překročila minimum (tmp_table_size nebo max_heap_table_size), mysqld provede následující:

  • Pozastaví dotaz
  • Zkopíruje obsah tabulky v paměti do dočasné tabulky MyISAM
  • Zahodí tabulku v paměti
  • Pokračuje v dotazu a odeslání dočasných dat do dočasné tabulky MyISAM

Jsou situace, kdy jsou dočasné tabulky v paměti vynechány ve prospěch disku

  • Přítomnost sloupce BLOB nebo TEXT v tabulce
  • Přítomnost libovolného sloupce v klauzuli GROUP BY nebo DISTINCT větší než 512 bajtů
  • Přítomnost libovolného sloupce většího než 512 bajtů v seznamu VÝBĚR, pokud se používá UNION nebo UNION ALL

K omezení vytváření dočasných tabulek na disku je vyžadována náležitá péče

  • Nastavení join_buffer_size větší
  • Nastavení sort_buffer_size větší
  • Nastavení tmp_table_size a max_heap_table_size větší
  • Ladění dotazů za účelem minimalizace nebo dokonce předcházení dočasným tabulkám
  • Vytváření indexů k vytvoření předběžného pohledu na data z jednotlivých tabulek
  • Instalace dalších RAM pro uložení velkých dočasných tabulek v paměti)

Pokud po takové due diligence jsou na disku stále vytvářeny dočasné tabulky, je zde jeden zoufalý tah: Mapování vytváření dočasných tabulek na disk do paměti.

Zde je rychlý a špinavý způsob, jak nastavit 16 GB RAM disk pomocí tmpdir

STEP01) Vytvořte RAM Složka disku)

mkdir /var/mysql_tmpfs

STEP02) Přidejte toto do my.cnf

[mysqld]
tmpdir=/var/mysql_tmpfs

KROK03) Přidejte to do/etc/fstab

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

KROK 04) Znovu načtěte/etc/fstab

mount -a

KROK05) service mysql restart

Poté jsou všechny dočasné tabulky, které se stanou MyISAM, zapsány na disk RAM). To by mělo urychlit vytváření dočasných tabulek na disku.

Pokusit se !!!

14
RolandoMySQLDBA

Jedná se o dotazy, které se převalují na disk, protože výsledky jsou příliš velké pro paměť.

Po dokončení dotazu se prostor vymaže.

Neexistuje způsob, jak tyto dočasné soubory definitivně spojit s dotazy, ale můžete získat vodítka pro dobrý odhad od SHOW FULL PROCESSLIST; nebo SHOW INNODB STATUS; nebo vyhledáním protokolu chyb, pokud dotazy selžou.

Kdykoli použijeme příkazy alter na tabulce Vytvoří # sql_6405_3.MYD dočasné soubory a jakmile je hotovo, vyvolá výstup a zmizí.

Změny v tabulkách umožňují MySQL kopírovat celá data do dočasných souborů # sql.xxx.MYD a provádět změny ve vytvořených dočasných souborech, pak přetažení původních datových souborů tablename.MYD a přejmenování časových souborů na název tabulky.

Také pro některé třídicí dotazy vytváří dočasné soubory.

Jak jsem vystopoval. Tato věc se stává.

1
Vinay

Myslím, že můžete najít dotyčné dotazy v protokolu pomalých dotazů, protože dotazy, které vytvářejí velké tempové tabulky, obvykle běží dlouhou dobu, takto mi to dnes pomohlo na serveru, kde jsem našel /tmp oddíl je plný kvůli podobnému velkému dočasnému souboru MySQL, byl to 4G soubor, našel jsem dotaz v protokolu pomalých dotazů a nahlásil dotaz vývojářům a našli korupci v dotazu a oni ji opraví, zdá se jezera pro omezení MySQL instrukce, takže to běhalo dlouhou dobu a napsal 4G dočasný soubor a vyplnil /tmp oddíl.

A existuje další způsob, jak zjistit, co způsobilo tento velký dočasný soubor, je to binární, takže jej nemůžete číst přímo, ale zjistil jsem, že na něm můžete obsáhnout text pomocí příkazů řetězce Linux, jako je tento,

strings name-of-mysql-temp-file

Z textových slov jsem se ujistil, co MySQL dotaz běžel a vytvořil.

0
linuxman1