it-swarm-eu.dev

Der MySQL-Server hat den Import großer Dumps behindert

Ich versuche, einen großen SQL-Speicherauszug (2 GB) in mein lokales MySQL auf meinem Mac zu importieren. Ich war in der Vergangenheit in der Lage, dies zu tun (ich habe MAMP verwendet), aber jetzt erhalte ich einen FEHLER 2006 (HY000) in Zeile 7758: Der MySQL-Server ist jedes Mal verschwunden, wenn ich versuche, den Speicherauszug zu importieren. Die Datenbank enthält innodb-Tabellen.

Ich habe versucht, die Datei my-innodb-heavy-4G.cnf in meine Datei my.cnf zu kopieren, um zu sehen, ob diese Einstellungen helfen würden, aber kein Glück.

Irgendwelche Ideen, was zu optimieren ist?

Ich verwende von hier aus "Mac OS X Version 10.6 (x86, 64-Bit), DMG-Archiv": http://dev.mysql.com/downloads/mysql/

14
naxoc

Einer der stillen Killer von MySQL Connections ist das MySQL-Paket. Sogar der E/A-Thread der MySQL-Replikation kann dadurch zum Opfer fallen.

Gemäß der MySQL-Dokumentation

  • Sie können diese Fehler auch erhalten, wenn Sie eine falsche oder zu große Abfrage an den Server senden. Wenn mysqld ein Paket empfängt, das zu groß oder nicht in Ordnung ist, wird davon ausgegangen, dass mit dem Client ein Fehler aufgetreten ist, und die Verbindung wird geschlossen. Wenn Sie große Abfragen benötigen (z. B. wenn Sie mit großen BLOB-Spalten arbeiten), können Sie das Abfragelimit erhöhen, indem Sie die Variable max_allowed_packet des Servers festlegen, die einen Standardwert von 1 MB hat. Möglicherweise müssen Sie auch die maximale Paketgröße auf der Client-Seite erhöhen. Weitere Informationen zum Einstellen der Paketgröße finden Sie in Abschnitt C.5.2.10, „Paket zu groß“.

  • Eine INSERT- oder REPLACE-Anweisung, die sehr viele Zeilen einfügt, kann ebenfalls diese Art von Fehlern verursachen. Jede dieser Anweisungen sendet eine einzelne Anforderung an den Server, unabhängig von der Anzahl der einzufügenden Zeilen. Daher können Sie den Fehler häufig vermeiden, indem Sie die Anzahl der pro INSERT oder REPLACE gesendeten Zeilen verringern.

Zumindest müssen Sie sicherstellen, dass die Paketgrößen sowohl für den Computer, von dem Sie mysqldump'd haben, als auch für den Computer, den Sie laden, identisch sind.

Es gibt zwei (2) Ansätze, die Sie verfolgen können:

ANSATZ 1: Führen Sie den mysqldump mit --skip-extended-insert aus.

Dadurch wird sichergestellt, dass das MySQL-Paket nicht mit mehreren BLOBs und TEXT-Feldern überschwemmt wird. Auf diese Weise werden SQL INSERTs einzeln ausgeführt. Die Hauptnachteile sind

  1. der Mysqldump ist viel größer
  2. das Nachladen eines solchen Dumps dauert viel länger.

ANSATZ 2: Erhöhen max_allowed_packet

Dies kann der bevorzugte Ansatz sein, da die Implementierung nur einen MySQL-Neustart entfernt ist. Das Verständnis des MySQL-Pakets kann dies verdeutlichen.

Gemäß dem Seite 99 von "Grundlegendes zu MySQL-Interna" (ISBN 0-596-00957-7) werden in den Absätzen 1-3 Folgendes erläutert:

Der MySQL-Netzwerkkommunikationscode wurde unter der Annahme geschrieben, dass Abfragen immer relativ kurz sind und daher in einem Block an den Server gesendet und von diesem verarbeitet werden können, der in der MySQL-Terminologie als Paket bezeichnet wird. Der Server reserviert den Speicher für einen temporären Puffer zum Speichern des Pakets und fordert genug an, um es vollständig anzupassen. Diese Architektur erfordert eine Vorsichtsmaßnahme, um zu vermeiden, dass dem Server der Speicher ausgeht - eine Begrenzung der Paketgröße, die mit dieser Option erreicht wird.

Der Code von Interesse in Bezug auf diese Option befindet sich in sql/net_serv.cc . Schauen Sie sich my_net_read () an und folgen Sie dem Aufruf von my_real_read () und achten Sie besonders auf net_realloc () .

Diese Variable begrenzt auch die Länge eines Ergebnisses vieler Zeichenfolgenfunktionen. Siehe sql/field.cc und sql/intem_strfunc.cc für Details .

Angesichts dieser Erklärung wird durch das Erstellen von Massen-INSERTs ein MySQL-Paket ziemlich schnell geladen/entladen. Dies gilt insbesondere dann, wenn max_allowed_packet für die angegebene Datenlast zu klein ist.

[~ # ~] Schlussfolgerung [~ # ~]

In den meisten Installationen von MySQL setze ich dies normalerweise auf 256M oder 512M. Sie sollten mit größeren Werten experimentieren, wenn beim Laden von Daten Fehler auftreten, bei denen "MySQL verschwunden ist".

15
RolandoMySQLDBA

Diejenigen, die mit den anderen Vorschlägen keinen Erfolg hatten, könnten einen Blick auf den BigDump werfen PHP gestaffelter MySQL-Dump Importer-Skript .

Dies ist eine Problemumgehung für den Import großer Datenbank-Dumps in MySQL. Ich habe es erfolgreich verwendet, um einen großen MySQL-Dump in meine lokale Entwicklungsumgebung zu importieren (in diesem Fall verwende ich MAMP).

2
Marcus Barnes

Wie lange dauert dies, bis eine Zeitüberschreitung auftritt? Der erste Schritt wäre, das wait_timeout und interactive_timeout Einstellungen, um sicherzustellen, dass sie groß genug für Ihren Import sind:

SHOW VARIABLES LIKE '%_timeout';
SET SESSION wait_timeout=28800;

Der Standardwert ist 8 Stunden (28800), daher ist dies möglicherweise nicht das Problem. Weitere Hinweise zu diesem Problem finden Sie hier . Eines, das auffällt, ist Folgendes:

Eine Clientanwendung, die auf einem anderen Host ausgeführt wird, verfügt nicht über die erforderlichen Berechtigungen, um von diesem Host aus eine Verbindung zum MySQL-Server herzustellen.

Überprüfen Sie zuerst die Berechtigungen, gehen Sie dann aber diese Liste potenzieller Probleme durch.

2
Derek Downey

Es ist vielleicht nicht die "richtige" Sache, aber es könnte funktionieren (fertig, oder?):

Versuchen Sie, Ihren großen Speicherauszug in mehrere Dateien aufzuteilen und diese nacheinander auszuführen. Mein Ansatz wäre es, es in zwei Hälften zu teilen und zu testen. Brechen Sie dann jede Hälfte in zwei Hälften, wiederholen Sie den Test und so weiter.

Ich bin etwas neugierig, ob die Menge an RAM, die Sie auf Ihrer Box haben, etwas damit zu tun haben könnte. Lädt MySQL den gesamten Speicherauszug in den Speicher, wenn er ausgeführt wird? I. Ich weiß es nicht ... aber wenn Sie nur 2 GB RAM und einige davon werden verwendet, um Ihr Betriebssystem und andere Apps auszuführen), dann ist dies möglicherweise das Problem.

2

Ja, normalerweise kann ich mit wait_timeout und max_allowed_packets auch die Fehlermeldung umgehen.

2
p4guru