MySQL-tabeller kan bli korrupte, noe som fører til uleselige data og potensielle serverkrasjer. Denne guiden fører deg gjennom diagnosering og reparasjon av korrupte tabeller i både MyISAM- og InnoDB-lagringsmotorer, ved hjelp av innebygde MySQL-verktøy og gjenopprettelsesmetoder.

Bakgrunn

Vanlige årsaker til tabellkorruptering inkluderer:

  • Mysql-serveravbrudd under en skriveoperasjon
  • Konkurrerende endring av en tabell både av et eksternt program og serveren
  • Uventet avslutting av maskinen
  • Hårdvarefeil i datamaskinen
  • Programmeringsfeil inni MySQL-koden

Før du prøver å feilsøke eller fikse noe, er det essensielt å lage en sikkerhetskopi av datakatalogen din for å minimere risikoen for dataloss.

Hvordan du fikser korrupte tabeller

  1. Trinn 1: Stopp MySQL og lag en sikkerhetskopi

    Stopp MySQL-tjenesten:

    sudo systemctl stop mysql

    Merk: På visse plattformer som Rocky Linux kan MySQL-tjenesten hete mysqld i stedet.

    Dupliser all din data til en ny sikkerhetskopikatalog. For Ubuntu-systemer er standarddatakatalogen vanligvis plassert på /var/lib/mysql/:

    cp -r /var/lib/mysql /var/lib/mysql_bkp
  2. Trinn 2: Sjekk om tabellen er korrupt (MyISAM)

    Hvis tabellen bruker MyISAM-lagringsmotoren, kan du bestemme dens status ved å utføre en CHECK TABLE-setning fra MySQL-prompten:

    mysql> CHECK TABLE table_name;

    Output vil inneholde et melding som indikerer om tabellen er korrupt.

  3. Trinn 3: Reparer MyISAM-tabeller

    Hvis tabellen bekreftes som korrupt, prøv å reparere den:

    mysql> REPAIR TABLE table_name;

    Efter en vellykket reparasjon skal outputen inneholde en melding som bekrefter at reparasjonsprosessen er fullført. For eksempel:

    +--------------------------+--------+----------+----------+
    | Table                    | Op     | Msg_type | Msg_text |
    +--------------------------+--------+----------+----------+
    | database_name.table_name | repair | status   | OK       |
    +--------------------------+--------+----------+----------+
  4. Trinn 4: Håndter InnoDB-tabeller med krasjgjenoppretting

    Hvis den korrupte tabellen bruker InnoDB-lagringsmotoren (standard fra MySQL 8.0 og fremover), er reparasjonsprosessen annerledes. InnoDB har automatisk korruptionskontroll og -reparasjon, som identifiserer korrupte sider ved å utføre sjekksummer på hver side den leser.

    Prøv å starte MySQL-tjenesten på nytt for å se om det gjenoppretter tilgang til serveren:

    sudo systemctl restart mysql

    InnoDBs innebygde krasjgjenopprettingsmekanisme løser vanlige problemer ved serveromstart.

  5. Trinn 5: Aktiver InnoDB Force Recovery (hvis nødvendig)

    Hvis serveren fortsatt krasjer eller er utilgjengelig, aktiver InnoDBs force_recovery-alternativ. Rediger mysqld.cnf-filen, som vanligvis ligger i /etc/mysql på Ubuntu- og Debian-systemer, eller /etc/my.cnf.d på Red Hat- og Rocky-systemer:

    sudo nano /etc/mysql/mysql.conf.d/mysqld.cnf

    I seksjonen [mysqld], legg til følgende linje:

    [mysqld]
    innodb_force_recovery=1

    Lagre og lukk filen, og prøv å starte MySQL-tjenesten på nytt.

  6. Trinn 6: Dump og gjenopprett InnoDB-tabellen

    Hvis tilgang til den korrupte tabellen er vellykket, bruk mysqldump-verktøyet for å eksportere tabellens data til en ny fil:

    mysqldump database_name table_name > out.sql

    Slett tabellen fra databasen:

    mysql -u user -p --execute="DROP TABLE database_name.table_name"

    Gjenopprett tabellen ved hjelp av dump-filen som ble opprettet:

    mysql -u user -p < out.sql

Vanlige problemer

  • Hvis REPAIR TABLE-kommandoen mislykkes på MyISAM-tabeller, kan korrupteringen være alvorlig. Overve kanskje å gjenopprette fra sikkerhetskopi.
  • For InnoDB-tabeller, hvis innodb_force_recovery=1 ikke virker, kan du prøve å øke verdien opp til 6, men høyere verdier kan forhindre skriveoperasjoner.
  • Fjern alltid linjen innodb_force_recovery fra konfigurasjonsfilen etter gjenoppretting for å gjenopprette normal drift.