MySQL-tabeller kan drabbas av korruption, vilket resulterar i oläslig data och potentiella serverkrascher. Denna guide visar hur du säkerhetskopierar, diagnostiserar och reparerar korrupta tabeller i både MyISAM- och InnoDB-lagringsmotorer.
Bakgrund
Vanliga orsaker till tabellkorruption inkluderar:
- Avbrott i MySQL-servern under en skrivoperation
- Samtidig ändring av en tabell av både ett externt program och servern
- Oväntad avstängning av maskinen
- Hårdvarufel i datorn
- Programvarufel i MySQL-koden
Så här gör du
-
Steg 1: Skapa säkerhetskopia
Innan du försöker felsöka eller åtgärda något är det viktigt att skapa en säkerhetskopia av din datakatalog. Detta minimerar risken för dataförlust.
Stoppa först MySQL-tjänsten:
sudo systemctl stop mysqlObs: På vissa plattformar som Rocky Linux kan MySQL-tjänsten heta
mysqldistället.Duplicera sedan all din data till en ny säkerhetskopieringskatalog. För Ubuntu-system är standarddatakatalogen vanligtvis
/var/lib/mysql/:cp -r /var/lib/mysql /var/lib/mysql_bkp -
Steg 2: Kontrollera och reparera MyISAM-tabeller
Om tabellen använder MyISAM-lagringsmotoren kan du fastställa dess status genom att köra en
CHECK TABLE-sats från MySQL-prompten:mysql> CHECK TABLE table_name;Utdata kommer att innehålla ett meddelande som anger om tabellen är korrupt. Om det bekräftas är nästa steg att försöka reparera:
mysql> REPAIR TABLE table_name;Efter en lyckad reparation bör utdata innehålla ett meddelande som bekräftar slutförandet av reparationsprocessen. Till exempel:
+--------------------------+--------+----------+----------+ | Table | Op | Msg_type | Msg_text | +--------------------------+--------+----------+----------+ | database_name.table_name | repair | status | OK | +--------------------------+--------+----------+----------+ -
Steg 3: Hantera InnoDB-tabeller genom omstart
Om den korrupta tabellen använder InnoDB-lagringsmotorn skiljer sig reparationsprocessen. InnoDB är standardlagringsmotorn i MySQL från version 8.0 och framåt, med automatiserade korruptionskontroller och reparationer. InnoDB identifierar korrupta sidor genom att utföra checksummor på varje sida den läser. Om en checksumdiskrepans upptäcks stoppas MySQL-servern automatiskt.
Att reparera InnoDB-tabeller är sällan nödvändigt på grund av InnoDB:s inbyggda mekanism för kraschåterställning, som vanligtvis löser de flesta problem vid serveromstart. Försök att starta om MySQL-tjänsten för att kontrollera om den återställer åtkomsten till servern:
sudo systemctl restart mysql -
Steg 4: Aktivera InnoDB force_recovery (om omstart misslyckas)
Om servern förblir kraschad eller otillgänglig kan aktivering av InnoDB:s
force_recovery-alternativ ge en lösning. Redigera filenmysqld.cnf, som vanligtvis finns i/etc/mysqlpå Ubuntu- och Debian-system, eller/etc/my.cnf.dpå Red Hat- och Rocky-system.sudo nano /etc/mysql/mysql.conf.d/mysqld.cnfI avsnittet
[mysqld], lägg till följande rad:[mysqld] innodb_force_recovery=1Spara och stäng filen, försök sedan att starta om MySQL-tjänsten.
-
Steg 5: Dumpa, släpp och återställ tabellen
Om åtkomsten till den korrupta tabellen lyckas efter att ha aktiverat
force_recovery, använd verktygetmysqldumpför att exportera dina tabelldata till en ny fil:mysqldump database_name table_name > out.sqlSläpp därefter tabellen från databasen:
mysql -u user -p --execute="DROP TABLE database_name.table_name"Efter detta steg, återställ tabellen med hjälp av dumpfilen som skapats:
mysql -u user -p < out.sqlDenna process syftar till att återställa från en kraschad eller otillgänglig MySQL-server genom att bygga om tabellen från en logisk säkerhetskopia.