Jak opravit poškozené tabulky v MySQL

Většina z vás se s poškozenou tabulkou v MySQL zřejmě nikdy nesetká, a to je dobře 🙂 Pokud jste ale programátoři a testujete vlastní skripty na vlastním počítači či VPS může se vám poměrně snadno stát, že něco přehlédnete a skript se dostane do smyčky anebo nastane jiný důvod proč vypnout násilně vypnout server. Právě takovéto výpadky nejčastěji stojí za poškozenou tabulkou v databázi.

Co je to poškozená tabulka? #

Poškozenou tabulku nejčastěji poznáte jednoduše podle toho, že aplikace nefunguje. Zničehonic se objeví chyba, která ukazuje na problém se SQL dotazem. Pozor u CMS jako WordPress se spíše setkáte s obecnou chybou – Během připojování k databázovému serveru došlo k chybě.

Když dojde k náhlému výpadku databázového serveru a používáte session, právě tato tabulka to nejčastěji odnese.

Poškozené MyISAM tabulky #

Jako deafultní se před verzí MySQL 5.5.5 používaly tabulky MyISAM. Tento druh tabulek je poměrně odolných vůči různým druhům poškození, ovšem například v případě náhlého výpadku se tak stane. Problém u nich je, že výjimečně mohou navenek i fungovat. Většinou se ale začnou objevovat různé podivné chyby.

Poškozené InnoDB tabulky #

Od verze MySQL 5.5.5 jsou defaultně používány. Poškození u nich nebývá tak vážně, protože i po nárazovém vypnutí je interní mechanizmus dokáže celkem rychle a efektivně dát dohromady díky logu s událostmi.

Poškozené InnoDB tabulky se opravují hůře a někdy je třeba data převést (zduplikovat) do MyISAM. V některých případech je obnova InnoDB velice náročná a je potřeba použít sofistikovanější postupy. Například když se log soubor zapíše na vadný sektor na disku. To si užijete 🙂

Zjištění chyby #

Pokud se nalogujete do phpMyAdmin občas už u tabulky na první pohled uvidíte, že není něco v pořádku. Například u problémových tabulek je napsáno že se používají (in use). Jistotu ale získáte jednoduše. Zaškrtněte všechny tabulky a zvolte “check” (v české verzi “Zkontrolovat tabulku”). Následně proběhne kontrola. Zobrazí se tabulka s protokolem. Jednotlivé sloupce jsou:

  • Table – název tabulky
  • Op – operace kterou provádíte – zde bude “check”
  • Msg_type – druh zprávy – “OK” – vše v pořádku, “warning” – varování, “error” – chyba
  • Msg_text – výsledek s popisem případných varování a chyb

Pozor příkaz “check” nemusí v některých vzácných případech u tabulek InnoDB ukazovat chyby.

Oprava chyb #

Oprava chyb je poměrně jednoduchá místo “check” dáte “repair” (česky “Opravit tabulku”). Ovšem než se do toho pustíte je třeba si uvědomit pár věcí. Pokud se v tabulce nachází nějaká důležitá data o část z nich můžete přijít. Tabulky se session, které to odnesou většinou vás nemusí trápit, ale pokud zrovna skript upravovat něco v tabulce s uživateli, tak chybějící data můžou znatelně bolet.

Ve většině případů jsou problémové řádky smazány. Po provedené oprav uvidíte v protokolu kolik řádků bylo smazáno. Jestli máte zálohu, tak chybějící řádky můžete doplnit z ní. Je to náročný proces, ale stále lepší než přijít o nová data. Samozřejmě záleží jen na vás.

Někdy lze důležitá data dostat z tabulky i jiným způsobem. Takže doporučují vám si jí před spuštěním “repair” zazálohovat.

Ještě jedno upozornění na konec #

Opravu tabulek byste měli provádět za klidu databáze. Tedy po dobu práce s tabulkami vypněte aplikaci pokud je to možné. Jednak nechcete aby jste museli opravovat opravovanou tabulku a také může aplikace v kombinaci s poškozenou tabulkou vytvářet nesmyslná data. Občas také dochází k zbytečnému zatěžování databázového serveru. Prostě to vypněte a pusťte se do oprav 🙂