it-swarm-eu.dev

Jak identifikujete poškození tabulky InnoDB?

Mám několik tabulek, které jsou rozděleny a mají několik indexů na replikovaném slave. Po zkopírování snímku (ověřeno v bezpečí) na nového otroka a upgradování mysqldu z 5.1.42 na 5.5.15 a restartování replikace se mi zobrazuje chyba InnoDB s chybovou zprávou „Neplatný ukazatel ...“

K těmto chybám došlo na 2 serverech s odlišným hardwarem a O/S. Po spuštění:

ALTER TABLE .... COALESCE PARTION n;

problém zmizí pro tuto tabulku.

Moje otázka je však širší, a to je „Jak identifikujete poškození tabulky InnoDB?“ nebo přeformulované „Jak hodnotíte zdraví tabulky InnoDB?“ Je "CHECK TABLE" jediný nástroj k identifikaci problémů před pádem?

Nejste si jisti, jestli na tom záleží, ale došlo k selhání běhu: Verze: '5.5.15-55-log' socket: '/opt/mysql.sock' port: 3306 Percona Server (GPL), Release rel21.0, Revision 158

24
randomx

Morgan naznačuje ve svém komentáři náznak, že InnoDB neustále kontroluje poškozené stránky pomocí kontrolních součtů na stránkách, které čte. Pokud InnoDB zjistí nesoulad kontrolního součtu, bude pád zastavte server.

Pokud chcete tento proces urychlit (místo čekání na to, aby InnoDB přečetl poškozenou stránku), můžete použít innochecksum :

Protože nesrovnalosti kontrolního součtu způsobí, že InnoDB úmyslně vypne běžící server, může být vhodnější použít tento nástroj, než čekat, až server ve výrobním využití narazí na poškozené stránky.

Zajímavé upozornění:

innochecksum nelze použít na soubory tabulkového prostoru, které již server otevřel. Pro takové soubory byste měli použít CHECK TABLE ke kontrole tabulek v tabulkovém prostoru.

Takže ano, pro online stůl CHECK TABLE je pravděpodobně nástroj (nebo jak bylo uvedeno - v jiné odpovědimysqlcheck, pokud chcete najednou dělat více než jednu databázi.)

Pokud můžete databázi vypnout, můžete ji vynutit pomocí kontrolních součtů pomocí innochecksum

Anecdotal: V tabulkovém prostoru innodb 29 GB (s innodb_file_per_table=1), tento skript trval asi 2 minuty

#!/bin/bash
for i in $(ls /var/lib/mysql/*/*.ibd)
do
  innochecksum -v $i
done

Jako bonus však, protože používáte Percona, implementovali novou metodu pro rychlý kontrolní součet inodb . Nikdy jsem to nepoužil, ale mohlo by to proces urychlit.

18
Derek Downey

VAROVÁNÍ: před vyzkoušením kteréhokoli z těchto pokynů se důrazně doporučuje ověřit, zda existuje zdravá záloha vaší databáze v ruce, jen pro případ. (děkuji @Nick za upozornění)

Zkuste použít příkaz mysqlcheck. Na terminálu:

mysqlcheck -u username -p --databases database1 database2

Tento příkaz vydá seznam všech tabulek a stav, který vám řekne, zda došlo k nějakému poškození:

table1  OK
table2  OK
table3  OK
tableN  OK

Díky tomu už budete vědět, které tabulky musíte opravit. Jen v případě, že chcete opravit vše najednou:

mysqlcheck -u username -p --auto-repair --databases database1 database2 

Více o mysqlcheck: http://dev.mysql.com/doc/refman/5.0/en/mysqlcheck.html

Poznámka: otázku jste označili pomocí percona . Neměl jsem ponětí o tom, co to bylo, tak jsem se googlil. Zdá se, že to je vidlička MySQL, ale nemám důvod se domnívat, že příkazy jsou nekompatibilní (prsty zkřížené).


Někdo mi ukázal tuto příručku, která obsahuje konkrétnější pokyny pro obnovu databáze InnoDB pro kritičtější situace, kdy se celá databáze nespustí: http://www.softwareprojects.com/resources/programming/t-how-to -fix-mysql-database-myisam-innodb-1634.html

6
marcio

Podle MySQL 5.0 Certifikační studijní příručka, Strana 303, 444 Část 30.4 :

Tabulky InnoDB můžete zkontrolovat pomocí příkazu CHECK TABLE nebo pomocí klientského programu, který vám příkaz vydá. Pokud však má tabulka InnoDB problémy, nemůžete ji opravit pomocí OPRAVNÉ TABULKY, protože tento příkaz se vztahuje pouze na MyISAM.

Pokud kontrola tabulky naznačuje, že tabulka InnoDB má problémy, měli byste být schopni obnovit tabulku do konzistentního stavu tím, že ji uložíte do mysqldump, zrušíte ji a znovu z ní vytvoříte.

V případě havárie serveru MySQL nebo na hostiteli, na kterém běží, mohou být některé tabulky InnoDB nutné opravit. Obvykle stačí restartovat server, protože paměťový modul InnoDB provádí automatické zotavení v rámci spouštěcí sekvence. Ve vzácných případech se server nemusí spustit z důvodu selhání automatického obnovení InnoDB. Pokud k tomu dojde, použijte následující postup:

  • Restartujte server s možností --innodb_force_recovery nastavenou na hodnotu ve vzteku od 1 do 6. Tyto hodnoty označují zvyšující se úroveň opatrnosti při vyhýbání se havárii a zvyšující se úroveň tolerance pro možnou nekonzistenci v obnovených tabulkách. Dobrou hodnotou je začít 4.

  • Když spustíte server s --innodb_force_recovery nastaveným na nenulovou hodnotu, InnoDB zachází s tabulkovým prostorem pouze pro čtení. V důsledku toho byste měli výpisy InnoDB vypsat pomocí mysqldump a poté je zrušit, dokud je tato možnost aktivní. Poté restartujte server bez volby --innodb_force_recovery. Až server přijde, obnovte tabulky InnoDB ze souborů výpisu.

  • Pokud předchozí kroky selžou, je nutné obnovit tabulky InnoDB z předchozí zálohy.

Přečtěte si prosím MySQL Docs o InnoDB Forced Recovery

6
RolandoMySQLDBA

Zajímalo by mě, co se stane, když někdo použije data InnoDB vytvořená pomocí modulu InnoDB Plugin a poté přepne na jinou verzi InnoDB. To by mohlo vést k možnému poškození stránky v očích mysqld.

Všimněte si, co dokumentace MySQL ve formátu souboru InnoDB říká o této možnosti:

Obecně může novější verze InnoDB vytvořit tabulku nebo index, které nelze bezpečně číst nebo zapisovat s předchozí verzí InnoDB bez rizika selhání, zablokování, chybných výsledků nebo poškození. Plugin InnoDB představuje nový mechanismus ochrany před těmito podmínkami a pomáhá zachovat kompatibilitu mezi databázovými soubory a verzemi InnoDB.

Vyhodil bych data na otroka. Ve skutečnosti bych jen použil hrubou sílu získáním logického výpisu (mysqldump) dat:

  • Přetáhněte všechny databáze pomocí InnoDB na slave
  • Vypněte mysql na otroka
  • Odstraňte ibdata1, ib_logfile0 a ib_logfile1 na slave
  • Spusťte mysql na slave a nechte znovu vytvořit ibdata1, ib_logfile0 a ib_logfile1
  • mysqldump data z master do slave

Můj původní anwser je považován za „starou školu“. V tomto případě bych se však rozhodně podíval na formáty souborů, které používají soubory .ibd a/nebo ibdata1.

2
RolandoMySQLDBA