Ralph: Richtige Anwendung der Optionen zu mysqldump

Nachdem ich mich bei 1und1 vergeblich mit "SELECT INTO OUTFILE" herumgequält habe, bin ich auf folgenden Hinweis im Hilfecenter gestoßen:

http://hilfe-center.1und1.de/sp-service/sofort_hilfe_faq/technische_fragen/web_hosting/datenbanken/mysql/7.html

Ich habe also dann versucht, meine Daten mit folgendem Befehl zu exportieren:

<?php
systemusr/bin/mysqldump --host=dbXX.kundenserver.de --password=XYZ --user=dbo12345678 db12345678 tabelle > dump.sql");
?>

Das hat auch geklappt, aber der Dump soll CSV-Format haben.

Nun gibt es dafür lt. http://dev.mysql.com/doc/refman/5.0/en/mysqldump.html verschiedene Optionen, die eine Ausgabe im CSV-Format bewirken sollen.
Was auch immer ich davon ausprobiere, es klappt aber einfach nicht, z.B.

system("/usr/bin/mysqldump --fields-terminated-by=; --lines-terminated-by=\n --host=dbXX.kundenserver.de --password=XYZ --user=dbo12345678 db12345678 tabelle > dump.sql");

Die Datei dump.txt ist immer leer. Kann mir irgendeiner sagen, was ich falsch mache bzw. wie der Befehl aussehen muss?

Danke im Voraus.

  1. echo $begrüßung;

    Was auch immer ich davon ausprobiere, es klappt aber einfach nicht, z.B.

    system("/usr/bin/mysqldump --fields-terminated-by=; --lines-terminated-by=\n --host=dbXX.kundenserver.de --password=XYZ --user=dbo12345678 db12345678 tabelle > dump.sql");

    Auch die Unix-Shell ist ein Kontext, der bestimmte Regeln kennt. Man kann da nicht einfach beliebige Zeichen reinkippen, besonders dann nicht, wenn sie eine Sonderbedeutung haben, wie das Semikolon als Befehle-Trennzeichen oder ein NewLine-Zeichen. Das \n wird in einem ""-String bereits von PHP konsumiert. Wenn du diese beiden Zeichen einzeln im String stehen haben möchtest, musst du das \ als \ notieren. Außerdem müsste escapeshellcmd() helfen, um die Parameterwerte kontextgerecht zu behandeln.

    echo "$verabschiedung $name";

    1. Hi,

      Außerdem müsste escapeshellcmd() helfen, um die Parameterwerte kontextgerecht zu behandeln.

      Danke für den Hinweis.

      Es sieht jetzt so aus, klappt aber genausowenig:

      system(escapeshellcmd("/usr/bin/mysqldump -T --fields-terminated-by=; --lines-terminated-by=\n --host=dbXX.kundenserver.de --password=XYZ --user=dbo12345678 db12345678 tabelle") . " > dump.sql");

      Die Datei erstellt er, aber sie ist immer leer.

      Wenn ich es wie nachfolgend schreibe funktioniert es, aber die Datei enthält keine tabulatorgetrennten Werte sondern eine Auflistung von SQL-Anweisungen:

      system(escapeshellcmd("/usr/bin/mysqldump --host=dbXX.kundenserver.de --password=XYZ --user=dbo12345678 db12345678 tabelle") . " > dump.sql");

      Also muss bei den Optionswerten zur tabulatorgetrennten Ausgabe irgendetwas falsch sein, also irgendwo bei -T --fields-terminated-by=; --lines-terminated-by=\n, natürlich escaped per escapeshellcmd, s.o.

      Vielleicht noch jemand eine Idee?

      Danke im Voraus.

      Ralph.

      1. echo $begrüßung;

        Es sieht jetzt so aus, klappt aber genausowenig:
        system(escapeshellcmd("/usr/bin/mysqldump -T --fields-terminated-by=; --lines-terminated-by=\n --host=dbXX.kundenserver.de --password=XYZ --user=dbo12345678 db12345678 tabelle") . " > dump.sql");

        Der Parameter -T erwartet einen Pfad als Argument. \n wird, wie ich schon schrieb, immer noch von PHP ausgewertet und wird zum Byte 0A. escapeshellcmd() setzt dem nur einen Backslash voran. Möglicherweise kommt das nicht unbeschadet bei mysqldump an, vielleicht aber auch doch. Das Hauptproblem wird jedoch das gleiche wie bei SELECT INTO OUTFILE sein, das du ja nicht weiter erläutert hast. Da aber mysqldump mit -T auch nur SELECT INTO OUTFILE aufruft, benötigt es, wie im Handbuch erwähnt das FILE-Privileg, was du nicht haben wirst und die von dir erwähnte 1&1-Hifeseite implizit bestätigt.

        echo "$verabschiedung $name";