[Anleitung] Reparieren von InnoDB-Beschädigungen für die MySQL-Datenbank

Created:

2016-11-16 13:08:52 UTC

Modified:

2017-08-18 18:00:03 UTC

33

Was this article helpful?


Have more questions?

Anfrage einreichen

[Anleitung] Reparieren von InnoDB-Beschädigungen für die MySQL-Datenbank

Applicable to:

  • Plesk
  • Odin Business Automation Standard
  • Plesk Automation

Kennzeichen

  1. Es wird folgende Fehlermeldung in Parallels Plesk Panel angezeigt:

    ERROR: PleskMainDBException
    MySQL query failed: Incorrect information in file: './psa/misc.frm'
    
  2. mysqldump und mysqlcheck schlagen fehl und es wird eine Fehlermeldung angezeigt, dass eine Tabelle nicht existiert (Sie sollten zur Überprüfung den MySQL-Administrator-Account nutzen):

    ~# mysqlcheck -uadmin -p****** db_example
    db_example.BackupTasks
    error    : Can't find file: 'BackupTasks.MYD' (errno: 2)
    
  3. Eine Tabelle kann mit der Anweisung " SELECT " nicht korrekt abgefragt werden:

    mysql> select * from db_example.misc;
    ERROR 1033 (HY000): Incorrect information in file: './db_example/misc.frm'
    
  4. Die Tabelle kann nicht repariert werden, weil die InnoDB-Engine keine Reparatur unterstützt.

    mysql> repair table misc;
    +-------------------------+--------+----------+---------------------------------------------------------+
    | Table                   | Op     | Msg_type | Msg_text                                                |
    +-------------------------+--------+----------+---------------------------------------------------------+
    | psa.APSApplicationItems | repair | note     | The storage engine for the table doesn't support repair |
    +-------------------------+--------+----------+---------------------------------------------------------+
    

Ursache

Viele InnoDB-Beschädigungen sind Hardware-bezogen. Fehlerhafte Seitenschreibvorgänge werden von Stromausfällen oder ungültigem Arbeitsspeicher verursacht. Das Problem kann aber auch hervorgerufen werden, wenn ein Network Attached Storage (NAS) verwendet und ihm InnoDB-Datenbanken zugewiesen werden.

Lösung

Es gibt mehrere Möglichkeiten, ein fehlgeschlagenes MySQL wiederherzustellen:

I. Forcieren einer InnoDB-Wiederherstellung

  1. Stoppen Sie mysqld und führen Sie ein Backup aller Dateien im Verzeichnis /var/lib/mysql/ durch:

    ~# /etc/init.d/mysqld stop
    ~# mkdir /root/mysql_backup
    ~# cp -r /var/lib/mysql/* /root/mysql_backup/
    
  2. Fügen Sie die Option innodb_force_recovery im Abschnitt [mysqld] in /etc/my.cnf hinzu. Diese Option ermöglicht Ihnen, mysqld zu starten und ein Datenbankabbild (Dump) zu erstellen.

    ~#/etc/my.cnf
    [mysqld]
    innodb_force_recovery = 4
    

    HINWEIS: Sie können den Wert der Option auf 5 oder 6 erhöhen, bis Sie ein brauchbares Abbild erhalten. Einzelheiten dazu finden Sie hier .

  3. Starten Sie den Dienst mysqld :

    ~# /etc/init.d/mysqld start
    
  4. Erstellen Sie ein Abbild aller Datenbanken:

    ~# mysqldump -uadmin -p`cat /etc/psa/.psa.shadow` -A > /root/dumpall.sql
    

    Falls das Abbild mit folgender Fehlermeldung fehlgeschlagen ist:

    Incorrect information in file: './psa/APSApplicationItems.frm' when using LOCK TABLES"`
    

    erhöhen Sie innodb_force_recovery und versuchen Sie erneut, die Datenbanken abzubilden. Sollte es Ihnen nicht möglich sein, ein Abbild der Datenbanken zu sichern, versuchen Sie es mit Methode II (Tabelleninhalt kopieren) oder III (von Backup wiederherstellen).

  5. Beenden Sie mysqld und entfernen Sie die beschädigten Daten:

    ~# /etc/init.d/mysqld stop
    ~# rm -rf /var/lib/mysql/*
    
  6. Entfernen Sie die Option innodb_force_recovery aus der Datei /etc/my.cnf und starten Sie mysqld :

    ~# /etc/init.d/mysqld start
    

    Hierdurch werden eine Hauptdatenbank "mysql" und eine InnoDB-Engine-Datenbank neu erstellt.

  7. Stellen Sie die Datenbanken aus dem Abbild wieder her:

    ~# mysql -uadmin -p`cat /etc/psa/.psa.shadow` < dumpall.sql
    

II. Kopieren des Tabelleninhalts

  1. Stoppen Sie mysqld und führen Sie ein Backup aller Dateien im Verzeichnis /var/lib/mysql/ durch:

    ~# /etc/init.d/mysqld stop
    ~# mkdir /root/mysql_backup
    ~# cp -r /var/lib/mysql/* /root/mysql_backup/
    
  2. Fügen Sie die Option innodb_force_recovery im Abschnitt [mysqld] in /etc/my.cnf hinzu. Diese Option ermöglicht Ihnen, mysqld zu starten und ein Datenbankabbild (Dump) zu erstellen.

    ~#/etc/my.cnf
    [mysqld]
    innodb_force_recovery = 1
    
  3. Versuchen Sie, eine Kopie zu erstellen:

    CREATE TABLE <neue_Tabelle> LIKE <beschädigte_Tabelle>;
    INSERT INTO <neue_Tabelle> SELECT * FROM <beschädigte_Tabelle>;
    
  4. Wurde sie erfolgreich erstellt, verwerfen Sie die beschädigte Tabelle und benennen die neue Tabelle um, sodass sie den Namen der alten hat.

    DROP TABLE <beschädigte_Tabelle>;
    RENAME TABLE <neue_Tabelle> TO <beschädigte_Tabelle>;
    

III. Wiederherstellen von Backup

Sollten die oben genannten Vorschläge nicht helfen, gibt es nur noch die Möglichkeit, die Datenbanken anhand von Backups wiederherzustellen.

Ein tägliches Backup der Parallels Plesk Panel Datenbank wird im Backupverzeichnis DUMP_D gespeichert:

~# ls -l /var/lib/psa/dumps
-rw------- 1 root   root   141960 Aug  8 01:03 mysql.daily.dump.0.gz
-rw------- 1 root   root   141925 Aug  7 01:03 mysql.daily.dump.1.gz

Verwenden Sie den nachfolgenden Befehl, um die Datenbank aus dem letzten Backup mysql.daily.dump.0.gz wiederherzustellen:

~# zcat /var/lib/psa/dumps/mysql.daily.dump.0.gz | mysql -uadmin -p`cat /etc/psa/.psa.shadow` psa

HINWEIS: Beim Wiederherstellen der Datenbanken können Zeitüberschreitungen auftreten. Fügen Sie die Option wait_timeout in die Datei /etc/my.cnf ein und starten Sie den Dienst mysgld neu:

/etc/my.cnf
[mysqld]
wait_timeout = 1800
~# /etc/init.d/mysqld restart
Haben Sie Fragen? Anfrage einreichen
Bitte melden Sie sich an, um einen Kommentar zu hinterlassen.