MySQL local_infile OFF

  • Nabend zusammen,

    ich wollte eine txt in phpMyAdmin importieren:


    LOAD DATA LOCAL INFILE '\tmp\sql.txt' INTO TABLE netcup LINES TERMINATED BY '\r\n' (`forum`);

    Leider bekomme ich eine Fehlermeldung, da local_infile im Webhosting deaktiviert ist:

    Zitat von phpMyAdmin

    #3948 - Loading local data is disabled; this must be enabled on both the client and server sides

    Wie kann ich das am besten lösen? Gibt es einen Workaround?

    Bud

    [RS] 2000 G9 | Cyber Quack

    [VPS] 1000 G9 | 200 G8 | Secret | A | mikro G11s | 4x nano G11s
    [WH] 2x 8000 SE | 4000 SE | 2000 SE

    Einmal editiert, zuletzt von Bud ()

  • Es geht ums Webhosting?


    Workaround: Zum Beispiel mit PHP Zeile für Zeile einlesen und in die DB schreiben. Das sollte mit wenigen Zeilen Code lösbar sein.

    "Wer nur noch Enten sieht, hat die Kontrolle über seine Server verloren." (Netzentenfund)

  • Es geht ums Webhosting?

    Yes, habs mal in den Ursprungsbeitrag reineditiert.

    Workaround: Zum Beispiel mit PHP Zeile für Zeile einlesen und in die DB schreiben. Das sollte mit wenigen Zeilen Code lösbar sein.

    Das sind aber rund 2.000.000 Zeilen, denke nicht das die PHP-Ressourcen eines Webhostings dafür ausreichen, zumindest nicht in einem rutsch.
    Da müsste ich die Datei wenn dann vorher manuell splitten, richtig? Wenn ja, wie viele Zeilen sollten es maximal sein?

    [RS] 2000 G9 | Cyber Quack

    [VPS] 1000 G9 | 200 G8 | Secret | A | mikro G11s | 4x nano G11s
    [WH] 2x 8000 SE | 4000 SE | 2000 SE

  • ich wollte eine txt in phpMyAdmin importieren:

    Wie sieht die TXT aus? Ist es evtl. bereits eine .sql Datei, nur mit falscher Endung?

    (Datei besteht aus SQL Statements)


    Falls ja, umbenennen und nochmal hochladen.

    Falls nein, kannst du die Datei nochmal aus der Quelle als .sql exportieren?

    Was ist die Quelle eigentlich?

  • die globale setting "local_infile" ist bei webhostings üblicherweise "off".

    aber ein normaler import sollte doch trotzdem möglich sein.


    edit: heijeijei, lahme ente.

    »Hauptsache BogoMIPS!«

    Fleischfresser

    3 Mal editiert, zuletzt von Olivetti ()

    Ente gut, alles gut 2
  • Die Datei ist eine TXT, auch ursprünglich. Eine Keyword-Datenbank, wenn man so will. In jeder Zeile steht ein Wort.

    Zitat von TXT Datei

    Bud

    Spencer
    Terence
    Hill

    Netcup
    Webhosting
    [...]

    [RS] 2000 G9 | Cyber Quack

    [VPS] 1000 G9 | 200 G8 | Secret | A | mikro G11s | 4x nano G11s
    [WH] 2x 8000 SE | 4000 SE | 2000 SE

  • Ich philosophier mal ein bisschen: Evtl. mit sed (Linux Kommando) aus jedem Keyword ein Insert Into Statement machen.

    Was sagen die anderen dazu?


    Ansonsten mit PHPMyAdmin in eine lokale Datenbank importieren (Xampp? Wamp) und wieder als SQL exportieren.

  • Da ich leider kein Linux habe, und mich damit auch nicht auskenne, habe ich es über einen XAMPP versucht. Aber leider bekomme ich immer den gleichen Fehler:

    Versuch 1: Fehlgeschlagen.


    -> SET GLOBAL local_infile = true;

    -> SHOW GLOBAL VARIABLES LIKE 'local_infile';

    -> local_infile | ON

    Versuch 2: Fehlgeschlagen

    -> hinzufügen von mysqli.allow_local_infile = On in der php.ini

    Versuch 3: Fehlgeschlagen

    [RS] 2000 G9 | Cyber Quack

    [VPS] 1000 G9 | 200 G8 | Secret | A | mikro G11s | 4x nano G11s
    [WH] 2x 8000 SE | 4000 SE | 2000 SE

  • Das sind aber rund 2.000.000 Zeilen, denke nicht das die PHP-Ressourcen eines Webhostings dafür ausreichen, zumindest nicht in einem rutsch.

    Drei Ideen dazu:

    • PHP-CLI (SSH) verwenden, da gelten andere Limits.
    • DB-Server extern (vom PC aus) ansprechen.
    • Einfach in einer Schleife <n> Zeilen überspringen, um fortzusetzen.


    Ich philosophier mal ein bisschen: Evtl. mit sed (Linux Kommando) aus jedem Keyword ein Insert Into Statement machen.

    Klingt gut, ebenfalls eine nette Idee! :thumbup:


    Das könnte man dann über SSH direkt an den "mysql" Befehl verfüttern. Nur das Escapen könnte je nach Dateiinhalt nervend werden.

    "Wer nur noch Enten sieht, hat die Kontrolle über seine Server verloren." (Netzentenfund)

    Gefällt mir 2
  • den indianer auch restartet?

    Yes

    PHP-CLI (SSH) verwenden, da gelten andere Limits.
    DB-Server extern (vom PC aus) ansprechen.
    Einfach in einer Schleife <n> Zeilen überspringen, um fortzusetzen.

    Übersteigen alle mein Know-How, aber dann musst ich das wohl oder übel für diese Kleinigkeit erweitern...

    [RS] 2000 G9 | Cyber Quack

    [VPS] 1000 G9 | 200 G8 | Secret | A | mikro G11s | 4x nano G11s
    [WH] 2x 8000 SE | 4000 SE | 2000 SE

  • Übersteigen alle mein Know-How, aber dann musst ich das wohl oder übel für diese Kleinigkeit erweitern...

    Vielleicht hilft Dir als Inspiration dieses Script: gist.github.com/205655d572261aca6e25b18433c6b38c


    Das importiert eigentlich auch nur jeweils eine Zeile (max. 64 Byte) aus einer Textdatei in eine MySQL-Tabelle. Zusätzlich prüft es (prinzipiell sogar ohne Index!), ob der Eintrag schon vorhanden ist und kann mit dem ersten Argument beliebig viele Zeilen überspringen. Könnte man wahrscheinlich relativ einfach für Deinen konkreten Fall umbauen…

    "Wer nur noch Enten sieht, hat die Kontrolle über seine Server verloren." (Netzentenfund)

    Einmal editiert, zuletzt von KB19 ()

  • Danke H6G für das Angebot! Allerdings werde ich das die nächsten Monate noch mehrfach brauchen, und da möchte ich dir nicht jedes mal auf die Nerven gehen ;) Ich finde es ehrlich gesagt schon eine krasse Einschränkung wenn ich in meine eigenen DB´s nichts importieren kann. Wäre die Aktivierung des local_infile auf den Webhostings ein so großes Sicherheitsrisiko?

    Ich habe mir cygwin runtergeladen und deinen Befehl ausprobiert, allerdings werde ich nicht ganz schlau daraus. Als Ausgabe bekomme ich folgendes (letzten 3 Zeilen):

    pasted-from-clipboard.png


    Bis auf das letzte INSERT sind alle abgeschnitten, und die Klammern sowie Semikolons in der falschen Zeile - macht das was?
    Außerdem kann ich keine Ausgabe in einer txt finden oder ähnliches. Und die Ausgabe im cygwin-Fenster ist ja nicht mal ein Bruchteil, also zumindest die, welche man am Ende sieht.


    Edit: Der von mir verwendete Befehl:
    sed -n -e "{s|^|INSERT INTO netcup ('forum') VALUES ( |};" -e "{s|$| );|};p" sql.txt

    [RS] 2000 G9 | Cyber Quack

    [VPS] 1000 G9 | 200 G8 | Secret | A | mikro G11s | 4x nano G11s
    [WH] 2x 8000 SE | 4000 SE | 2000 SE

    Einmal editiert, zuletzt von Bud ()

  • Ich habe mir cygwin runtergeladen und deinen Befehl ausprobiert, allerdings werde ich nicht ganz schlau daraus. Als Ausgabe bekomme ich folgendes (letzten 3 Zeilen):

    Das kann an den Zeilenenden liegen. Unter Windows wird \r\n als Ende verwendet, unter Linux \n

    Passiert das weiterhin, wenn du die Keyworddatei vorher mit dos2unix bearbeitest?


    Alternativ kannst du bei sed mit -i die Originaldatei überschreiben lassen oder die Ausgabe mit > new_file.sql am Ende in eine andere Datei schreiben lassen und es handelt sich nur um einen Darstellungsfehler.


    Edit:


    Evtl. erinnerst du dich noch an die Schreibmaschine. ASCII ist nichts anderes, als eine Schreibmaschine fernzusteuern (Tele TypeWriter - TTY)

    Das Steuerzeichen \r sorgt dafür, dass der Schlitten zurückfährt auf die Anfangsposition (Carriage Return)
    Das Steuerzeichen \n sorgt dafür, dass das Papier weiter geschoben wird.


    Windows setzt da historisch noch auch \r\n

  • Mal ne andere doofe Frage - was wäre denn mit irgendeinem Clienttool zum Datenimport? Mysql Workbench zum Beispiel?

    Ich nutze Datagrip und bilde mir ein dass hat da durchaus einiges an Funktionen um sich über einen SSH Tunnel auf die Datenbank zu verbinden (wobei man bei netcup die externe Erreichbarkeit der DB ja auch anschalten könnte) und dann Daten zu importieren.

  • Müsste glaub auch mit großen Dateien zurecht kommen.

    Falls es abricht kann man das Script mit ?line=123 number von der letzten gelesenen Zeile aufrufen.

    (Übung für Codejam :-D)