Portál AbcLinuxu, 10. května 2025 12:15
Zdravím,
nedávno jsem řešil jeden problém s nefunkční mysql. Databáze nenaběhla z důvodu nedostatku volného místa na disku, protože celý disk byl zaplněn ibdata1 souborem, který měl okolo 25GB. Nevim proč byl měl takovou velikost, tolik data tam nebylo, podle phpMyAdmina celá databáze měla pouze okolo 1GB. Tento server byl často restartován přerušením napájení a v tom bude nejspíš ten problém. Databáze prostě nenaběhla a tak server restartovali jestě než se stačila obnovit po pádu.
Nesetkal jste se někdo s něčím podobným, nebo nevíte jak tomu předejít? Dík za rady.
Zdravím,
AFAIK je to problém defaultního nastavení MySQL, které nenastavuje maximální velikost ibdata souborů (ale v komentáři v my.cnf je o tom zmínka ).
Doporučoval bych:
1) zazálohovat datafiles (ibdata*)
2) nahodit mysql (pokud nejde spustit z důvodu nedostatku volného místa, máte imho smůlu, je prostě potřeba místo uvolnit)
3) dumpnout databáze
4) zastavit mysql
5) nastavit innodb_data_file_path podle Vašich potřeb (viz http://dev.mysql.com/doc/refman/5.0/en/innodb-configuration.html)
6) nastartovat mysql (možná bude ještě předtím dobré udělat mysql_install_db), naimportovat vydumpované databáze (př itakovém objemu doporučuju pro import zakázat kontrolu cizích klíčů - SET FOREIGN_KEY_CHECKS=0;)
...nyní by se měl ibdata držet na velikosti dané direktivou innodb_data_file_path.
Dá se nastavit i jinak http://dev.mysql.com/doc/refman/5.0/en/multiple-tablespaces.html
Tohle přesně jsem udělal, export, smazaní DB, a import dat do nové.
Je mi ale záhodou, jakto že soubor ibdata1 tolik narostl. Tolik dat tam nemohlo být uloženo a data nebyla mazána. Nemohla velikost narůst při rekonstrukci souboru po nesprávném ukončení?
Ještě mě napadá jedna věc, jestli chyba může být někde v potvrzování transakcí.
je to tusim mrtvymi transakcemi a zaznamy, ktere se nemazou, ale zustanou v databazi i prestoze nebyly dokonceny, pomuze obnoveni dat z backupu nebo pro jine db existuje prikaz na vycisteni mrtvych zaznamu, kdyby jsi me zabil nevim.. ale myslim ze to zacinalo na F:))))
jj, fVakuum (joke)
Jedine reseni je nastavit innodb per table a pak innodb_data_file_path na nejakou max rozumnou hodnotu.
Data se ti tak budou ukladat do ibd souboru a ibdata ti casem naroste na max hodnotu, ale pak uz nepreroste.
Jinak transakce se ukladaji do transakcnich logu, takze maximalni hodnota ibdata muze byt malicka. Uz si to nepamatuji presne,
ale kdyz je innodb per table, tak by se nemelo skoro vubec vyuzit, ale celkove je innodb trochu tajemna, takze
bych urco nejakou max hodnotu dal a asi bych vubec nepouzil autoextend.
Tiskni
Sdílej:
ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.