Heim  >  Artikel  >  Datenbank  >  Detaillierte Erläuterung der Beschädigung der MySQL-Tabellendatendatei, die dazu führt, dass die Datenbank nicht gestartet werden kann

Detaillierte Erläuterung der Beschädigung der MySQL-Tabellendatendatei, die dazu führt, dass die Datenbank nicht gestartet werden kann

黄舟
黄舟Original
2017-10-01 07:43:244603Durchsuche

1. Problemprotokoll

2017-08-31 14:18:05 4122 [Note] InnoDB: Database was not shutdown normally!
2017-08-31 14:18:05 4122 [Note] InnoDB: Starting crash recovery.
2017-08-31 14:18:05 4122 [Note] InnoDB: Reading tablespace information from the .ibd files...
2017-08-31 14:18:05 4122 [ERROR] InnoDB: Attempted to open a previously opened tablespace. Previous tablespace dev/tb_test uses spac
e ID: 1 at filepath: ./dev/tb_test.ibd. Cannot open tablespace mysql/innodb_table_stats which uses space ID: 1 at filepath: ./mysql/
innodb_table_stats.ibd
2017-08-31 14:18:05 2ad861898590  InnoDB: Operating system error number 2 in a file operation.
InnoDB: The error means the system cannot find the path specified.
InnoDB: If you are installing InnoDB, remember that you must create
InnoDB: directories yourself, InnoDB does not create them.
InnoDB: Error: could not open single-table tablespace file ./mysql/innodb_table_stats.ibd
InnoDB: We do not continue the crash recovery, because the table may becomeInnoDB: corrupt if we cannot apply the log records in the InnoDB log to it.
InnoDB: To fix the problem and start mysqld:
InnoDB: 1) If there is a permission problem in the file and mysqld cannot
InnoDB: open the file, you should modify the permissions.
InnoDB: 2) If the table is not needed, or you can restore it from a backup,
InnoDB: then you can remove the .ibd file, and InnoDB will do a normal
InnoDB: crash recovery and ignore that table.
InnoDB: 3) If the file system or the disk is broken, and you cannot remove
InnoDB: the .ibd file, you can set innodb_force_recovery > 0 in my.cnf
InnoDB: and force InnoDB to continue crash recovery here.
150126 14:18:06 mysqld_safe mysqld from pid file /home/mysql/mysql_app/dbdata/liuyazhuang136.pid ended

2. Lösung

1. Fügen Sie die folgenden Parameter zu my.cnf hinzu

Zur Gruppe [mysqld] hinzufügen:

innodb_force_recovery=6

Erklärung des Parameters Innodb_force_recovery:
innodb_force_recovery beeinflusst den Wiederherstellungsstatus der gesamten InnoDB-Speicher-Engine. Der Standardwert ist 0, was bedeutet, dass alle Wiederherstellungsvorgänge durchgeführt werden, wenn eine Wiederherstellung erforderlich ist.
Wenn effektive Wiederherstellungsvorgänge nicht durchgeführt werden können, kann es sein, dass MySQL nicht startet und ein Fehlerprotokoll aufgezeichnet wird.
innodb_force_recovery kann auf 1-6 eingestellt werden, die größere Zahl beinhaltet die Auswirkungen aller vorherigen Zahlen.
Wenn der Einstellungsparameterwert größer als 0 ist, können Sie Auswahl-, Erstellungs- und Löschvorgänge für die Tabelle ausführen, Vorgänge wie Einfügen, Aktualisieren oder Löschen sind jedoch nicht zulässig.
1(SRV_FORCE_IGNORE_CORRUPT): Ignorieren Sie die erkannte beschädigte Seite
2(SRV_FORCE_NO_BACKGROUND): Verhindern Sie die Ausführung des Hauptthreads. Wenn der Hauptthread einen vollständigen Löschvorgang durchführen muss, führt dies zu einem Absturz
3( SRV_FORCE_NO_TRX_UNDO): Transaktions-Rollback-Vorgang nicht ausführen.
4(SRV_FORCE_NO_IBUF_MERGE): Führen Sie den Zusammenführungsvorgang des Einfügepuffers nicht durch.
5(SRV_FORCE_NO_UNDO_LOG_SCAN): Ohne Überprüfung des Redo-Logs behandelt die InnoDB-Speicher-Engine nicht festgeschriebene Transaktionen als festgeschrieben.
6(SRV_FORCE_NO_LOG_REDO): Führen Sie keinen Rollforward-Vorgang durch.

2. Sichern Sie die Datenbank

$mysqldump -h 192.168.209.136 -uroot -p dev > /home/mysql/dev.sql

3. Löschen Sie die Datenbank

$mysql -h 192.168.209.136 -uroot -p
mysql> drop database dev;
ERROR 1051 (42S02): Unknown table 'dev.tb_test'

Löschen Sie die frm- und ibd-Dateien, die tb_test entsprechen

mysql> drop database dev;
Query OK, 0 rows affected (0.00 sec)

4. Erstellen Sie die Datenbank

mysql> create database dev;
Query OK, 1 row affected (0.03 sec)

5. Entfernen Sie den Parameter innodb_force_recovery
Nachdem Sie die zuvor festgelegten Parameter entfernt haben, starten Sie die Datenbank neu

##innodb_force_recovery=6

6. Importieren Sie die Eingabeaufforderungstabelle

[mysql@liuyazhuang136 dev]$ mysql -h 192.168.209.136 -uroot -pmysql dev</home/mysql/dev.sql
Warning: Using a password on the command line interface can be insecure.
ERROR 1050 (42S01) at line 25: Table &#39;`dev`.`tb_test`&#39; already exists

. Dies liegt daran, dass die Datenbank nach dem Entfernen des Parameters innodb_force_recovery einen Rollback-Vorgang durchführt und die entsprechende ibd-Datei generiert muss gelöscht werden
Löschen und dann erneut importieren

[mysql@liuyazhuang136 dev]$ mysql -h 192.168.209.136 -uroot -pmysql dev</home/mysql/dev.sql

Das obige ist der detaillierte Inhalt vonDetaillierte Erläuterung der Beschädigung der MySQL-Tabellendatendatei, die dazu führt, dass die Datenbank nicht gestartet werden kann. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn