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 🙂

Napsat komentář

Vaše emailová adresa nebude zveřejněna. Vyžadované informace jsou označeny *