Mysql ist abgestürzt und startet nicht

18

Unser Produktions-MySQL-Server ist gerade abgestürzt und wird nicht wieder hochgefahren. Es gibt einen Segfault-Fehler. Ich habe einen Neustart versucht und weiß einfach nicht, was ich sonst noch versuchen soll. Hier ist der Stacktrace:

140502 14:13:05 [Hinweis] Das Plugin 'FEDERATED' ist deaktiviert.
InnoDB: Die Protokollprüfung wurde über den Prüfpunkt lsn 108 1057948207 hinaus fortgesetzt
140502 14:13:06 InnoDB: Datenbank wurde nicht normal heruntergefahren!
InnoDB: Wiederherstellung nach Absturz starten.
InnoDB: Tablespace-Informationen aus den .ibd-Dateien lesen ...
InnoDB: Wiederherstellung möglicher halbgeschriebener Datenseiten aus dem Doublewrite
InnoDB: Puffer ...
InnoDB: Wiederherstellung wird ausgeführt: Es wird bis zur Protokollsequenznummer 108 1058059648 gescannt
InnoDB: 1 Transaktion (en), die zurückgesetzt oder bereinigt werden müssen
InnoDB: Insgesamt sind 15 Zeilenoperationen rückgängig zu machen
InnoDB: Trx-ID-Zähler ist 0 562485504
140502 14:13:06 InnoDB: Start eines Stapels von Protokollsätzen auf die Datenbank anwenden ...
InnoDB: Fortschritt in Prozent: 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 71 72 73 74 75 76 77 78 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 
InnoDB: Batch anwenden abgeschlossen
InnoDB: Startet im Hintergrund das Rollback nicht festgeschriebener Transaktionen
140502 14:13:06 InnoDB: Rollback von trx mit der ID 0 562485192, 15 Zeilen zum Rückgängigmachen
140502 14:13:06 InnoDB: Gestartet; Protokollfolgenummer 108 1058059648
140502 14:13:06 InnoDB: Assertionsfehler in Thread 1873206128 in Datei ../../../storage/innobase/fsp/fsp0fsp.c Zeile 1593
InnoDB: Fehlerhafte Assertion: frag_n_used> 0
InnoDB: Wir erzeugen absichtlich eine Speicherfalle.
InnoDB: Senden Sie einen detaillierten Fehlerbericht an http://bugs.mysql.com.
InnoDB: Wenn Sie wiederholt Behauptungsfehler bekommen oder sogar abstürzen
InnoDB: Möglicherweise direkt nach dem Start von mysqld
InnoDB: Beschädigung im InnoDB-Tablespace. Bitte beziehen Sie sich auf
InnoDB: http://dev.mysql.com/doc/refman/5.1/de/forcing-recovery.html
InnoDB: Erzwingen der Wiederherstellung.
140502 14:13:06 - mysqld hat signal 6 erhalten;
Dies könnte daran liegen, dass Sie einen Fehler gefunden haben. Es ist auch möglich, dass diese Binärdatei
oder eine der Bibliotheken, mit denen verlinkt wurde, ist beschädigt, nicht ordnungsgemäß erstellt,
oder falsch konfiguriert. Dieser Fehler kann auch durch fehlerhafte Hardware verursacht werden.
Wir werden unser Bestes geben, um einige Informationen zu sammeln, die hoffentlich bei der Diagnose helfen
das problem, aber da wir schon abgestürzt sind, stimmt definitiv etwas nicht
und dies kann fehlschlagen.

key_buffer_size = 16777216
read_buffer_size = 131072
max_used_connections = 0
max_threads = 151
threads_connected = 0
Es ist möglich, dass mysqld bis zu verwenden könnte 
key_buffer_size + (read_buffer_size + sort_buffer_size) * max_threads = 345919 K
Bytes Speicher
Hoffe das ist ok; Wenn nicht, verringern Sie einige Variablen in der Gleichung.

thd: 0x0
Rückverfolgung wird versucht. Sie können die folgenden Informationen verwenden, um dies herauszufinden
wo mysqld gestorben ist. Wenn Sie danach keine Nachrichten mehr sehen, ist etwas passiert
furchtbar falsch ...
stack_bottom = (nil) thread_stack 0x30000
140502 14:13:06 [Hinweis] Event Scheduler: Es wurden 0 Ereignisse geladen
140502 14:13:06 [Anmerkung] / usr / sbin / mysqld: bereit für Verbindungen.
Version: '5.1.41-3ubuntu12.10' Socket: '/var/run/mysqld/mysqld.sock' Port: 3306 (Ubuntu)
/ usr / sbin / mysqld (my_print_stacktrace + 0x2d) [0xb7579cbd]
/ usr / sbin / mysqld (handle_segfault + 0x494) [0xb7245854]
[0xb6fc0400]
/lib/tls/i686/cmov/libc.so.6 (abort+0x182) [0xb6cc5a82]
/ usr / sbin / mysqld (+ 0x4867e9) [0xb74647e9]
/ usr / sbin / mysqld (btr_page_free_low + 0x122) [0xb74f1622]
/ usr / sbin / mysqld (btr_compress + 0x684) [0xb74f4ca4]
/ usr / sbin / mysqld (btr_cur_compress_if_useful + 0xe7) [0xb74284e7]
/ usr / sbin / mysqld (btr_cur_pessimistic_delete + 0x332) [0xb7429e72]
/ usr / sbin / mysqld (btr_node_ptr_delete + 0x82) [0xb74f4012]
/ usr / sbin / mysqld (btr_discard_page + 0x175) [0xb74f41e5]
/ usr / sbin / mysqld (btr_cur_pessimistic_delete + 0x3e8) [0xb7429f28]
/ usr / sbin / mysqld (+ 0x526197) [0xb7504197]
/ usr / sbin / mysqld (row_undo_ins + 0x1b1) [0xb7504771]
/ usr / sbin / mysqld (row_undo_step + 0x25f) [0xb74c210f]
/ usr / sbin / mysqld (que_run_threads + 0x58a) [0xb74a31da]
/ usr / sbin / mysqld (trx_rollback_or_clean_all_without_sess + 0x3e3) [0xb74ded43]
/lib/tls/i686/cmov/libpthread.so.0(+0x596e) [0xb6f9f96e]
/lib/tls/i686/cmov/libc.so.6(clone+0x5e) [0xb6d65a4e]
Die Handbuchseite unter http://dev.mysql.com/doc/mysql/en/crashing.html enthält
Informationen, mit denen Sie herausfinden können, was den Absturz verursacht.

Irgendwelche Empfehlungen?

tilleryj
quelle
Das wichtigste zuerst; Hat jemand die MySQL-Konfiguration irgendwie geändert? Sehen Sie das letzte Änderungsdatum für /etc/mysql/my.cnfoder so.
Janne Pikkarainen
Es endete damit, dass innodb_force_recovery = 3 gesetzt werden musste, um einen mysqldump auszuführen, und dann die Datenbank gelöscht und neu geladen wurden. Das hat es behoben.
tilleryj

Antworten:

26

Autsch.

InnoDB: immediately after the mysqld startup, there may be
InnoDB: corruption in the InnoDB tablespace. Please refer to
InnoDB: http://dev.mysql.com/doc/refman/5.1/en/forcing-recovery.html
InnoDB: about forcing recovery.

Überprüfen Sie die vorgeschlagene Webseite: http://dev.mysql.com/doc/refman/5.1/en/forcing-recovery.html .

Versuchen Sie grundsätzlich, den MySQL-Server in einem Wiederherstellungsmodus zu starten und eine Sicherungskopie Ihrer abgestürzten Tabellen zu erstellen .

Bearbeiten Sie Ihre /etc/my.cnfund fügen Sie hinzu:

 innodb_force_recovery = 1

... um zu sehen, ob Sie in Ihre Datenbank gelangen und Ihre Daten erhalten / die beschädigte Tabelle finden können.

In der Regel handelt es sich in diesem Fall um eine Neuerstellung (mindestens eine oder zwei beschädigte Tabellen).

Von http://chepri.com/mysql-innodb-corruption-and-recovery/ :

  1. Stop mysqld( service mysql stop).
  2. Backup /var/lib/mysql/ib*
  3. Fügen Sie die folgende Zeile hinzu in /etc/my.cnf:

    innodb_force_recovery = 1
    

    (Sie schlagen 4 vor, aber es ist am besten, mit 1 zu beginnen und zu erhöhen, wenn es nicht startet.)

  4. Starten Sie neu mysqld( service mysql start).

  5. Alle Tabellen sichern: mysqldump -A > dump.sql
  6. Löschen Sie alle Datenbanken, die wiederhergestellt werden müssen.
  7. Stop mysqld( service mysql stop).
  8. Entfernen /var/lib/mysql/ib*
  9. Kommentar aus innodb_force_recoveryin/etc/my.cnf
  10. Neu starten mysqld. Schauen Sie sich das MySQL-Fehlerprotokoll an. Standardmäßig sollte angezeigt werden /var/lib/mysql/server/hostname.com.err, wie neue ib*Dateien erstellt werden.
  11. Wiederherstellen von Datenbanken aus dem Dump: mysql < dump.sql
Jonathan
quelle
Ich würde zunächst annehmen, dass Sie möglicherweise ein beschädigtes Dateisystem oder eine fehlerhafte Festplatte haben.
Bombenauto
1
Probieren Sie alle innodb_force_recovery-Werte bis zu 6 aus. Und fügen Sie innodb_purge_threads = 0 hinzu - manchmal kann der Hauptthread keinen starten. Sie werden es im Fehlerprotokoll sehen
akuzminsky
2
Ich weiß, dass dies ein alter Thread ist, aber wie sieht es mit der Ermittlung der wiederherzustellenden Datenbanken aus?
Nkanderson
@nicolekanderson Ich hätte auch gerne eine Klarstellung zu diesem Punkt. Nachdem ich mysqldump ausgeführt habe, zeigt es mir in keiner Weise an, dass eine der Datenbanken beschädigt war.
Andrew Thaddeus Martin
Punkt 10 in der Antwort - Versuchen Sie, den Datenbankserver neu zu starten und das Fehlerprotokoll zu lesen. Es sollte den Namen der abgestürzten Tabellen enthalten. mysqldump gibt dir nur eine Kopie der Tabellen, nichts anderes.
Jonathan
2

Ich habe denselben Fehler bei der Verwendung von mysql: 5.7 docker image festgestellt. Der Hauptfehler bestand darin, einen Root-Benutzer zu erstellen, der standardmäßig existiert. Weitere Informationen: https://github.com/docker-library/mysql/issues/129

Wie im obigen Link angegeben, bestand die Lösung darin, MYSQL_USER und MYSQL_PASSWORD NICHT in den Umgebungsvariablen festzulegen, während das Docker-Image gestartet wurde.

rahuljain1311
quelle
1

Dies passierte mir in Laravel Homestead (Vagrant nach einer Kernel-Panik unter Mac OS Sierra 10.12.4 (16E195):

$ lsb_release -a
No LSB modules are available.
Distributor ID: Ubuntu
Description:    Ubuntu 14.04.3 LTS
Release:    14.04
Codename:   trusty

$ mysql -V
mysql  Ver 14.14 Distrib 5.7.9, for Linux (x86_64) using  EditLine 
wrapper

Hier sind einige Ressourcen, die Sie ausprobieren können, obwohl keine der Reparaturoptionen für mich funktioniert hat :

https://dev.mysql.com/doc/refman/5.7/de/forcing-innodb-recovery.html

https://forums.mysql.com/read.php?22,603093,604631#msg-604631

https://support.plesk.com/hc/en-us/articles/213939865-How-to-fix-InnoDB-corruption-cases-for-the-MySQL-database

Ich habe versucht, eine erzwungene Wiederherstellung zu mysql config hinzuzufügen (beginne bei 1 und gehe immer höher, da angeblich höhere Zahlen dauerhafte Beschädigung verursachen können):

sudo nano /etc/mysql/my.cnf

[mysqld]
innodb_force_recovery = 1
#innodb-read-only=1
#innodb_purge_threads=0
#key_buffer_size=16M
#event-scheduler=disabled

Führen Sie in einem anderen Fenster Folgendes aus:

tail -f /var/log/mysql/error.log

Versuchen Sie dann, mysqld mit den verschiedenen aktivierten Optionen neu zu starten:

sudo /etc/init.d/mysql restart

Wenn das Zeitlimit überschritten wird, können Sie einen Neustart von MySQL-Prozessen erzwingen.

# process id is first column with number, just ignore lines with grep because they list the process running 'grep mysql'
ps aux | grep mysql
sudo kill -9 <process-id>
sudo /etc/init.d/mysql restart

Wenn es funktioniert, zeigt das Protokoll Folgendes an:

Version: '5.7.9' socket: '/var/run/mysqld/mysqld.sock' port: 3306 MySQL Community Server (GPL)

Wenn dies fehlschlägt, wird im Protokoll Folgendes angezeigt:

InnoDB: Assertion failure in thread 140049488692992 in file log0recv.cc line 1420


Als es immer schlimmer wurde, habe ich versucht, Datenbanken zu entfernen, die wahrscheinlich beschädigt sind:

sudo ls -alt /var/lib/mysql

Es stellte sich heraus, dass die Datenbank, an der ich gearbeitet hatte, die zuletzt geänderte war, die ganz oben auf der Liste steht. Glücklicherweise hatte ich von diesem Tag einen SQL-Speicherauszug dafür und konnte ihn entfernen:

sudo rm -rf /var/lib/mysql/<database_name>

Ich habe alle anderen Dateien verlassen und mysql konnte trotzdem starten.

UPDATE: innodb_force_recovery = 1Stellen Sie sicher, dass Sie es deaktivieren, sobald mysql wieder funktioniert. Andernfalls erhalten Sie Fehler, wenn Sie versuchen, Datenbanken und Tabellen zu ändern.

Dann habe ich die Datenbank mit Sequel Pro neu erstellt, meine Daten erneut importiert und konnte weitermachen, ohne alle Datenbanken aus meinen anderen Projekten entfernen zu müssen.

In Zukunft muss ich davon ausgehen, dass jede MySQL-Datenbank beschädigt werden kann, und versuchen, tägliche Backups zu erstellen und das Skript für die Datenbankwiederherstellung in meinen Tools für die kontinuierliche Integration zu dokumentieren oder zu codieren.

Zack Morris
quelle