2013-10-20 7 views
52

Ich versuche, eine SQL-Datei von ca. 300 MB auf MySql über die Befehlszeile in Ubuntu zu importieren. Ich benutzteImportieren von großen SQL-Datei in MySql über die Befehlszeile

source /var/www/myfile.sql; 

Gerade jetzt ist es eine scheinbar unendliche Reihen der Anzeige:

Query OK, 1 row affected (0.03 sec) 

aber es ist schon eine Weile, jetzt läuft. Ich habe noch keine so große Datei importiert, daher möchte ich nur wissen, ob das normal ist, ob der Prozess anhält oder Fehler aufweist. Wird dies in der Befehlszeile angezeigt oder läuft dieser Prozess auf unbestimmte Zeit?

Dank

+0

wird jede Abfrage im Skript ausgeführt, bis der Client abstürzt oder mysql stirbt oder keine weiteren Abfragen zur Verarbeitung mehr vorhanden sind. –

+0

Wenn der Client abstürzt oder mysql stirbt, sehe ich das in der Kommandozeile mit einer Fehlermeldung oder läuft es einfach unendlich weiter und "erscheint" so, als ob es läuft. Ich möchte nur wissen, dass, wenn der Import für Stunden und Stunden schleppt ich nicht meine Zeit verschwenden, den Prozess – user2028856

+0

nicht neu starten, wenn der Client abstürzt, Sie werden nur wieder an der Shell-Eingabeaufforderung sein. –

Antwort

99

Sie SQL-Datei mit der Standardeingabe wie folgt importieren:

mysql -u <user> -p<password> <dbname> < file.sql

Hinweis: Es sollte nicht Raum zwischen <-p> und <password>

Referenz: http://dev.mysql.com/doc/refman/5.0/en/mysql-batch-commands.html

Hinweis zu den vorgeschlagenen Änderungen: Diese Antwort wurde durch vorgeschlagene Änderungen zur Verwendung von Inline-Passwortparametern leicht geändert. Ich kann es für Skripte empfehlen, aber Sie sollten wissen, dass, wenn Sie das Passwort direkt in den Parameter (-p<password>) schreiben, es von einem Shell-Verlauf abgefangen werden kann, der Ihr Passwort jedem enthüllt, der die History-Datei lesen kann. Wohingegen -p Sie bittet, Passwort durch Standardeingabe einzugeben.

+0

Oh ich sehe, aber ist die Methode, die ich auch in Ordnung verwendet oder ist das falsch – user2028856

+0

Für Ihre Methode finden Sie hier Referenz: http://dev.mysql.com/doc/refman/5.0/en/mysql-batch-commands. html –

+0

Okay, ich sehe. Wie lange dauert es nach Ihrer Erfahrung, über CLI eine sql-Datei von 300 MB zu importieren? – user2028856

8

+1 zu @MartinNuc, können Sie den mysql Client im Batch-Modus ausführen und dann werden Sie nicht den langen Strom von "OK" -Linien zu sehen.

Die Zeit, die zum Importieren einer bestimmten SQL-Datei benötigt wird, hängt von vielen Faktoren ab. Nicht nur die Größe der Datei, sondern auch die Art der Anweisungen, wie leistungsstark Ihr Server-Server ist und wie viele andere Dinge gleichzeitig ausgeführt werden.

@MartinNuc sagt er kann 4GB SQL in 4-5 Minuten laden, aber ich habe 0,5 GB SQL-Dateien ausgeführt und hatte 45 Minuten auf einem kleineren Server.

Wir können nicht wirklich raten, wie lange es dauert, Ihr SQL-Skript auf Ihrem Server auszuführen.


Re Ihren Kommentar,

@MartinNuc ist richtig Sie können wählen, jede Aussage der mysql-Client-Druck machen. Oder Sie können eine zweite Sitzung öffnen und mysql> SHOW PROCESSLIST ausführen, um zu sehen, was läuft. Aber Sie interessieren sich wahrscheinlich eher für eine "prozentuale Fertigstellung" oder eine Schätzung, wie lange es dauern wird, bis die restlichen Aussagen abgeschlossen sind.

Entschuldigung, es gibt keine solche Funktion. Der mysql-Client weiß nicht, wie lange es dauern wird, um spätere Anweisungen auszuführen oder wie viele es sind. Es kann also keine aussagekräftige Schätzung geben, wie viel Zeit für die Fertigstellung benötigt wird.

+0

Danke für die Antwort Bill, bietet der von Martin erwähnte Befehl irgendeine Art von Prozessanzeige oder irgendetwas? Ich kann momentan nicht wirklich testen, da ich den aktuellen Import abbrechen müsste. – user2028856

+0

'mysql --verbose', um jeden Befehl zu sehen. Erwähnte in der Referenz http://dev.mysql.com/doc/refman/5.0/en/mysql-batch-commands.html –

+0

Bill können Sie Prozent vollständige Funktion mit Pipe View Utility haben .... zb 'sudo pv - i 1 -p -t -e DB.sql | mysql -uDB_USER -p DBANAME' – abhi

45

Jungs in Bezug auf die Zeit für den Import von großen Dateien am wichtigsten dauert es mehr Zeit ist, weil die Standardeinstellung von mysql ist "autocommit = true", müssen Sie dies vor dem Importieren der Datei und dann überprüfen, wie Import wie ein Edelstein funktioniert. ..

First open MySQL:

mysql -u root -p

Dann Sie müssen nur folgende Arten tun:

mysql>use your_db

mysql>SET autocommit=0 ; source the_sql_file.sql ; COMMIT ;

+0

Das ist sehr cooooool. Ich mag das. Ein Stück Information auch. Sammeln Sie alle SQL-Dateien mit einer einzigen SQL-Datei: cat * .sql >> all_data.sql Das ist sehr nützlich. Ich importiere jetzt eine 3.5G-Datei :) Vergessen Sie nicht, dass Tabellen MyIsam sein müssen. – kodmanyagha

+0

Tabelle xxx wird nicht beendet ... warum –

+0

Wird Autocommit nicht unterstützt, um nach dem Import wieder auf 'SET autocommit = 1;' zurückzusetzen? – machineaddict

0

Die Lösung, die ich für große SQL-Wiederherstellung verwende, ist ein mysqldumpsplitter-Skript. Ich habe meine sql.gz in einzelne Tabellen aufgeteilt. Laden Sie dann etwas wie MySQL Workbench und verarbeiten Sie es als eine Wiederherstellung in das gewünschte Schema.

Hier das Skript https://github.com/kedarvj/mysqldumpsplitter

ist und das funktioniert für größere SQL-Wiederherstellungen, mein Durchschnitt auf einer Seite, die ich mit der Arbeit ist eine 2,5 GB sql.gz Datei, unkomprimiert 20 GB und 100 GB ~ einmal voll

restauriert
Verwandte Themen