Úvod:
Tento příspěvek je kopií nádherného následujícího příspěvku:
https://blackbird.si/mysql-corrupted-innodb-tables-recovery-step-by-step-guide/https://blackbird .si/mysql-corrupted-innodb-tables-recovery-step-by-step-guide/
Zde jsou některé důležité výsledky:
MySQL – Obnova poškozených tabulek InnoDB – průvodce krok za krokem
Zveřejněno v databázích od Alena Krmelje dne 19. března 2013, 5–6 minut
Tabulky InnoDB se nepoškodí snadno, ale když se to stane, obvykle se to stane kvůli problémům s hardwarem, výpadkům napájení nebo chybě MySQL. Zanechává vám poškozené stránky v tabulkovém prostoru InnoDB a zotavení z toho může být problém. Když vaše MySQL správně havaruje a nechce se vracet, můžete zaznamenat opakování podobné chyby:
InnoDB: Assertion failure in thread 1129654592 in file ibuf0ibuf.c line 4231 InnoDB: Failing assertion: page_get_n_recs(page) > 1 InnoDB: We intentionally generate a memory trap. InnoDB: Submit a detailed bug report to http://bugs.mysql.com. InnoDB: If you get repeated assertion failures or crashes, even InnoDB: immediately after the mysqld startup, there may be InnoDB: corruption in the InnoDB tablespace. Please refer to InnoDB: http://dev.mysql.com/doc/refman/5.5/en/forcing-innodb-recovery.html InnoDB: about forcing recovery. mysqld got signal 6 ; This could be because you hit a bug. It is also possible that this binary or one of the libraries it was linked against is corrupt, improperly built, or misconfigured. This error can also be caused by malfunctioning hardware. We will try our best to scrape up some info that will hopefully help diagnose the problem, but since we have already crashed, something is definitely wrong and this may fail. ... some backtrace ... The manual page at http://dev.mysql.com/doc/mysql/en/crashing.html contains information that should help you find out what is causing the crash. mysqld_safe Number of processes running now: 0 mysqld_safe mysqld restarted
Obnova z poškozených tabulek InnoDB
Krok 1 – Uveďte databázi do režimu obnovení
Měli byste zrušit svou databázi. Vypněte jej pro případ, že stále běží a spamuje tyto zprávy ve vašem protokolu. Jako poslední možnost můžete proces také zabít. Chcete-li obnovit databázi, budete ji muset spustit v režimu obnovy pomocí innodb_force_recovery
. Měli byste vědět, že tento režim obnovy umožňuje, aby vaše databáze byly pouze pro čtení. Uživatelé, kteří se k němu připojují, nemohou aktualizovat, vkládat ani jiným způsobem měnit existující data. Abyste zabránili tomu, že se vaše MySQL dostane do rány, jakmile se vrátí, doporučuji vám také změnit port serveru MySQL z 3306 na něco náhodného. Přidejte innodb_force_recovery=1
do vašeho my.cnf
V případě, že se váš server nechce vrátit, můžete toto číslo dále zvýšit z 1 na 6, podívejte se do manuálu MySQL, abyste viděli, jaké jsou rozdíly.
Nezapomeňte zkontrolovat své protokoly MySQL a pokud se zacyklí s něčím jako:
InnoDB: Waiting for the background threads to start
Měli byste také přidat innodb_purge_threads=0
do vašeho my.cnf
.
Takže dohromady, abych vrátil databázi, musel jsem přidat tyto 3 parametry do my.cnf
:
port = 8881 innodb_force_recovery=3 innodb_purge_threads=0
Krok 2 – Zkontrolujte, které tabulky jsou poškozené, a vytvořte seznam
Nyní máte databázi zálohovanou a spuštěnou, ale v režimu obnovy. Nemůžete měnit své databáze / tabulky. Pokud to zkusíte, zobrazí se chyba:
Got error -1 from storage engine
Musíme zjistit, které tabulky byly poškozeny. Abychom to udělali, spustíme:mysqlcheck --all-databases
Zkontrolujte řádky, kde je uvedeno, že tabulka je poškozená. Zapište si všechny tabulky/databáze, u kterých došlo k chybě. Budete muset mysqldump
v režimu obnovy a znovu je naimportujte po spuštění zpět do normálního režimu MySQL. Dovolte mi také připomenout, že innochecksum
příkaz mi nepomohl se zjištěním, které tabulky jsou poškozené, takže se s tím neobtěžujte.
Krok 3 – Zálohujte a zrušte své poškozené tabulky
Jakmile získáte seznam poškozených tabulek, měli byste je mysqldumpovat do jejich vlastních souborů .sql, takže budete mít zálohu pro reimport. V případě, že by vás zajímalo, jak vypsat pouze jednu tabulku v databázi:
mysqldump my_database table> database.table.sql
Po vytvoření zálohy zrušte poškozené tabulky provedením:drop table database.table; z vašeho MySQL shellu. Nyní jste vyčistili databázi MySQL, takže je čas ji znovu spustit bez režimu obnovy.
Krok 4 – Restartujte MySQL v normálním režimu
Když v naší databázi nezůstanou žádné poškozené tabulky, měli bychom odebrat nastavení my.cnf, které jsme přidali v kroku 1. Nastavení portu zatím neodstraňujte, protože ve vaší databázi stále chybí tabulky, které jste zálohovali a potřebujete k reimportu. Restartujte MySQL.
Krok 5 – Import zálohy .sql
Importujte každou dumpingovou tabulku .sql do jejich respektované databáze. Chcete-li to provést z CLI:
mysql database < database.table.sql
Krok 6 – Změňte port a vezměte si pivo
Po dokončení importu tabulek můžete změnit nastavení portu v my.cnf
. Samozřejmě poté restartujte MySQL. Mělo by se vrátit a začít fungovat stejně jako před havárií. Dejte si pivo a klikněte na horní část tohoto příspěvku, dejte mi vědět, že vám tento článek pomohl vyřešit váš problém.