Sehr grosse Dateien mit phpMyAdmin importieren
lima-city → Forum → Programmiersprachen → PHP, MySQL & .htaccess
anpassen
anzahl
apache
code
dank
datei
datenbank
datum
funktion
hilfe
importieren
limit
nachname
not
null
person
problem
tabelle
url
vorname
-
Ich habe das Problem, dass ich zwei sehr grosse Datenbanken im CSV-Format habe. Diese speichere ich derzeit lokal auf meinem PC. Ich möchte diese nun nutzen und beide in zwei verschiedene Tabellen der selben Datenbank importieren. Ich habbe die beiden Tabellen in der Datenbank erstellt, funktioniert Prima. Nun möchte ich nur noch die Daten aus den Dateien importieren. Ich dachte miur, dass das doch kein Problem sein kann und habe versucht die importieren-Funktion zu verwenden. Jedoch kam dann nur die Meldung, dass die Datei wohl zu gross sei. Weiss jemand, was es noch für andere Möglichkeiten gäbe?
-
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage
-
Ich schmeiß mal verschiedene Ideen in den Raum:
1. Die Dateien auftrennen in kleinere Teile.
2. Das Upload-Limit erhöhen, z.B. mit einer lokalen PHPMyAdmin Instanz und damit direkt auf die Lima-City DB zugreifen.
3. Ein eigenes (PHP-)Skript schreiben, das die Daten aus der CSV-Datei liest und in die Datenbank übernimmt.
Nur, um eine Vorstellung zu bekommen: Wie groß sind denn nun die CSV-Dateien? Also gemeint ist die Dateigröße und/oder die Anzahl der Datensätze. -
Zu 2.:
Ich hatte mir überlegt, lokal z.B. einen Apache mit PHPMyAdmin aufzusetzen. Du kannst dann das Upload-Limit in Apache und PHP (wo es vermutlich Probleme macht) selbst definieren und darüber die großen Dateien direkt in die externe DB bei Lima-City einspielen. Ich bin mir jedoch nicht sicher, wie es dabei mit der Performance aussieht, weil die Datenbankverbindung über eine große Strecke mit womöglich hohen Latenzen aufgebaut ist.
Zu 3.:
Du könntest per FTP die CSV-Datei auf den Webserver laden und ein PHP-Skript schreiben, das die CSV-Datei zeilenweise liest, parst (also die einzelnen Datenfelder extrahiert) und dann blockweise, z.B. immer 100 Datensätze gemeinsam in die DB einspielt.
Zum Parsen der CSV-Datei gibt es wohl in PHP bereits Funktionen, jedoch habe ich damit keine Erfahrung.
https://secure.php.net/manual/de/function.fgetcsv.php
Und das Einfügen in die Datenbank geht mit MySqli oder PDO.
Die genaue Implementierung hängt dann von dem Aufbau der Tabellen und der CSV-Dateien ab. -
Ich würde zur dritten Variante tendieren, ich habe die Dateien auch bereits auf dem Webserver. Jedoch kann ich mir immer noch nicht ganz vorstellen, wie ein solches Skript aussehen müsste. Kann man mir da vielleicht noch etwas konkreter helfen?
-
Gut, ich hab den Fall einmal an einem einfachen Beispiel nachgestellt.
Folgende CSV-Datei ist gegeben:
Falls du in deiner Datei als erste Zeile Überschriften hast, solltest du diese entfernen oder in PHP extra behandeln.1,Max,Mustermann 2,Karl,Otto 3,Friedrich,Schmidt
Nun habe ich folgende SQL-Tabelle erstellt:
CREATE TABLE `personen` ( `id` int(10) unsigned NOT NULL AUTO_INCREMENT, `vorname` varchar(50) COLLATE utf8_unicode_ci NOT NULL, `nachname` varchar(50) COLLATE utf8_unicode_ci NOT NULL, PRIMARY KEY (`id`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
Und jetzt kommt der PHP-Code, der die Daten hier einträgt:
<?php // SQL Zugangsdaten $db = new PDO("mysql:host=localhost;dbname=db12345", "db-user", "db-password"); // CSV Dateiname $csv_file = fopen("./data.csv", "r"); function bulk_insert($db, $dataset) { $values = implode(",", $dataset); // Spaltennamen anpassen $query = "INSERT INTO personen (id, vorname, nachname) VALUES $values;"; $db->query($query); } $lnr = 1; $dataset = []; // Anzahl der Spalten anpassen $expectedcolumns = 3; while (($line = fgetcsv($csv_file)) !== false) { if (count($line) == $expectedcolumns) { $fields = []; foreach ($line as $field) { $fields[] = $db->quote($field); } $dataset[] = "(" . implode(",", $fields) . ")"; if (count($dataset) >= 100) { bulk_insert($db, $dataset); $dataset = []; } } else { echo "Error on line $lnr: Expected $expectedcolumns columns but found " . count($line) . "\n"; } $lnr++; } if (count($dataset) > 0) { bulk_insert($db, $dataset); } fclose($csv_file);
Die wichtigen Stellen im Skript, an denen du noch etwas anpassen musst, habe ich kommentiert.
Ich hoffe, ich konnte damit weiter helfen. -
Früher gab es für solche Sachen mal den MySQL-Dumper. Der wird leider nicht mehr gepflegt. Angeblich soll aber diese Version
https://github.com/DSB/MySQLDumper
an PHP 7 angepasst sein.
Dann gibt es noch BigDump
https://www.ozerov.de/bigdump/ -
Danke für die Hilfe, ich habe das Skriptbeispiel verwendet (an den angegebenen Stellen angepasst) und das hat Prima geklappt. Meine Datenbanken sind nun auf dem MYSQL-Server, funktioniert genau wie geplant.
Danke allen beteiligten für die Hilfe und noch einen schönen Tag
Beitrag zuletzt geändert: 16.7.2018 16:58:49 von na-web -
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage