Warum dauert der Import einer 12-GB-SQL-Datei länger als 36 Stunden?


16

Ich habe jetzt 36 Stunden darauf gewartet, dass eine 12 GB große .sql-Datei mit einem einfachen type site.sql | mysqlBefehl importiert wird . Ich kann sehen, das ibdata1wächst noch, derzeit fast 40 GB.

In Anbetracht der Auslöser und gespeicherten Prozeduren am Ende der .sql-Datei sollte MySQL meiner Meinung nach nur Daten und Schlüsselindizes hinzufügen.

Die site.sql wurde mit diesem Befehl von einem anderen Server generiert:

mysqldump -R -e --databases site --add-drop-database --add-create-database --add-drop-table -C --single-transaction --triggers

Was dauert es so lange?


3
Wie viel CPU nimmt MySQL? Wenn es ein niedriger Wert ist, bedeutet dies wahrscheinlich, dass Sie festplattengebunden sind
Derek Downey

2
Die .sql-Dateien sind wirklich nicht so schnell zu importieren ... es ist tatsächlich schneller, sie auf tab delim oder CSV abzulegen, dann die leere Datenbank zu erstellen und zu verwenden LOAD DATA INFILE. Wenn Sie eine ganze Datenbank verschieben, lesen Sie auch meine Antwort zum Verschieben von Datenbanken zwischen Servern, wenn Sie dieselbe Hauptversion verwenden. (vor allem, wenn Sie abbrechen und neu starten müssen)
Joe

Antworten:


23

Versuche dies:

$ ps -ef|grep [m]ysql

Identifizieren Sie dann die Prozess-ID

$ strace -cp <pid>

Lassen Sie es dann 10 Sekunden oder eine Minute ^C. Hier erfahren Sie, wo der Prozess seine Zeit verbringt, z. B. könnte er nur auf die Festplatte warten, wenn Sie sie sehen readund writebeherrschen.


4
+1, weil ich gerade einen neuen Befehl gelernt habe (strace): P Edit: Gut Mist, standardmäßig nicht auf meinem Mac verfügbar.
Derek Downey

2
Es ist ein fantastisches Tool, zusammen mit GDB. Ich sage den Leuten nicht, dass ihre App nicht mehr reagiert hat. Ich sage ihnen genau, woran es hängt oder woran es sich dreht, oder sage ihnen von einem Kern aus die Codezeile und den Namen der Quelldatei. Noch mächtiger ist dtrace.
Gaius

3
Strace ist Linux - das Solaris-Äquivalent ist Truss. Dtrace ist auf dem Mac verfügbar.
Gaius

so ist es. werde jetzt nachlesen.
Derek Downey

Achtung: Netter Befehl, aber Vorsicht, dieser Befehl hat meine MySQL-Instanz zum Absturz gebracht. Ich weiß nicht warum. Vor dem Absturz von MySQL reagierte der Server einige Minuten lang nicht mehr.
dabest1

7

Haben Sie InnoDB-Tabellen mit einem Primärschlüssel?

  1. mehrere Spalten enthalten?
  2. ein breites VARCHAR haben?
  3. und viele nicht eindeutige Indizes?
  4. Ein oder mehrere nicht eindeutige Indizes mit einem breiten Schlüssel?

Jede dieser Bedingungen kann wahrscheinlich dazu führen, dass große BTREE-Knoten in Ihren Indizes nur sehr wenige Blätter in jedem BTREE-Knoten haben. Der Clusterschlüssel im Primärschlüssel wird auch an jeden nicht eindeutigen Schlüsseleintrag in nicht gruppierten Schlüsseln angehängt.

Eine weitere Überlegung: Ist die Summe der InnoDB-Datenseiten wesentlich geringer als die der InnoDB-Indexseiten?

Das können Sie mit dieser Abfrage herausfinden (in MB):

SELECT SUM(data_length)/POWER(1024,2) InnoDBData,
SUM(index_length)/POWER(1024,2) InnoDBIndexes
FROM information_schema.tables WHERE engine='InnoDB';

Weitere Überlegung: Haben Sie die Binärprotokollierung auf dem zu ladenden DB-Server aktiviert? Wenn ja, machen Sie dies bitte auf dem Server, den Sie laden:

mysql -h... -u... -p... -A -e"SET sql_log_bin=0; source site.sql"

Ich hoffe das hilft !!!


6

Sind Sie sicher, dass die Tabellen, in die Sie einlesen, keine Trigger, Indizes und Einschränkungen enthalten? Auf welcher Hardware und auf welchem ​​Betriebssystem laufen Sie? Wie ist Ihr Speicher konfiguriert?

Ich bin eher mit Oracle vertraut, aber 12G-Importe auf Tabellen ohne Trigger, Indizes und Einschränkungen sollten mit 200 GB / h problemlos möglich sein. Ein einziger Auslöser kann den Prozess zu einer Schnecke machen, je nachdem, was dieser Auslöser tut ...

ich hoffe das hilft

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.