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á?
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
Když dočasná tabulka v paměti překročila minimum (tmp_table_size nebo max_heap_table_size), mysqld provede následující:
Jsou situace, kdy jsou dočasné tabulky v paměti vynechány ve prospěch disku
K omezení vytváření dočasných tabulek na disku je vyžadována náležitá péče
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 !!!
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á.
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.