GNU/Linux >> Znalost Linux >  >> Linux

Oprava databází MySQL InnoDB

Ú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.


Linux
  1. Jak kopírovat tabulky MySQL mezi databázemi

  2. MySQL – Převod na data podle tabulky pro InnoDB

  3. Zobrazení typů databází MySQL v bash

  1. Aktualizace MariaDB na verzi 10.2.35 nebo v10.3.26 zobrazuje databáze MySQL jako offline v cPanelu.

  2. Práce s databázemi cPanel MySQL

  3. Zálohování MySQL 1.1

  1. Jak spravovat databáze a uživatele MySQL v cPanel

  2. Inkrementální zálohování MySQL – bodové zálohování a obnova databází InnoDB a MyIsam

  3. Nastavení připojení pro databáze MySQL