Ich habe die Struktur einer großen Tabelle mit kopiert (es ist übrigens eine InnoDB- Tabelle).
CREATE TABLE tempTbl LIKE realTbl
Dann habe ich einen Index geändert und ihn ausgefüllt, damit ich einen Test durchführen kann. Das Befüllen erfolgte mit:
INSERT INTO `tmpTbl`
SELECT *
FROM `realTbl`
Das hat zu lange gedauert, deshalb wollte ich diesen Test beenden. 1
Ich habe den Prozess abgebrochen, während er sich im Status "Daten senden" befand: Er ist jetzt "beendet" und befindet sich immer noch im Status "Daten senden".
Ich weiß, dass einige abgebrochene Prozesse Änderungen rückgängig machen müssen und daher (gleichermaßen?) Lange dauern können, um beendet zu werden, verglichen mit der Dauer, in der sie ausgeführt wurden, aber ich kann mir nicht vorstellen, warum dies jetzt der Fall ist: Die gesamte Tabelle muss geleert werden.
Ich bin gespannt, was passiert, wenn eine einfache Abfrage wie diese sehr lange gestoppt / beendet werden muss. Um Ihnen einige Zahlen zu geben: Der Einsatz lief eine oder drei Stunden, der Kill ist jetzt näher an 5 7. Es sieht fast so aus, als würde es DELETE
für jedes INSERT
Mal ausgeführt, und das Löschen dauert länger als das Einfügen? Wäre das überhaupt logisch?
(Und wenn jemand weiß, wie man meinen Testserver wieder in Form bringt, wäre das auch schön, da er einige Ressourcen verbraucht, aber das ist im Moment nicht wirklich wichtig :))
1) Ich weiß noch nicht warum (es ist eine große Tabelle, 10 Millionen Zeilen, aber es sollte so lange dauern?), Aber das ist eine andere Sache / nicht Teil dieser Frage :). Es könnte sein, dass mein Test klüger oder schneller hätte sein können, aber das ist jetzt auch nicht die Frage: D.
Antworten:
Der Grund, warum der Kill so lange dauert, ist höchstwahrscheinlich auf die durch die innodb-Transaktion ausgegebenen Rollbacks zurückzuführen. Von InnoDB-Leistungstipps :
Bearbeiten: Die Innodb Force Recovery- Methoden könnten für Sie von Nutzen sein (ich bin froh, dass Sie dies in einer Testumgebung getan haben).
Fügen Sie beim nächsten Mal jedes Mal eine kleine Teilmenge der Daten ein. Das Einfügen von 10 Millionen Zeilen sollte nicht so lange dauern, aber es kann mehrere Gründe dafür geben. Ohne Ihre Umgebung zu kennen, kann ich Ihnen keine Ratschläge geben.
quelle
innodb_buffer_pool_size
ist zu niedrig. Weitere Optionen finden Sie im Abschnitt "Datenträger-E / A" des Leistungstipps.kill -9
, um damit fertig zu werden.Ich kann darin eine unordentliche Operation sehen. Das tmpTbl ist InnoDB. Das Laden neuer Daten führt zu MVCC- Aktivitäten. Dadurch werden Änderungen in den Redo-Protokollen gestapelt (in ib_logfile0 und ib_logfile1 enthalten, möglicherweise auch in ibdata1).
Sobald Sie INSERT beendet haben, müssen alle Änderungen (für jede Zeile ein neuer Datensatz anstelle eines Datensatzes) an der InnoDB-Tabelle zurückgesetzt werden.
Sie könnten mysqld wahrscheinlich töten und mysqld erneut starten, um während der Crash-Wiederherstellungsphase des MySQL-Starts auf etwas davon zu stoßen.
quelle