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?
/etc/mysql/my.cnf
oder so.Antworten:
Autsch.
Ü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.cnf
und fügen Sie hinzu:... 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/ :
mysqld
(service mysql stop
)./var/lib/mysql/ib*
Fügen Sie die folgende Zeile hinzu in
/etc/my.cnf
:(Sie schlagen 4 vor, aber es ist am besten, mit 1 zu beginnen und zu erhöhen, wenn es nicht startet.)
Starten Sie neu
mysqld
(service mysql start
).mysqldump -A > dump.sql
mysqld
(service mysql stop
)./var/lib/mysql/ib*
innodb_force_recovery
in/etc/my.cnf
mysqld
. Schauen Sie sich das MySQL-Fehlerprotokoll an. Standardmäßig sollte angezeigt werden/var/lib/mysql/server/hostname.com.err
, wie neueib*
Dateien erstellt werden.mysql < dump.sql
quelle
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.
quelle
Dies passierte mir in Laravel Homestead (Vagrant nach einer Kernel-Panik unter Mac OS Sierra 10.12.4 (16E195):
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
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.
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 = 1
Stellen 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.
quelle