MySQL-taulut voivat muuttua korruptoituneiksi, joita johtaa lukemattomaksi tietoksi ja mahdollisiin palvelimen kaasuksiin. Tämä opas ohjaa sinua korruptoiden taulujen diagnosoointiin ja korjaamiseen sekä MyISAM- että InnoDB-tallennustekniikoilla käyttämällä sisäänrakennettuja MySQL-työkaluja ja palautusmenetelmiä.

Tausta

Korruptoinnin yleisiä syitä ovat:

  • MySQL-palvelimen keskeytys kirjoitusoperaation aikana
  • Samaan tauluun samanaikaista muokkausta ulkoisesta ohjelmasta ja palvelimelta
  • Tietokoneen odottamaton sammuminen
  • Laitevian kaltaiset ongelmat tietokoneessa
  • MySQL-koodin sisäiset virheet

Ennen ongelmien ratkaisemisen tai korjauksen yrittämistä on välttämätöntä luoda varmuuskopio tietokansiostasi, jotta vähennetään datamenetyksen riski.

Korruptoiden taulujen korjaaminen

  1. Vaihe 1: Pysäytä MySQL ja luo varmuuskopio

    Pysäytä MySQL-palvelu:

    sudo systemctl stop mysql

    Huomautus: Jotkut alustat kuten Rocky Linux voivat nimetä MySQL-palvelun mysqld-ksi.

    Kopioi kaikki tiedostosi uuteen varmuuskopiokansioon. Ubuntujärjestelmillä oletusarvoisen tietokansion sijainti on yleensä /var/lib/mysql/:

    cp -r /var/lib/mysql /var/lib/mysql_bkp
  2. Vaihe 2: Tarkista, onko taulu korruptoitu (MyISAM)

    Jos taulu käyttää MyISAM-tallennustekniikkaa, voit selvittää sen tilan suorittamalla CHECK TABLE-komentoa MySQL-promptista:

    mysql> CHECK TABLE table_name;

    Tulosteen tulisi sisältää viestin, joka kertoo, onko taulu korruptoitu.

  3. Vaihe 3: Korjaa MyISAM-taulut

    Jos taulu on vahvasti korruptoitu, yritä sen korjaamista:

    mysql> REPAIR TABLE table_name;

    Kun korjaus onnistuu, tulosteen tulisi sisältää viestin, joka vahvistaa korjauksen lopettamisen. Esimerkiksi:

    +--------------------------+--------+----------+----------+
    | Table                    | Op     | Msg_type | Msg_text |
    +--------------------------+--------+----------+----------+
    | database_name.table_name | repair | status   | OK       |
    +--------------------------+--------+----------+----------+
  4. Vaihe 4: Käsittele InnoDB-taulut kaasuavustuksen avulla

    Jos korruptoitu taulu käyttää InnoDB-tallennustekniikkaa (oletus MySQL 8.0 ja myöhemmillä versioilla), korjausmenetelmä eroaa. InnoDB sisältää automatisoidun korruptoinnin tarkistukset ja korjaukset, tunnistamalla korruptoituneet sivut suorittamalla checksummit kunkin luetun sivun käsittelyssä.

    Yritä käynnistää MySQL-palvelu uudelleen tarkistaaksesi, palautuuko pääsy palvelimeen:

    sudo systemctl restart mysql

    InnoDB:n sisäänrakennettu kaasuavustusmekanismi ratkaisee useimmat ongelmat palvelun uudelleenkäynnistyksen yhteydessä.

  5. Vaihe 5: Ota käyttöön InnoDB:n force_recovery (jos tarvitaan)

    Jos palvelin jatkaa kaasua tai on pääsykelpoton, ota käyttöön InnoDB:n force_recovery-asetus. Muokkaa mysqld.cnf-tiedostoa, joka sijaitsee yleensä /etc/mysql-hakemistossa Ubuntussa ja Debianissa tai /etc/my.cnf.d-hakemistossa Red Hatissa ja Rocky:ssä:

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

    [mysqld]-osiossa lisää seuraava rivi:

    [mysqld]
    innodb_force_recovery=1

    Tallenna ja sulje tiedosto, sitten yritä käynnistää MySQL-palvelu uudelleen.

  6. Vaihe 6: Poimi ja lataa InnoDB-taulu uudelleen

    Jos pääsy korruptoituun tauluun onnistuu, käytä mysqldump-työkalua viedäksesi taulun tiedot uuteen tiedostoon:

    mysqldump database_name table_name > out.sql

    Poista taulu tietokannasta:

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

    Lataa taulu takaisin luodun varmuuskopiotiedoston avulla:

    mysql -u user -p < out.sql

Yleisiä ongelmia

  • Jos REPAIR TABLE-komento epäonnistuu MyISAM-tauluilla, korruptio voi olla vakava. Harkitse palautusta varmuuskopiosta.
  • InnoDB-tauluille, jos innodb_force_recovery=1 ei toimi, voit kokeilla arvon kasvattamista ennen 7:een, mutta korkeampi arvo voi estää kirjoitusoperaatiot.
  • Poista aina innodb_force_recovery-rivi määritystiedostostasi palautuksen jälkeen normaaliin toimintaan saakka.