7.7.2015

foto Tomáš Hofman

Tomáš Hofman
+420 777 634 660
tomas.hofman@hobrasoft.cz

MySQL je velmi používaná relační databáze, která i přes svou oblíbenost trpí několika těžko pochopitelnými problémy. Jedním z nich je i fakt, že někdy umře a nechá po sobě nekonzistentní data na disku. Tyto takzvaně koruplté (corrupted) tabulky pak můžou buďto vadit v dalším spuštění, nebo při tom příjdeme přímo o cenná data. První na co je potřeba dát si pozor před spuštěním databáze s takto poškozenými datovými soubory je nutnost udělat si zálohu těchto dat. Obvykle je možné ji provést okopírováním adresáře /var/lib/mysql někam bokem.

Jestliže jsme provedli zálohu offline havarované databáze, můžeme zkusit znovu spustit MySQL (obvykle něco jako /etc/init.d/mysql start, nebo tak něco). Pokud se to podaří, tak MySQL se pokusí data z databáze načíst, opravit a začít znovu používat. Někdy se to může podařit, jindy ne. Pokud se to nepodaří, pak může pro záchranu dat pomoci následující postup:

  1. Uděláme si kopii zálohy původní databáze na nějaké provozuschopné místo (například do /var/lib/mysql.old) a nastavíme této kopii stejné vlastnictví a oprávnění jako u originální tabulky.
  2. Okopírujeme si soubor /etc/mysql/my.cnf například do /etc/mysql/my.old.cnf a upravíme jej tak, aby ukazoval na tuto naši kopii starých dat, současně pak změníme nastavení portu (například na 3307), PID souboru (například na /var/run/mysqld/mysqld.old.pid) a socketu (například na /var/run/mysqld/mysqld.old.sock).
  3. Nastartujeme MySQL (něco jako /etc/init.d/mysql start)
  4. Nastartujeme MySQL s původními daty: mysqld_safe --defaults-file=/etc/mysql/my.old.cnf.
    Pozor: při startu se načtou data tak jak jsou, ale při ukončení se je MySQL pokusí uložit opravená, což může vést ke ztrátě dat! Proto vždy extrahujte data pouze z prvního spouštění MySQL se starými daty.
  5. Můžeme použít MySQL řádkového klienta (mysql -P 3307 ...), nebo MySQL dump nástroj (mysqldump -P 3307 ...) pro extrakci tabulek a dat, která nas zajímají.
  6. Nakonec ukončíme obě MySQL a spustíme už jen tu, do které budeme doplňovat chybějící data. Rovněž nemusí být od věci po sobě uklidit dočasné kopie apod.

MySQL pochopitelně nabízí i jiné způsoby jak spustit vícero instancí současně, nicméně principielně se neliší a tento je poměrně přehledný.

Import dat samotných je pak otázka toho jak jsme si data z databáze vytahali. MySQL dump nástroj umí tato data uložit do souboru jak v podobě příkazů pro vytvoření potřebné tabulky, tak i příkazů pro naplnění této tabulky daty.

Ačkoliv se jedná o na internetu vcelku dobře dokumentovaný proces, má jisté záludnosti především v onom přeuložení dat po první startu (resp. konci) běhu MySQL s poškozenými soubory. Věřím, že výše nastíněný postup vám může pomoci při řešení obdobných problémů.

Hobrasoft s.r.o. | Kontakt